Python数据分析-植物生长数据分析(机器学习模型和神经网络模型)

news2024/12/23 23:33:07

一、研究背景

植物生长受多种环境因素的影响,包括土壤类型、日照时间、浇水频率、肥料类型、温度和湿度等。这些因素不仅影响植物的生长速度和健康状况,还对植物在不同生长阶段的表现有显著影响。随着气候变化和环境污染问题的加剧,研究如何优化植物生长条件以提高农作物产量和质量变得尤为重要。本研究旨在通过分析不同环境变量对植物生长里程碑的影响,找出最佳的种植条件,为农民和园艺师提供科学依据,帮助他们在不同环境下进行有效的种植管理。

二、研究意义

  • 提高农作物产量和质量:通过了解不同环境因素对植物生长的影响,可以优化种植条件,从而提高农作物的产量和质量。
  • 促进可持续农业发展:通过科学的种植管理,减少对化学肥料和过量水资源的依赖,推动农业的可持续发展。
  • 应对气候变化挑战:为应对气候变化带来的农业挑战提供数据支持,帮助制定应对极端天气和环境变化的种植策略。
  • 增强农民和园艺师的决策能力:提供具体的种植指导,帮助农民和园艺师在实际生产中做出更明智的决策,提高生产效率和经济效益。

三、实证分析

该数据集包含Growth_Milestone(目标)和一些影响它的因素 这个问题考虑为二元分类 第 1 部分: 包含对数据的一些分析,除了准备和清理数据之外的DataExplantory 第2部分: 我将使用一些传统的机器学习技术:

目标:根据提供的环境和管理因素对植物的生长里程碑进行预测和分类。 我们的目标:预测植物的生长阶段或里程碑。 特征: Soil_Type:植物生长的土壤类型或成分。 Sunlight_Hours:植物接受阳光照射的持续时间或强度。 Water_Frequency:植物浇水的频率,表示浇水时间表。 Fertilizer_Type:用于滋养植物的肥料类型。 Temperature::植物生长的环境温度条件。 Humidity:植物周围环境中的水分或湿度水平。 Growth_Milestone:指示植物生长过程中的阶段或重要事件的描述或标记。

数据和完整代码

导入包:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['KaiTi']  #中文
plt.rcParams['axes.unicode_minus'] = False   #负号
import IPython.display
from sklearn.preprocessing import LabelEncoder,StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.base import BaseEstimator , TransformerMixin
from sklearn.feature_selection import VarianceThreshold ,f_classif ,SelectKBest
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
from sklearn import tree
from sklearn.metrics import classification_report,confusion_matrix ,ConfusionMatrixDisplay
from sklearn import svm
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB

读取数据和查看其基本信息:

data=pd.read_csv("data.csv")
data.head(5)

 

获取其他信息

 

随后进行描述性统计分析

data.describe().T

 接下来查看数据类型和查看缺失值类型:

data.dtypes

data.isna().mean()

 

接下来可视化查看 GrowthMilestone的占比 


f={"family":"serif","size":25,"color":"r"}
plt.title("Animia Distribution",fontdict=f)
explicit=data["GrowthMilestone"].value_counts()
plt.pie(x=explicit,labels=["Not GrowthMilestone","GrowthMilestone"],colors=["g","r"],explode=[0.1,0],autopct='%1.1f%%')
plt.legend()
plt.show()

观察有多少个 SoilType 

plt.title("SoilType Distribution",fontdict=f)
explicit=data["SoilType"].value_counts()
plt.pie(x=explicit,labels=["clay","sandy","loam"],colors=["g","b","r"],explode=[0.2,0.1,0.1],autopct='%1.1f%%')  
plt.legend()
plt.show()

Water_Frequency = data["WaterFrequency"].value_counts()
plt.subplot(4, 4, 1)  # Create the first subplot
plt.pie(
    x=Water_Frequency,
    labels=["daily", "bi-weekly","weekly"],
    colors=["g","r","b"],
    explode=[0.1, 0,0.1],
    autopct='%1.1f%%',
    radius=2,
)                                                                     

plt.title("Water_Frequency_observation", fontdict=f1)
plt.legend()


# Plot 2

Fertilizer_Type = data["FertilizerType"].value_counts()
plt.subplot(4, 4, 2)  # Create the second subplot
plt.pie(
    x=Fertilizer_Type,
    labels=["none", "chemical","organic"],
    colors=["orange","g","y"],
    explode=[0.1, 0,0.1],
    autopct='%1.1f%%',
    radius=2,
)
plt.title("Fertilizer_Type_observation", fontdict=f1)
plt.legend()
# Adjust the spacing between subplots
plt.subplots_adjust(wspace=2,hspace=1)

#plot3:

# 观察有多少个 SoilType :


