Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save skilfoy/dd32e79c06c103d86bd11a396d38011a to your computer and use it in GitHub Desktop.
Save skilfoy/dd32e79c06c103d86bd11a396d38011a to your computer and use it in GitHub Desktop.
Sowing Success - Using Machine Learning to Help Farmers Select the Best Crops.ipynb
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/skilfoy/dd32e79c06c103d86bd11a396d38011a/sowing-success-using-machine-learning-to-help-farmers-select-the-best-crops.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"source": [
"# Sowing Success: Using Machine Learning to Help Farmers Select the Best Crops"
],
"metadata": {
"id": "T9i4L7iEBiAi"
},
"id": "T9i4L7iEBiAi"
},
{
"cell_type": "markdown",
"source": [
"![farmer_in_a_field.jpg](data:image/jpeg;base64,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)"
],
"metadata": {
"id": "TpUb3xNdBbCO"
},
"id": "TpUb3xNdBbCO"
},
{
"source": [
"Measuring essential soil metrics such as nitrogen, phosphorous, potassium levels, and pH value is an important aspect of assessing soil condition. However, it can be an expensive and time-consuming process, which can cause farmers to prioritize which metrics to measure based on their budget constraints.\n",
"\n",
"Farmers have various options when it comes to deciding which crop to plant each season. Their primary objective is to maximize the yield of their crops, taking into account different factors. One crucial factor that affects crop growth is the condition of the soil in the field, which can be assessed by measuring basic elements such as nitrogen and potassium levels. Each crop has an ideal soil condition that ensures optimal growth and maximum yield.\n",
"\n",
"A farmer has reached out for expert ML assistance in selecting the best crop for his field. He's provided you with a dataset called `soil_measures.csv`, which contains:\n",
"\n",
"- `\"N\"`: Nitrogen content ratio in the soil\n",
"- `\"P\"`: Phosphorous content ratio in the soil\n",
"- `\"K\"`: Potassium content ratio in the soil\n",
"- `\"pH\"` value of the soil\n",
"- `\"crop\"`: categorical values that contain various crops (target variable).\n",
"\n",
"Each row in this dataset represents various measures of the soil in a particular field. Based on these measurements, the crop specified in the `\"crop\"` column is the optimal choice for that field. \n",
"\n",
"In this project, we will build multi-class classification models to predict the type of `\"crop\"` and identify the single most importance feature for predictive performance."
],
"metadata": {
"id": "d3d001b0-2e2f-4b58-8442-99520bad831f"
},
"id": "d3d001b0-2e2f-4b58-8442-99520bad831f",
"cell_type": "markdown"
},
{
"source": [
"import pandas as pd\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn import metrics\n",
"from sklearn.metrics import f1_score"
],
"metadata": {
"id": "d0eb4f16-5a99-460d-a5ba-706b7ef0bbe7",
"executionTime": 11,
"lastSuccessfullyExecutedCode": "import pandas as pd\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.model_selection import train_test_split\nfrom sklearn import metrics\nfrom sklearn.metrics import f1_score",
"executionCancelledAt": null,
"lastExecutedAt": 1713927001949,
"lastScheduledRunId": null,
"lastExecutedByKernel": "df6198fd-03de-45ab-ab25-e5c5f3c1b27b"
},
"id": "d0eb4f16-5a99-460d-a5ba-706b7ef0bbe7",
"cell_type": "code",
"execution_count": null,
"outputs": []
},
{
"source": [
"## Load Data and Perform Exploratory Analysis\n",
"\n",
"In this section, we load the dataset `soil_measures.csv` which contains essential soil metrics and crop type data for various fields. The metrics include Nitrogen (N), Phosphorous (P), Potassium (K), and pH levels—key indicators of soil health. We use these to predict the optimal crop ('crop' column) for each field. The first task is to inspect the first few rows of our dataset with `crops.head()` to understand the structure and types of data we're working with. Following this, we check for missing values to ensure the quality and completeness of our data, which is crucial for accurate model predictions."
],
"metadata": {
"id": "58570775-b185-46cf-a725-352b0ed79a71"
},
"cell_type": "markdown",
"id": "58570775-b185-46cf-a725-352b0ed79a71"
},
{
"source": [
"# Load the dataset\n",
"crops = pd.read_csv(\"soil_measures.csv\")\n",
"crops.head()"
],
"metadata": {
"executionCancelledAt": null,
"executionTime": 54,
"lastExecutedAt": 1713927002003,
"lastExecutedByKernel": "df6198fd-03de-45ab-ab25-e5c5f3c1b27b",
"lastScheduledRunId": null,
"lastSuccessfullyExecutedCode": "# Load the dataset\ncrops = pd.read_csv(\"soil_measures.csv\")\ncrops.head()",
"outputsMetadata": {
"0": {
"height": 186,
"type": "dataFrame"
}
},
"id": "d0745685-dc24-4b6f-a4bd-d06096845348",
"outputId": "e187e9e1-37d9-4164-a57d-6f0c60fd91fc"
},
"cell_type": "code",
"id": "d0745685-dc24-4b6f-a4bd-d06096845348",
"outputs": [
{
"output_type": "execute_result",
"data": {
"application/com.datacamp.data-table.v2+json": {
"table": {
"schema": {
"fields": [
{
"name": "index",
"type": "integer"
},
{
"name": "N",
"type": "integer"
},
{
"name": "P",
"type": "integer"
},
{
"name": "K",
"type": "integer"
},
{
"name": "ph",
"type": "number"
},
{
"name": "crop",
"type": "string"
}
],
"primaryKey": [
"index"
],
"pandas_version": "1.4.0"
},
"data": {
"index": [
0,
1,
2,
3,
4
],
"N": [
90,
85,
60,
74,
78
],
"P": [
42,
58,
55,
35,
42
],
"K": [
43,
41,
44,
40,
42
],
"ph": [
6.502985292,
7.038096361,
7.840207144,
6.980400905,
7.628472891
],
"crop": [
"rice",
"rice",
"rice",
"rice",
"rice"
]
}
},
"total_rows": 5,
"truncation_type": null
},
"text/plain": " N P K ph crop\n0 90 42 43 6.502985 rice\n1 85 58 41 7.038096 rice\n2 60 55 44 7.840207 rice\n3 74 35 40 6.980401 rice\n4 78 42 42 7.628473 rice",
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>N</th>\n <th>P</th>\n <th>K</th>\n <th>ph</th>\n <th>crop</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>90</td>\n <td>42</td>\n <td>43</td>\n <td>6.502985</td>\n <td>rice</td>\n </tr>\n <tr>\n <th>1</th>\n <td>85</td>\n <td>58</td>\n <td>41</td>\n <td>7.038096</td>\n <td>rice</td>\n </tr>\n <tr>\n <th>2</th>\n <td>60</td>\n <td>55</td>\n <td>44</td>\n <td>7.840207</td>\n <td>rice</td>\n </tr>\n <tr>\n <th>3</th>\n <td>74</td>\n <td>35</td>\n <td>40</td>\n <td>6.980401</td>\n <td>rice</td>\n </tr>\n <tr>\n <th>4</th>\n <td>78</td>\n <td>42</td>\n <td>42</td>\n <td>7.628473</td>\n <td>rice</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {},
"execution_count": 35
}
],
"execution_count": null
},
{
"source": [
"# Check for missing values\n",
"print(\"Missing values in each column:\\n\", crops.isna().sum())"
],
"metadata": {
"executionCancelledAt": null,
"executionTime": 53,
"lastExecutedAt": 1713927002056,
"lastExecutedByKernel": "df6198fd-03de-45ab-ab25-e5c5f3c1b27b",
"lastScheduledRunId": null,
"lastSuccessfullyExecutedCode": "# Check for missing values\nprint(\"Missing values in each column:\\n\", crops.isna().sum())",
"outputsMetadata": {
"0": {
"height": 164,
"type": "stream"
}
},
"id": "cd7cffa5-1dd7-402e-91ff-1f9a792e7591",
"outputId": "f62fc5ed-fc4a-4cc6-9b1b-d995f780aed9"
},
"cell_type": "code",
"id": "cd7cffa5-1dd7-402e-91ff-1f9a792e7591",
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": "Missing values in each column:\n N 0\nP 0\nK 0\nph 0\ncrop 0\ndtype: int64\n"
}
],
"execution_count": null
},
{
"source": [
"# Check unique values in 'crop'\n",
"print(\"Unique crop types:\", crops['crop'].unique())"
],
"metadata": {
"executionCancelledAt": null,
"executionTime": 47,
"lastExecutedAt": 1713927002103,
"lastExecutedByKernel": "df6198fd-03de-45ab-ab25-e5c5f3c1b27b",
"lastScheduledRunId": null,
"lastSuccessfullyExecutedCode": "# Check unique values in 'crop'\nprint(\"Unique crop types:\", crops['crop'].unique())",
"outputsMetadata": {
"0": {
"height": 164,
"type": "stream"
}
},
"id": "f3757346-b919-4a17-b2cc-ba064b66d5d4",
"outputId": "4aea943a-cb03-4a50-efb8-537a0d2ec988"
},
"cell_type": "code",
"id": "f3757346-b919-4a17-b2cc-ba064b66d5d4",
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": "Unique crop types: ['rice' 'maize' 'chickpea' 'kidneybeans' 'pigeonpeas' 'mothbeans'\n 'mungbean' 'blackgram' 'lentil' 'pomegranate' 'banana' 'mango' 'grapes'\n 'watermelon' 'muskmelon' 'apple' 'orange' 'papaya' 'coconut' 'cotton'\n 'jute' 'coffee']\n"
}
],
"execution_count": null
},
{
"source": [
"## Prepare the Data\n",
"\n",
"Here, we prepare our dataset for the machine learning model. This involves splitting the dataset into features (`X`) and the target variable (`y`). The `crop` column is the target that our model will learn to predict, and the remaining columns are features that provide the inputs to our model. We then split these into training and testing sets using `train_test_split`. This step is vital as it helps in validating the performance of our model on unseen data, ensuring that our predictions will be robust in practical scenarios."
],
"metadata": {
"id": "bd1a4b41-7381-4c31-b054-107d14817e95"
},
"cell_type": "markdown",
"id": "bd1a4b41-7381-4c31-b054-107d14817e95"
},
{
"source": [
"# Features and target\n",
"X = crops.drop('crop', axis=1)\n",
"y = crops['crop']\n",
"\n",
"# Splitting the dataset\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)"
],
"metadata": {
"executionCancelledAt": null,
"executionTime": 56,
"lastExecutedAt": 1713927002159,
"lastExecutedByKernel": "df6198fd-03de-45ab-ab25-e5c5f3c1b27b",
"lastScheduledRunId": null,
"lastSuccessfullyExecutedCode": "# Features and target\nX = crops.drop('crop', axis=1)\ny = crops['crop']\n\n# Splitting the dataset\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)",
"id": "0ef1dc35-2205-4fbb-acb2-5bcfbb718cf6"
},
"cell_type": "code",
"id": "0ef1dc35-2205-4fbb-acb2-5bcfbb718cf6",
"outputs": [],
"execution_count": null
},
{
"source": [
"## Evaluate Each Feature Individually\n",
"\n",
"In this critical section, we evaluate the predictive power of each soil metric individually using logistic regression, a powerful model suitable for multi-class classification. By assessing each feature (N, P, K, pH) separately, we can determine which single soil metric has the strongest relationship with crop type. We fit a logistic regression model for each feature and then predict the crop type on the test set. We use the F1-score as our metric because it considers both precision and recall, providing a balance that is particularly useful in multi-class settings where some classes might be underrepresented."
],
"metadata": {
"id": "57470448-e11f-4d85-ae9f-d0c85acde6aa"
},
"cell_type": "markdown",
"id": "57470448-e11f-4d85-ae9f-d0c85acde6aa"
},
{
"source": [
"# Dictionary to store F1 scores for each feature\n",
"feature_performance = {}\n",
"\n",
"# Evaluate each feature\n",
"for feature in ['N', 'P', 'K', 'ph']:\n",
" # Model initialization\n",
" log_reg = LogisticRegression(multi_class='multinomial', solver='lbfgs', max_iter=1000)\n",
"\n",
" # Fit model on training data for the current feature\n",
" log_reg.fit(X_train[[feature]], y_train)\n",
"\n",
" # Predict on test data\n",
" y_pred = log_reg.predict(X_test[[feature]])\n",
"\n",
" # Calculate F1 score and update dictionary\n",
" f1 = f1_score(y_test, y_pred, average='weighted')\n",
" feature_performance[feature] = f1\n",
" print(f\"F1-score for {feature}: {f1}\")"
],
"metadata": {
"executionCancelledAt": null,
"executionTime": null,
"lastExecutedAt": null,
"lastExecutedByKernel": null,
"lastScheduledRunId": null,
"lastSuccessfullyExecutedCode": null,
"outputsMetadata": {
"0": {
"height": 101,
"type": "stream"
}
},
"id": "8d26265e-152d-4f9f-843a-8d9c31abc1ce",
"outputId": "301ccef7-a3c8-41db-ea6a-fa74a0e03a38"
},
"cell_type": "code",
"id": "8d26265e-152d-4f9f-843a-8d9c31abc1ce",
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": "F1-score for N: 0.10611720057539394\nF1-score for P: 0.1301839798192734\nF1-score for K: 0.2006673728470238\nF1-score for ph: 0.06787631271947597\n"
}
],
"execution_count": null
},
{
"source": [
"## Determine the Best Predictive Feature\n",
"\n",
"After evaluating each feature, we identify which one has the highest F1-score, indicating the strongest individual predictor of crop type. This analysis helps in understanding the relative importance of each soil measure in predicting the optimal crop, which can significantly aid decision-making in agricultural planning and management."
],
"metadata": {
"id": "e70ac7f4-db48-46d2-8f65-c58c07d7dc12"
},
"cell_type": "markdown",
"id": "e70ac7f4-db48-46d2-8f65-c58c07d7dc12"
},
{
"source": [
"# Find the best predictive feature based on F1 score\n",
"best_feature = max(feature_performance, key=feature_performance.get)\n",
"best_predictive_feature = {best_feature: feature_performance[best_feature]}\n",
"\n",
"# Output the best predictive feature\n",
"print(\"Best predictive feature and score:\", best_predictive_feature)"
],
"metadata": {
"executionCancelledAt": null,
"executionTime": 52,
"lastExecutedAt": 1713927055744,
"lastExecutedByKernel": "df6198fd-03de-45ab-ab25-e5c5f3c1b27b",
"lastScheduledRunId": null,
"lastSuccessfullyExecutedCode": "# Find the best predictive feature based on F1 score\nbest_feature = max(feature_performance, key=feature_performance.get)\nbest_predictive_feature = {best_feature: feature_performance[best_feature]}\n\n# Output the best predictive feature\nprint(\"Best predictive feature and score:\", best_predictive_feature)",
"outputsMetadata": {
"0": {
"height": 38,
"type": "stream"
}
},
"id": "b46e6baa-67d7-45f6-8fe6-dc0e927d4bb7",
"outputId": "62a2f65d-6a90-493a-b865-15f2a388aac7"
},
"cell_type": "code",
"id": "b46e6baa-67d7-45f6-8fe6-dc0e927d4bb7",
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": "Best predictive feature and score: {'K': 0.2006673728470238}\n"
}
],
"execution_count": null
},
{
"cell_type": "markdown",
"source": [
"## Conclusion\n",
"\n",
"The analysis revealed that Potassium (K) content in the soil is the most predictive feature for determining the suitable crop type, with an F1-score of 0.2007. This suggests that among the soil measures, potassium levels are most closely linked to crop suitability, highlighting its critical role in crop nutrient management and soil fertility.\n",
"\n",
"**Lessons Learned:**\n",
"The approach demonstrated the value of machine learning in precision agriculture, specifically in optimizing crop selection based on simple soil measures. However, the relatively low F1-scores across all features suggest that a single soil metric might not be sufficient to accurately predict crop type, indicating the complex interplay of factors that influence crop growth.\n",
"\n",
"**Future Research:**\n",
"Further research could explore models that incorporate multiple features simultaneously, potentially improving predictive performance. Additionally, integrating other soil characteristics, such as organic matter content and moisture levels, or even climatic conditions, could provide a more holistic view and substantially enhance the model's accuracy. Engaging in feature engineering and more advanced machine learning models like Random Forests or Gradient Boosting Machines could also yield better predictions and insights into the relationships between soil conditions and crop viability."
],
"metadata": {
"id": "QzvWJMOoCRja"
},
"id": "QzvWJMOoCRja"
},
{
"cell_type": "code",
"source": [],
"metadata": {
"id": "xlBqy2OsCZVy"
},
"id": "xlBqy2OsCZVy",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"colab": {
"provenance": [],
"include_colab_link": true
},
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment