|
--- |
|
license: mit |
|
datasets: |
|
- custom |
|
metrics: |
|
- mean_squared_error |
|
- mean_absolute_error |
|
- r2_score |
|
model_name: Fertilizer Recommendation System |
|
tags: |
|
- random-forest |
|
- regression |
|
- multioutput |
|
- classification |
|
- agriculture |
|
- soil-nutrients |
|
--- |
|
|
|
# Fertilizer Recommendation System |
|
|
|
## Overview |
|
|
|
This model predicts the fertilizer requirements for various crops based on input features such as crop type, target yield, field size, and soil properties. It utilizes a combination of Random Forest Regressor and Random Forest Classifier to predict both numerical values (e.g., nutrient needs) and categorical values (e.g., fertilizer application instructions). |
|
|
|
## Training Data |
|
|
|
The model was trained on a custom dataset containing the following features: |
|
|
|
- Crop Name |
|
- Target Yield |
|
- Field Size |
|
- pH (water) |
|
- Organic Carbon |
|
- Total Nitrogen |
|
- Phosphorus (M3) |
|
- Potassium (exch.) |
|
- Soil moisture |
|
|
|
The target variables include: |
|
|
|
**Numerical Targets**: |
|
- Nitrogen (N) Need |
|
- Phosphorus (P2O5) Need |
|
- Potassium (K2O) Need |
|
- Organic Matter Need |
|
- Lime Need |
|
- Lime Application - Requirement |
|
- Organic Matter Application - Requirement |
|
- 1st Application - Requirement (1) |
|
- 1st Application - Requirement (2) |
|
- 2nd Application - Requirement (1) |
|
|
|
**Categorical Targets**: |
|
- Lime Application - Instruction |
|
- Lime Application |
|
- Organic Matter Application - Instruction |
|
- Organic Matter Application |
|
- 1st Application |
|
- 1st Application - Type fertilizer (1) |
|
- 1st Application - Type fertilizer (2) |
|
- 2nd Application |
|
- 2nd Application - Type fertilizer (1) |
|
|
|
## Model Training |
|
|
|
The model was trained using the following steps: |
|
|
|
1. **Data Preprocessing**: |
|
- Handling missing values |
|
- Scaling numerical features using `StandardScaler` |
|
- One-hot encoding categorical features |
|
|
|
2. **Modeling**: |
|
- Splitting the dataset into training and testing sets |
|
- Training a `RandomForestRegressor` for numerical targets using a `MultiOutputRegressor` |
|
- Training a `RandomForestClassifier` for categorical targets using a `MultiOutputClassifier` |
|
|
|
3. **Evaluation**: |
|
- Evaluating the models using the test set with metrics like Mean Squared Error (MSE), Mean Absolute Error (MAE), and R-squared (R2) Score for regression, and accuracy for classification. |
|
|
|
## Evaluation Metrics |
|
|
|
The model was evaluated using the following metrics: |
|
|
|
- Mean Squared Error (MSE) |
|
- Mean Absolute Error (MAE) |
|
- R-squared (R2) Score |
|
- Accuracy for categorical targets |
|
|
|
## How to Use |
|
|
|
### Input Format |
|
|
|
The model expects input data in JSON format with the following fields: |
|
|
|
- "Crop Name": String |
|
- "Target Yield": Numeric |
|
- "Field Size": Numeric |
|
- "pH (water)": Numeric |
|
- "Organic Carbon": Numeric |
|
- "Total Nitrogen": Numeric |
|
- "Phosphorus (M3)": Numeric |
|
- "Potassium (exch.)": Numeric |
|
- "Soil moisture": Numeric |
|
|
|
### Preprocessing Steps |
|
|
|
1. Load your input data. |
|
2. Ensure all required fields are present and in the expected format. |
|
3. Handle any missing values if necessary. |
|
4. Scale numerical features based on the training data. |
|
5. One-hot encode categorical features (if applicable). |
|
|
|
### Inference Procedure |
|
|
|
```python |
|
from joblib import load |
|
import pandas as pd |
|
|
|
# Load the preprocessor and trained models |
|
preprocessor = load('preprocessor.joblib') |
|
numerical_model = load('numerical_model.joblib') |
|
categorical_model = load('categorical_model.joblib') |
|
|
|
# Example input data |
|
new_data = { |
|
'Crop Name': 'maize(corn)', |
|
'Target Yield': 3600.0, |
|
'Field Size': 1.0, |
|
'pH (water)': 6.1, |
|
'Organic Carbon': 11.4, |
|
'Total Nitrogen': 1.1, |
|
'Phosphorus (M3)': 1.8, |
|
'Potassium (exch.)': 3.0, |
|
'Soil moisture': 20.0 |
|
} |
|
|
|
# Preprocess the input data |
|
input_df = pd.DataFrame([new_data]) |
|
input_transformed = preprocessor.transform(input_df) |
|
|
|
# Make numerical predictions |
|
numerical_predictions = numerical_model.predict(input_transformed) |
|
|
|
# Make categorical predictions |
|
categorical_predictions = categorical_model.predict(input_transformed) |
|
|
|
# Decode categorical predictions |
|
label_encoders = {col: load(f'label_encoder_{col}.joblib') for col in categorical_targets} |
|
categorical_predictions_decoded = {col: label_encoders[col].inverse_transform(categorical_predictions[:, i]) for i, col in enumerate(categorical_targets)} |
|
|
|
# Combine predictions into a single dictionary |
|
predictions_combined = {**{col: numerical_predictions[0, i] for i, col in enumerate(numerical_targets)}, **categorical_predictions_decoded} |
|
|
|
print("Predicted Fertilizer Requirements:") |
|
for col, pred_value in predictions_combined.items(): |
|
print(f"{col}: {pred_value}") |
|
|