plt.subplot(4,4,3)
explicit=data["SoilType"].value_counts()
plt.pie(x=explicit,labels=["clay","sandy","loam"],colors=["g","b","r"],explode=[0.2,0.1,0.1],autopct='%1.1f%%',radius=2)  
plt.title("SoilType Distribution",fontdict=f1)
plt.legend()
plt.show()


plt.subplots_adjust(wspace=2,hspace=1)

# plot4:

# 观察有多少人拥有 GrowthMilestone:
plt.subplot(4,4,4)
plt.title("GrowthMilestone_Distribution",fontdict=f1)
explicit=data["GrowthMilestone"].value_counts()
plt.pie(x=explicit,labels=["Not GrowthMilestone","GrowthMilestone"],colors=["g","r"],explode=[0.1,0],autopct='%1.1f%%',radius=6)
plt.legend()
plt.show()

# pacing between subplots
plt.subplots_adjust(wspace=2,hspace=1)

观察每种土壤类型有多少hours_sunlght:

 

观察 Soil_Type vs. GrowthMilestone:要知道每种土壤中的植物数量:

plt.figure(figsize=(7,8))
plt.title("Distribution of GrowthMilestone vs. Soil_Type",fontdict=f)
top=data.groupby("SoilType")["GrowthMilestone"].sum().sort_values(ascending=False)
sns.barplot(x=top.index,y=top.values,color="r",palette='coolwarm')
plt.xticks(rotation=45,color="b")
plt.xlabel("Soil_Type",fontdict=f)
plt.ylabel("GrowthMilestone",fontdict=f)
plt.legend(title="Number of Grough in Every soil",prop={'size': 12})
plt.show()

 

观察 Fertilizer_Type vs.温度分布 :

 

ontinous data的分布

for col in data.select_dtypes("number"):
    
    sns.displot(data[col],color="r")
    plt.title("presention of "+ col,fontdict=f)

 

创建连续特征的对图:

plt.figure(figsize=(25, 15), dpi=300)
sns.set(style="whitegrid")  
sns.set_palette("coolwarm")   
sns.pairplot(data.select_dtypes(include='float64'), plot_kws={'alpha': 0.6, 's': 80})

 

接下来查看相关系数和热力图

corr=data.select_dtypes("number").corr()
print(corr)

print("-"*50)

kendall=data.select_dtypes("number").corr(method="kendall")
print(kendall)

print("-"*50)

spearman=data.select_dtypes("number").corr(method="spearman")
print(spearman)

print("-"*50)

pearson=data.select_dtypes("number").corr(method="pearson")
print(pearson)

print("-"*50)

# plot the correlation Matrix :

plt.figure(figsize=(25,15),dpi=200)
plt.title("Heatmap-Correlation-Matrix",fontdict=f)
sns.heatmap(data.select_dtypes("number").corr(),annot=True,fmt="0.3f",cmap='Blues')
plt.xlabel("Features",fontdict=f)
plt.ylabel("Features",fontdict=f)
plt.xticks(rotation=45,color="b")
plt.yticks(rotation=-45,color="b")
plt.show()

 

接下来划分特征和响应变量 进行模型建立和预测

# 划分X和Y
x=data.drop(columns="GrowthMilestone",axis=1)
y=data["GrowthMilestone"]
print(np.shape(x),np.shape(y))
print(len(x),len(y))
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,stratify=y,random_state=42)
print(np.shape(x_train),np.shape(x_test))
print(np.shape(y_train),np.shape(x_test))

# 随机森林模型

RC1=RandomForestClassifier(random_state=42,n_jobs=-1,max_depth=5,n_estimators=100)
RC1.fit(x_train,y_train)    

y_predict=RC1.predict(x_test)
y_predict[:10]
#提升准确率
np.random.seed()
for i in range(10,110,10):
    print(f"at n_estimators= {i} n_estimators")
    RC2=RandomForestClassifier(n_estimators=i).fit(x_train,y_train)
    print(f"accuracy={RC2.score(x_test,y_test)*100:0.2f}%")

 

 

决策树

决策树可视化

plt.figure(figsize=(15,15),dpi=100) 
tree.plot_tree(DT)
plt.title("--<<< Decision_Tree >>>--",fontdict=f)
plt.show()

 支持向量机

 使用 Tensorflow 构建神经网络模型

from tensorflow.keras import Sequential 
from tensorflow.keras.layers import Dense,Input,Dropout
from tensorflow.keras.losses import BinaryCrossentropy
from tensorflow.keras.regularizers import l2


model_r.compile(
    loss=BinaryCrossentropy(from_logits=True),
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
    metrics=["accuracy"]
  )

绘制训练历史(准确率和损失)

plt.figure(figsize=(12, 6))

# Plot training & validation accuracy values
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend(['Train', 'Test'], loc='upper left')

# Plot training & validation loss values
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend(['Train', 'Test'], loc='upper left')

