前端开源项目网站,企业信息年报系统,网站初期建设的成本来源,莱芜网络营销代理1. 项目背景及解决问题的方案
1.1 项目背景
鸢尾花#xff08;Iris#xff09;数据集是机器学习领域的经典基准数据集#xff0c;由统计学家Fisher于1936年提出#xff0c;是多分类任务的入门级数据集。该数据集包含150个样本#xff0c;对应3类鸢尾花#xff08;山鸢尾/…1. 项目背景及解决问题的方案1.1 项目背景鸢尾花Iris数据集是机器学习领域的经典基准数据集由统计学家Fisher于1936年提出是多分类任务的入门级数据集。该数据集包含150个样本对应3类鸢尾花山鸢尾/Iris-setosa、变色鸢尾/Iris-versicolor、维吉尼亚鸢尾/Iris-virginica每类各50个样本每个样本包含4个数值型特征花萼长度、花萼宽度、花瓣长度、花瓣宽度。从技术角度决策树是一种基于树状结构做决策的分类/回归算法具有可解释性强、无需特征归一化、直观易懂等优点但核心痛点是当决策树的深度过深时模型会过度拟合训练数据的细节如噪声导致在测试集上的泛化能力下降过拟合。本项目的核心目标基于鸢尾花数据集使用决策树分类器实现鸢尾花种类的精准分类探究决策树深度对模型泛化能力测试集错误率的影响验证“深度过深导致过拟合”的现象掌握决策树模型的训练、评估、可视化及超参数深度调优的核心流程。1.2 解决问题的方案分步骤步骤核心动作具体实现数据准备加载预处理1. 加载sklearn内置的Iris数据集2. 转换为Pandas DataFrame命名特征列并添加目标列3. 选择“花瓣长度、花瓣宽度”两个核心特征区分度更高。数据集划分训练/测试集拆分按75%训练:25%测试划分数据设置random_state42保证结果可复现。基础模型训练决策树训练评估1. 初始化决策树分类器max_depth8gini准则2. 训练模型并预测测试集3. 计算测试集准确率、输出特征重要性4. 导出决策树可视化文件dot格式。单样本验证自定义样本预测对花瓣长度5、宽度1.5的样本预测分类概率和最终结果。超参数探究深度对性能的影响1. 遍历深度1~14训练不同深度的决策树2. 计算每个深度的测试集错误率3. 可视化深度与错误率的关系验证过拟合。可视化展示结果可视化设置中文字体绘制深度-错误率折线图直观展示规律。2. 代码详细注释版# 导入必要的库importpandasaspd# 数据处理库用于结构化数据操作importnumpyasnp# 数值计算库用于数组/矩阵操作fromsklearn.datasetsimportload_iris# 加载sklearn内置的鸢尾花数据集fromsklearn.treeimportDecisionTreeClassifier# 决策树分类器fromsklearn.treeimportexport_graphviz# 导出决策树为dot格式可视化用fromsklearn.treeimportDecisionTreeRegressor# 决策树回归器本项目未使用保留注释fromsklearn.model_selectionimporttrain_test_split# 划分训练集/测试集fromsklearn.metricsimportaccuracy_score# 计算分类准确率importmatplotlib.pyplotasplt# 绘图库importmatplotlibasmpl# 绘图配置库# 步骤1加载并预处理鸢尾花数据集 # 加载鸢尾花数据集irisload_iris()# 将特征数据转换为DataFrame方便查看和处理datapd.DataFrame(iris.data)# 为特征列命名对应数据集的4个特征花萼长度、花萼宽度、花瓣长度、花瓣宽度data.columnsiris.feature_names# 添加目标列鸢尾花种类0setosa1versicolor2virginicadata[Species]load_iris().target# 打印数据集前几行默认5行查看数据结构print(data)# 特征选择仅选取花瓣长度第3列和花瓣宽度第4列作为输入特征iloc[:,2:4]表示行全选列选2-3索引xdata.iloc[:,2:4]# 目标变量选取最后一列Species作为分类目标ydata.iloc[:,-1]# 步骤2划分训练集和测试集 # train_size0.75训练集占75%测试集25%random_state42固定随机种子保证结果可复现x_train,x_test,y_train,y_testtrain_test_split(x,y,train_size0.75,random_state42)# 步骤3训练基础决策树模型并评估 # 初始化决策树分类器max_depth8树最大深度criteriongini基尼系数作为分裂准则tree_clfDecisionTreeClassifier(max_depth8,criteriongini)# 用训练集数据训练模型tree_clf.fit(x_train,y_train)# 用训练好的模型预测测试集y_test_hattree_clf.predict(x_test)# 计算并打印测试集准确率print(acc score:,accuracy_score(y_test,y_test_hat))# 打印特征重要性数值越大表示该特征对分类的贡献越大print(特征重要性花瓣长度/花瓣宽度,tree_clf.feature_importances_)# 导出决策树为dot格式文件可通过dot命令转换为PNG图片查看树结构export_graphviz(tree_clf,# 训练好的决策树模型out_file./iris_tree.dot,# 输出文件路径feature_namesiris.feature_names[2:4],# 特征名仅花瓣长度/宽度class_namesiris.target_names,# 类别名setosa/versicolor/virginicaroundedTrue,# 节点边框圆角filledTrue# 节点填充颜色)# 备注转换命令需安装graphviz./dot -Tpng ~/PycharmProjects/mlstudy/bjsxt/iris_tree.dot -o ~/PycharmProjects/mlstudy/bjsxt/iris_tree.png# 步骤4单样本预测 # 预测花瓣长度5宽度1.5的样本属于各类的概率print(单样本分类概率,tree_clf.predict_proba([[5,1.5]]))# 预测该样本的最终分类结果输出类别索引print(单样本分类结果,tree_clf.predict([[5,1.5]]))# 步骤5探究决策树深度对错误率的影响 # 生成深度范围1到14包含14depthnp.arange(1,15)# 存储每个深度对应的错误率err_list[]# 遍历每个深度训练模型并计算错误率fordindepth:print(f当前训练的决策树深度{d})# 初始化对应深度的决策树分类器基尼系数准则clfDecisionTreeClassifier(criteriongini,max_depthd)# 训练模型clf.fit(x_train,y_train)# 预测测试集y_test_hatclf.predict(x_test)# 计算预测正确的样本True/False数组result(y_test_haty_test)# 仅当深度1时打印预测正确与否的结果用于调试ifd1:print(f深度1时的预测正确结果{result})# 计算错误率1 - 正确样本的均值err1-np.mean(result)# 打印错误率百分比print(f深度{d}时的错误率百分比{100*err:.2f}%)# 将错误率加入列表err_list.append(err)# 步骤6可视化深度与错误率的关系 # 设置matplotlib的中文字体SimHei黑体避免中文乱码mpl.rcParams[font.sans-serif][SimHei]# 设置图片背景色为白色plt.figure(facecolorw)# 绘制折线图红色圆点实线线宽2plt.plot(depth,err_list,ro-,lw2)# 设置x轴标签plt.xlabel(决策树深度,fontsize15)# 设置y轴标签plt.ylabel(错误率,fontsize15)# 设置标题plt.title(决策树深度和过拟合,fontsize18)# 显示网格线plt.grid(True)# 展示图片plt.show()# 决策树回归器本项目未使用保留代码注释# tree_reg DecisionTreeRegressor(max_depth2)# tree_reg.fit(X, y)3. 代码简洁版核心逻辑精简注释/打印importpandasaspdimportnumpyasnpfromsklearn.datasetsimportload_irisfromsklearn.treeimportDecisionTreeClassifier,export_graphvizfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportaccuracy_scoreimportmatplotlib.pyplotaspltimportmatplotlibasmpl# 数据加载与预处理irisload_iris()datapd.DataFrame(iris.data,columnsiris.feature_names)data[Species]iris.target xdata.iloc[:,2:4]# 花瓣长度/宽度ydata.iloc[:,-1]# 划分数据集x_train,x_test,y_train,y_testtrain_test_split(x,y,train_size0.75,random_state42)# 基础模型训练tree_clfDecisionTreeClassifier(max_depth8,criteriongini)tree_clf.fit(x_train,y_train)print(准确率,accuracy_score(y_test,tree_clf.predict(x_test)))# 导出决策树可视化文件export_graphviz(tree_clf,out_file./iris_tree.dot,feature_namesiris.feature_names[2:4],class_namesiris.target_names,roundedTrue,filledTrue)# 单样本预测print(单样本概率,tree_clf.predict_proba([[5,1.5]]))print(单样本结果,tree_clf.predict([[5,1.5]]))# 探究深度对错误率的影响depthnp.arange(1,15)err_list[]fordindepth:clfDecisionTreeClassifier(criteriongini,max_depthd)clf.fit(x_train,y_train)err1-np.mean(clf.predict(x_test)y_test)err_list.append(err)# 可视化mpl.rcParams[font.sans-serif][SimHei]plt.figure(facecolorw)plt.plot(depth,err_list,ro-,lw2)plt.xlabel(决策树深度,fontsize15)plt.ylabel(错误率,fontsize15)plt.title(决策树深度和过拟合,fontsize18)plt.grid(True)plt.show()