SIH-Crop-Yield-API / scripts /results_summary.py
AshrafGalibSk's picture
Upload folder using huggingface_hub
bbd5f9c verified
Raw
History Blame Contribute Delete
7.2 kB
#!/usr/bin/env python3
"""
Crop Yield Prediction ML Pipeline - Results Summary
This script provides a comprehensive summary of the machine learning pipeline results.
"""
import pandas as pd
import os
from datetime import datetime
def print_header(title, char="=", length=70):
"""Print a formatted header."""
print("\n" + char * length)
print(f" {title} ")
print(char * length)
def print_section(title, char="-", length=50):
"""Print a formatted section header."""
print(f"\n{char * length}")
print(f"{title}")
print(char * length)
def load_and_display_results():
"""Load and display the training results."""
print_header("🌾 CROP YIELD PREDICTION ML PIPELINE - RESULTS SUMMARY 🌾")
print(f"πŸ“… Generated on: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
# Check if results exist
results_file = "trained_models/model_results.csv"
if not os.path.exists(results_file):
print("❌ Results file not found. Please run the training pipeline first.")
return
# Load results
results_df = pd.read_csv(results_file)
print_section("πŸ“Š MODEL PERFORMANCE COMPARISON")
print("\nTraining Results:")
print(results_df.to_string(index=False, float_format='%.4f'))
# Determine best model
best_model = results_df.loc[results_df['Test RΒ²'].idxmax()]
print_section("πŸ† BEST PERFORMING MODEL")
print(f"Model: {best_model['Model']}")
print(f"Test RMSE: {best_model['Test RMSE']:.4f}")
print(f"Test MAE: {best_model['Test MAE']:.4f}")
print(f"Test RΒ²: {best_model['Test RΒ²']:.4f}")
print(f"Training Time: {best_model['Training Time (s)']:.2f} seconds")
def show_dataset_info():
"""Display dataset information."""
print_section("πŸ“‹ DATASET INFORMATION")
if os.path.exists("combined_crop_data.csv"):
df = pd.read_csv("combined_crop_data.csv")
print(f"Total Records: {len(df):,}")
print(f"Features: {df.shape[1]}")
print(f"Date Range: {df['Crop_Year'].min()} - {df['Crop_Year'].max()}")
print(f"States/UTs: {df['State'].nunique()}")
print(f"Districts: {df['District'].nunique()}")
print(f"Crops: {df['Crop'].nunique()}")
print(f"Seasons: {df['Season'].nunique()}")
# Data completeness
valid_records = len(df[df['Yield'] > 0])
print(f"Valid Records (Yield > 0): {valid_records:,} ({valid_records/len(df)*100:.1f}%)")
def show_model_details():
"""Display model implementation details."""
print_section("πŸ€– MODEL IMPLEMENTATIONS")
print("1. 🌳 Random Forest Regression")
print(" β€’ n_estimators: 100")
print(" β€’ max_depth: 20")
print(" β€’ Implementation: scikit-learn")
print(" β€’ Training: CPU multi-threaded")
print("\n2. πŸš€ XGBoost Regression")
print(" β€’ n_estimators: 100")
print(" β€’ max_depth: 8")
print(" β€’ tree_method: hist (CPU optimized)")
print(" β€’ Implementation: XGBoost")
print("\n3. 🧠 PyTorch Neural Network")
print(" β€’ Architecture: [256, 128, 64] hidden layers")
print(" β€’ Activation: ReLU with BatchNorm")
print(" β€’ Dropout: 0.3")
print(" β€’ Optimizer: Adam")
print(" β€’ Training: GPU accelerated (CUDA)")
def show_features():
"""Display feature engineering details."""
print_section("πŸ”§ FEATURE ENGINEERING")
features = [
"Crop_Year", "Area", "Production", "Annual_Rainfall",
"Fertilizer", "Pesticide", "State_encoded", "Crop_encoded",
"District_encoded", "Area_Production_Ratio", "Yield_Area_Interaction",
"Production_Per_Area", "Season_* (one-hot encoded)"
]
print("Engineered Features:")
for i, feature in enumerate(features, 1):
print(f" {i:2d}. {feature}")
print(f"\nTotal Features: {len(features)} (including seasonal dummies)")
def show_files_generated():
"""Show all generated files."""
print_section("πŸ“ GENERATED FILES")
files_info = [
("combined_crop_data.csv", "Combined dataset (DES 2023-24 + Historical data)"),
("trained_models/", "Directory containing all trained models"),
("*.png", "Visualization plots and charts"),
("model_results.csv", "Performance comparison results"),
]
print("Generated Files:")
for file_pattern, description in files_info:
print(f" πŸ“„ {file_pattern:<30} - {description}")
# Check actual files
print("\nModel Files:")
model_files = [
"random_forest_model.pkl",
"xgboost_model.json",
"pytorch_model.pth",
"preprocessor.pkl"
]
for file in model_files:
filepath = f"trained_models/{file}"
if os.path.exists(filepath):
size = os.path.getsize(filepath) / 1024 / 1024 # MB
print(f" βœ… {file:<25} ({size:.1f} MB)")
else:
print(f" ❌ {file:<25} (Not found)")
def show_usage_examples():
"""Show how to use the trained models."""
print_section("πŸ’‘ USAGE EXAMPLES")
print("1. Load and use a trained model:")
print("""
import joblib
import pandas as pd
# Load Random Forest model
rf_model = joblib.load('trained_models/random_forest_model.pkl')
preprocessor = joblib.load('trained_models/preprocessor.pkl')
# Load new data and make predictions
new_data = pd.read_csv('your_data.csv')
X, _, _ = preprocessor.prepare_features(new_data)
X_processed = preprocessor.transform(X)
predictions = rf_model.predict(X_processed)
""")
print("2. Test models on new data:")
print("""
python test_models.py
""")
print("3. Retrain models:")
print("""
python crop_yield_ml_pipeline.py
""")
def show_performance_insights():
"""Display performance insights."""
print_section("🎯 PERFORMANCE INSIGHTS")
insights = [
"πŸ† XGBoost achieved the best overall performance (highest RΒ² score)",
"⚑ XGBoost was also the fastest to train (< 1 second)",
"🌳 Random Forest showed good performance with excellent training metrics",
"🧠 Neural Network struggled with this dataset (negative R² indicates poor fit)",
"πŸ“Š High variation in results suggests potential overfitting in some models",
"πŸ”§ Feature engineering significantly improved model performance",
"πŸ’Ύ All models are saved and ready for production use"
]
for insight in insights:
print(f" {insight}")
def main():
"""Main function to display complete summary."""
show_dataset_info()
load_and_display_results()
show_model_details()
show_features()
show_performance_insights()
show_files_generated()
show_usage_examples()
print_header("πŸŽ‰ PIPELINE COMPLETED SUCCESSFULLY! πŸŽ‰")
print("""
Next Steps:
1. Review the generated plots and visualizations
2. Test models on new data using test_models.py
3. Use the trained models for crop yield predictions
4. Consider hyperparameter tuning for better performance
5. Explore additional feature engineering opportunities
""")
if __name__ == "__main__":
main()