plt.tight_layout()
plt.show()

 

关于机器学习模型的一些结果:

  • 1- RandomForestClassifier : accuracy -->> %58.97%并且改进模型后,我们发现 n_estimators= 20,准确率-->>64.1%,提高了5.13%
  • 2-DecissionTreeClassifier : 准确率 -->> 51.28% %
  • 3-支持向量机:准确率-->>48.72% 我们不能说最好的模型是 RandomForestClassifier 因为每个模型都有优点和缺点,但是这个个模型为我们提供了高精度。 这是我们从传统机器学习模型中得到的结果。 关于使用 Tensorflow 构建的神经网络模型,我们发现:准确率--->> 67.66%,改进后相同。

四、结论

通过对数据的分析,我们发现了以下几点关键结论:

  1. 土壤类型和植物生长:不同土壤类型对植物生长的影响显著,某些土壤类型在特定条件下能够显著促进植物的生长。
  2. 日照时间和水分管理:适当的日照和科学的水分管理能够显著提高植物的生长里程碑达到率,避免了过多或过少的水分对植物造成的负面影响。
  3. 肥料类型和植物健康:有机肥料相比化学肥料,对植物生长的促进作用更加显著,且对环境更加友好。
  4. 环境温湿度的影响:温度和湿度对植物生长具有综合性影响,在适宜的温湿度条件下,植物的生长里程碑达到率最高。

这些研究结论为农作物种植和管理提供了科学依据,有助于在不同环境条件下进行精准农业操作,提升农业生产效率和可持续发展水平。

创作不易,希望大家多点赞关注评论!!!(类似代码或报告定制可以私信)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1931086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【NLP实战】基于TextCNN的新闻文本分类

TextCNN文本分类在pytorch中的实现 基于TextCNN和transformers.BertTokenizer的新闻文本分类实现&#xff0c;包括训练、预测、数据加载和准确率评估。 目录 项目代码TextCNN网络结构相关模型仓库准备工作项目调参预测与评估 1.项目代码 https://github.com/NeoTse0622/Te…

数电基础 - 硬件描述语言

目录 一. 简介 二. Verilog简介和基本程序结构 三. 应用场景 四. Verilog的学习方法 五.调式方法 一. 简介 硬件描述语言&#xff08;Hardware Description Language&#xff0c;HDL&#xff09;是用于描述数字电路和系统的形式化语言。 常见的硬件描述语言包括 VHDL&…

如何落地实际场景,解决跨境传输共性需求?免费白皮书可下载

在全球化的背景下&#xff0c;海外市场对于数据驱动的产品和服务的需求不断增加&#xff0c;各行业数据跨境传输也日趋频繁&#xff0c;在这种前景下&#xff0c;越来越多的企业寻求更深度的跨国业务及合作&#xff0c;因此&#xff0c;企业数据跨境流动也成为了势不可挡的趋势…

LabVIEW异步和同步通信详细分析及比较

1. 基本原理 异步通信&#xff1a; 原理&#xff1a;异步通信&#xff08;Asynchronous Communication&#xff09;是一种数据传输方式&#xff0c;其中数据发送和接收操作在独立的时间进行&#xff0c;不需要在特定时刻对齐。发送方在任何时刻可以发送数据&#xff0c;而接收…

Internet 控制报文协议 —— ICMPv4 和 ICMPv6 详解

ICMP 是一种面向无连接的协议&#xff0c;负责传递可能需要注意的差错和控制报文&#xff0c;差错指示通信网络是否存在错误 (如目的主机无法到达、IP 路由器无法正常传输数据包等。注意&#xff0c;路由器缓冲区溢出导致的丢包不包括在 ICMP 响应范围内&#xff0c;在 TCP 负责…

[C++]——同步异步日志系统(6)

同步异步日志系统 一、日志器模块设计1.1 同步日志器模块设计1.1.1 局部日志器建造者模式设计1.1.2 同步日志器基本功能测试 1.2 异步日志器模块设计1.2.1 单缓冲区设计1.2.2 异步工作线程的设计&#xff08;双缓冲区思想&#xff09;1.2.3 异步日志器设计1.2.4 异步日志器建造…

5.串口通信

文章目录 串口的介绍TTLRS-232RS-485 分类方式串口并口同步异步 相关寄存器SCONPCONTMODSBUFIE 中断处理函数代码编写main.cdelay.cdelay.hUart.cUart.hmain.h回环 继电器ESP8266AT指令代码编写main.cdefine.cdefine.hsend.csend.hreceive.cdelay.cdelay.h 串口的介绍 UART&am…

项目发布部署:如何发布.NETCore项目到IIS服务器?

前言&#xff1a;本文将详细介绍如何发布.NET Core项目到IIS服务器。首先&#xff0c;第一步需要安装IIS&#xff0c;介绍了在本地电脑和服务器中进行安装。然后需要安装SDK和运行时才能发布.NETCore项目。其次介绍了如何发布.NETCore项目和Vue项目&#xff0c;并配置IIS。最后…

自适应键盘,自带隐藏键盘的输入框(UITextField)

引言 在iOS开发中&#xff0c;输入框占据着举足轻重的地位。与安卓不同&#xff0c;iOS输入框经常面临键盘遮挡的问题&#xff0c;或者无法方便地取消键盘。为了解决这些问题&#xff0c;有许多针对iOS键盘管理的库&#xff0c;如IQKeyboardManager、TPKeyboardAvoiding和Keyb…

数仓实践:维度建模标准规范定义

一、引言 指以维度建模作为理论基础,构建总线矩阵,划分和定义数据域、业务过程、维度、度量/原子指标、业务限定、时间周期、统计粒度、派生指标。 规范定义如下: 二、名词术语 名词解释数据域面向业务分析,将业务过程或者维度进行抽象的集合。其中,业务过程可以概括为…

idea中使用maven

默认情况下&#xff0c;idea会自动下载并安装maven&#xff0c;这不便于我们管理。 最好是自行下载maven&#xff0c;然后在idea中指定maven的文件夹路径

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【获取密钥属性(C/C++)】

获取密钥属性(C/C) HUKS提供了接口供业务获取指定密钥的相关属性。在获取指定密钥属性前&#xff0c;需要确保已在HUKS中生成或导入持久化存储的密钥。 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 构造对应参数。 keyAlias&…

华为OD七日集训第1期 - 按算法分类,由易到难,循序渐进,玩转OD

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第2期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、数组第3天、双指针第4天、数据结构第5天、队列第6天、栈第7天、滑动窗口 六、集训总结 大家好&#xff0c;我是哪吒。 最近一直…

Idea如何快速高效的修改项目的包名

文章目录 前言一、全局替换的快捷键二、弹出如下的界面 前言 当我们有时候在做项目迁移的时候&#xff0c;需要快速的修改项目的包名&#xff01;那么如何快速高效的修改项目的报名呢&#xff1f; 经过尝试了很多方法&#xff01;最简单的方法就是利用全局替换来直接替换报名&…

半自动辅助制作数据集【实例分割】

利用yoloV8的实例分割模型&#xff0c;半自动辅助制作数据集 引言&#xff1a;【主要步骤】 步骤1&#xff1a;无人机航拍&#xff0c;收集基础图片 步骤2&#xff1a;将收集到的图片&#xff0c;全部用yoloV8-seg.pt模型进行实例分割【预测之前&#xff0c;将配置文件default.…

图——图的应用02最短路径(Dijkstra算法与Floyd算法详解),拓扑排序及关键路径

前面介绍了图的应用——01最小生成树章节&#xff0c;大家可以通过下面的链接学习&#xff1a; 图——图的应用01最小生成树&#xff08;Prim算法与Kruskal算法详解&#xff09; 今天就讲一下图的其他应用——最短路径&#xff0c;拓扑排序及关键路径。 目录 一&#xff0c…

解决Qt6 OpenCV项目编译出现错误undefined reference to symbol ‘cv::cvtColor,无法解析的符号

在一次Qt6 OpenCV项目编译的过程中&#xff0c;出现错误undefined reference to symbol cv::cvtColor&#xff0c;无法解析的符号&#xff0c;问题是查看INCLUDEPATH和LIBS&#xff0c;都已经添加正确。 而且这个函数也可以在头文件中索引到。到底是什么问题呢&#xff1f; 清…

公司政务办理流程分享(北京)

社保增减员&#xff1a; 参保登记——增减员业务这么办_北京市人力资源和社会保障局_社会保险 https://rsj.beijing.gov.cn/yltc/202310/t20231025_3287007.html 公积金增减员&#xff1a; https://dwwsyw.gjj.beijing.gov.cn/

【从零开始实现stm32无刷电机FOC】【实践】【5/6 stm32 adc外设的高级用法】

目录 采样时刻触发采样同步采样 点击查看本文开源的完整FOC工程 本节介绍的adc外设高级用法用于电机电流控制。 从前面几节可知&#xff0c;电机力矩来自于转子的q轴受磁力&#xff0c;而磁场强度与电流成正比&#xff0c;也就是说电机力矩与q轴电流成正相关&#xff0c;控制了…

which 命令在Linux中是一个快速查找可执行文件位置的工具

文章目录 0、概念1、which --help2、which命令解释 0、概念 which命令用于查找命令的可执行文件的路径which 命令在 Linux 中用于查找可执行命令的完整路径。当你在 shell 中输入一个命令时&#xff0c;shell 会在环境变量 $PATH 定义的目录列表中查找这个命令。which 命令可以…