资讯动态

鸢尾花分类预测完整实战:从数据探索到模型调优的机器学习入门指南

发布时间:2026/10/22 5:55:27 来源:尧图企业网站定制
鸢尾花分类预测实验大概是每个接触机器学习的人绕不开的第一个完整项目。我见过太多人把它当成调个库、跑个fit、看个准确率的过场练习结果做完之后脑子里只剩下一个0.97的数字问他为什么用这个模型、数据长什么样、换一批数据还能不能跑一概答不上来。这个实验真正的价值不在于最终那个准确率有多高而在于它麻雀虽小五脏俱全——数据加载、探索性分析、特征工程、模型选型、训练评估、结果可视化整条链路一个不缺。你把它吃透了后面换任何数据集都是同一套方法论往上套。这篇文章我会把自己反复做这个实验积累下来的完整流程、参数选择的思考过程、以及那些只有踩过坑才知道的细节全部摊开讲适合刚入门想认认真真走一遍完整流程的朋友也适合做过但觉得没吃透想回头补课的人。1. 实验整体设计与思路拆解1.1 为什么选鸢尾花数据集作为入门项目鸢尾花数据集Iris Dataset在机器学习界的地位大概相当于编程语言里的Hello World。它由统计学家R.A. Fisher在1936年整理发布一共150条样本每条样本有4个特征花萼长度sepal length、花萼宽度sepal width、花瓣长度petal length、花瓣宽度petal width单位都是厘米。目标变量是3个类别山鸢尾Setosa、变色鸢尾Versicolor、维吉尼亚鸢尾Virginica每个类别各50条样本。这个数据集之所以成为经典入门材料核心原因有几个。第一数据量小150条记录在任何一个普通笔记本上都是秒级运算不需要GPU不需要分布式你可以在几分钟内完成一次完整的实验迭代。第二特征维度低只有4个特征方便做二维可视化你可以直接在平面上把数据点画出来直观感受什么叫线性可分、什么叫类别重叠。第三数据干净没有缺失值特征量纲统一不需要复杂的清洗流程让你能把精力集中在建模本身而不是数据预处理上。第四三个类别中有两个在特征空间中有一定重叠这恰好给了你对比不同模型分类边界的机会——线性模型能做到什么程度非线性模型又能提升多少一目了然。我个人的建议是不要因为它是入门数据集就轻视它。恰恰相反你应该把它当成一个正式项目来做该有的步骤一个不少该写的文档认真写该做的可视化认真做。这套流程走顺了后面拿到真实业务数据时你才有章法。1.2 完整实验流程的环节拆解一个完整的鸢尾花分类实验我通常会拆成以下六个环节每个环节都有它存在的理由缺一不可数据加载与初步检视把数据读进来看看形状、类型、前几行长什么样确认没有加载错误。很多人跳过这一步直接建模结果后面发现某列被当成了字符串白白浪费时间排查。探索性数据分析EDA统计描述、分布图、箱线图、散点图矩阵、相关性热力图目的是建立对数据的手感——哪些特征区分度高哪些特征之间有冗余类别是否平衡。特征工程与数据划分包括特征标准化、训练集/测试集划分必要时做特征组合或降维。这一步的每一个决策都会影响后续模型表现。模型选型与训练从简单的逻辑回归、K近邻开始逐步尝试决策树、随机森林、支持向量机等对比它们在当前数据上的表现。模型评估与调优不只看准确率还要看混淆矩阵、精确率、召回率、F1值必要时做交叉验证和超参数搜索。结果可视化与结论输出把决策边界画出来把混淆矩阵可视化把特征重要性排序形成一份能给别人讲清楚的结论。这六个环节串起来就是一条完整的机器学习流水线。你在鸢尾花上跑通一遍换到泰坦尼克生存预测、手写数字识别、房价预测流程骨架完全一样只是具体处理手法因数据而异。1.3 工具链选型与理由做这个实验工具链的选择其实很灵活但我推荐以下组合理由是成熟、文档全、社区活跃遇到问题容易搜到答案工具用途选型理由Python 3.8编程语言机器学习生态最完善的语言没有之一NumPy数值计算底层数组运算pandas和sklearn都依赖它pandas数据处理DataFrame操作直观适合探索性分析scikit-learn建模与评估API统一模型丰富文档质量高matplotlib基础绘图灵活度高适合自定义图表seaborn统计可视化基于matplotlib统计图表更美观Jupyter Notebook交互式开发边写边看结果适合实验性项目如果你已经装了Anaconda上面这些库除了seaborn可能需要单独装一下其余都是自带的。用pip安装也很简单pip install numpy pandas scikit-learn matplotlib seaborn jupyter注意不要在一个环境里混装太多不同来源的包尤其是通过conda和pip混装很容易出现依赖冲突。我习惯用conda创建独立环境再在环境内用pip装缺失的包。2. 数据加载与探索性分析实操2.1 数据加载的三种方式与选择scikit-learn内置了鸢尾花数据集加载只需要两行代码from sklearn.datasets import load_iris iris load_iris()iris对象是一个类似字典的结构包含data特征矩阵150x4、target标签数组长度150、feature_names特征名列表、target_names类别名列表、DESCR数据集描述。你可以用iris.data.shape确认形状用iris.target_names查看类别名称。除了sklearn内置还有两种常见加载方式。一种是从UCI机器学习仓库下载CSV文件用pandas读取import pandas as pd df pd.read_csv(iris.csv)另一种是直接用seaborn内置的加载函数import seaborn as sns df sns.load_dataset(iris)三种方式拿到的数据内容一致区别在于格式。sklearn返回的是NumPy数组适合直接喂给模型pandas返回DataFrame适合做探索性分析。我通常的做法是先用sklearn加载拿到干净的数组用于建模同时转成DataFrame用于可视化分析。import pandas as pd from sklearn.datasets import load_iris iris load_iris() df pd.DataFrame(iris.data, columnsiris.feature_names) df[target] iris.target df[target_name] df[target].map({i: name for i, name in enumerate(iris.target_names)})这样一份DataFrame里既有数值特征又有类别标签和类别名称后面画图、分组统计都方便。2.2 数据初检形状、类型、缺失值、重复值数据加载进来之后别急着画图先做一轮基础体检。我习惯按以下顺序过一遍# 形状 print(df.shape) # (150, 6) # 数据类型与内存占用 df.info() # 前5行 df.head() # 描述性统计 df.describe() # 缺失值检查 df.isnull().sum() # 重复值检查 df.duplicated().sum()鸢尾花数据集本身没有缺失值但重复值确实存在——150条记录中有1条完全重复。这个重复值要不要删我的建议是保留。原因很简单这条重复记录可能是真实测量中两次独立观测得到了相同结果贸然删除反而丢失信息。而且150条数据本来就少删一条对模型影响微乎其微但养成看到重复值就删的习惯在真实项目中可能出大问题——真实业务数据里的重复往往有业务含义比如同一用户多次下单你不能简单去重。描述性统计值得仔细看。你会注意到四个特征的均值、标准差、最小值、最大值、四分位数。花萼长度均值约5.84厘米花瓣长度均值约3.76厘米花瓣宽度的标准差相对较小。这些数字本身不说明什么但当你把它们和后面的分布图对照起来看就能建立起对数据尺度的直观感受。2.3 单变量分布分析与类别平衡检查先看类别分布df[target_name].value_counts()结果是三个类别各50条完全平衡。类别平衡意味着你不需要做重采样准确率accuracy作为评估指标也是合理的。如果类别不平衡比如某一类占了90%那准确率就有欺骗性了——全预测成多数类也能拿90%准确率但模型实际上没有学到任何区分能力。再看单变量分布。用seaborn的pairplot一次性画出所有特征的分布和两两散点图import seaborn as sns import matplotlib.pyplot as plt sns.pairplot(df, huetarget_name, diag_kindkde, paletteSet2) plt.show()这张图信息量极大。对角线上的KDE曲线展示每个特征在三个类别下的分布密度非对角线上的散点图展示特征两两组合下的类别分离情况。你会观察到几个关键现象花瓣长度和花瓣宽度对三个类别的区分度最高。在花瓣长度的散点图上Setosa类聚在左侧一小簇Versicolor在中间Virginica在右侧三个类别几乎可以一刀切开。花萼宽度的区分度最差三个类别的分布大量重叠单靠这一个特征很难区分。Setosa类在几乎所有特征组合下都和其他两类明显分离说明它最好识别Versicolor和Virginica在部分特征组合下有重叠是分类的主要难点。这些观察直接指导后续的模型选型和特征选择。比如你如果只想用两个特征建模那花瓣长度和花瓣宽度是最优组合。2.4 相关性分析与特征冗余判断plt.figure(figsize(8, 6)) sns.heatmap(df[iris.feature_names].corr(), annotTrue, cmapcoolwarm, fmt.2f) plt.show()相关性热力图会告诉你花瓣长度和花瓣宽度的相关系数很高约0.96花萼长度和花瓣长度也有较强相关约0.87。这意味着特征之间存在信息冗余。对于线性模型来说高度相关的特征可能导致系数估计不稳定多重共线性但对于树模型来说影响不大。我的处理策略是不急着删特征。鸢尾花只有4个特征维度已经很低了删了反而可能丢失信息。如果你确实想降维可以用PCA但要注意PCA之后的主成分失去了原始特征的物理含义解释性会下降。对于这个实验我倾向于保留全部4个特征让模型自己去学权重。实操心得相关性分析在特征多的时候特别有用。我做过一个项目有80多个特征相关性热力图一看有十几对特征相关系数超过0.95果断删掉冗余的模型训练时间直接砍半效果几乎没降。但鸢尾花这种4特征的数据集没必要做这个操作。3. 特征工程与数据划分的关键决策3.1 特征标准化什么时候需要什么时候不需要特征标准化是把不同量纲的特征缩放到同一尺度常见方法有两种Z-score标准化StandardScaler将特征转换为均值0、标准差1的分布。公式是(x - mean) / std。Min-Max归一化MinMaxScaler将特征缩放到[0, 1]区间。公式是(x - min) / (max - min)。鸢尾花的四个特征都是厘米单位量纲本来就统一数值范围也接近花萼长度4.3-7.9花瓣长度1.0-6.9所以标准化对某些模型来说不是必须的。但以下模型对特征尺度敏感标准化后表现会明显不同模型是否对尺度敏感原因K近邻KNN敏感基于距离计算尺度大的特征主导距离支持向量机SVM敏感核函数基于内积尺度影响核矩阵逻辑回归带正则敏感正则项对系数大小有约束决策树不敏感基于特征阈值分裂尺度不影响分裂点随机森林不敏感同决策树朴素贝叶斯部分敏感高斯朴素贝叶斯假设特征独立尺度影响概率密度我的做法是统一做Z-score标准化。理由很简单——做了不会有坏处不做可能在某些模型上吃亏。标准化放在训练集/测试集划分之后用训练集的均值和标准差去转换测试集避免数据泄露。from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split X iris.data y iris.target X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)注意fit_transform用在训练集上transform用在测试集上。这个细节很多人搞混如果你对测试集也用了fit_transform那测试集的均值和标准差就泄露到了训练过程中评估结果会偏乐观。3.2 训练集/测试集划分的比例与随机种子train_test_split有几个关键参数test_size测试集比例。150条数据我通常用0.2即30条测试、120条训练。如果数据量更小可以用0.3数据量很大时0.1甚至0.05都够。random_state随机种子。固定种子保证每次划分结果一致方便复现。我习惯用42没什么特殊含义就是个习惯。stratify分层采样。传入标签数组保证训练集和测试集中各类别比例与原始数据一致。鸢尾花三个类别各50条分层后训练集每类40条测试集每类10条避免随机划分导致某类在测试集中过多或过少。注意stratify参数在类别不平衡时尤其重要。我见过有人做二分类正样本只占5%随机划分后测试集里一个正样本都没有模型评估完全失效。分层采样能避免这个问题。3.3 交叉验证的引入时机与K值选择单次训练集/测试集划分有个问题结果受划分方式影响大。换一个随机种子准确率可能从0.95变成0.92。为了得到更稳定的评估引入K折交叉验证。K折交叉验证的做法是把训练集分成K份每次用K-1份训练、1份验证重复K次取平均结果。常用的K值是5和10。K5计算量适中K10更稳定但计算量翻倍。鸢尾花数据量小我通常用5折。from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression model LogisticRegression(max_iter200) scores cross_val_score(model, X_train_scaled, y_train, cv5, scoringaccuracy) print(f交叉验证准确率: {scores.mean():.4f} ± {scores.std():.4f})交叉验证的另一个用途是超参数搜索。配合GridSearchCV你可以自动遍历参数组合找到交叉验证得分最高的那一组。from sklearn.model_selection import GridSearchCV from sklearn.svm import SVC param_grid { C: [0.1, 1, 10, 100], kernel: [linear, rbf], gamma: [scale, auto] } grid GridSearchCV(SVC(), param_grid, cv5, scoringaccuracy, n_jobs-1) grid.fit(X_train_scaled, y_train) print(f最佳参数: {grid.best_params_}) print(f最佳交叉验证得分: {grid.best_score_:.4f})n_jobs-1表示用所有CPU核心并行计算能显著加快搜索速度。4. 多模型对比训练与评估实录4.1 基线模型逻辑回归与K近邻我习惯从最简单的模型开始建立基线。逻辑回归和K近邻是两个很好的起点。逻辑回归Logistic Regression虽然名字里有回归但它是分类模型。它通过sigmoid函数把线性组合映射到概率多分类时用softmax。鸢尾花三分类逻辑回归默认用一对多OvR策略也可以指定multi_classmultinomial用softmax。from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, classification_report lr LogisticRegression(max_iter200, random_state42) lr.fit(X_train_scaled, y_train) y_pred_lr lr.predict(X_test_scaled) print(f逻辑回归准确率: {accuracy_score(y_test, y_pred_lr):.4f}) print(classification_report(y_test, y_pred_lr, target_namesiris.target_names))max_iter200是因为默认的100次迭代在部分数据上可能不收敛会报警告。调到200基本都能收敛。K近邻KNN的思路更直观一个新样本的类别由它最近的K个邻居投票决定。K值的选择很关键——K太小容易过拟合对噪声敏感K太大容易欠拟合决策边界过于平滑。我通常从K3开始试逐步增加到K15看交叉验证得分的变化。from sklearn.neighbors import KNeighborsClassifier for k in [3, 5, 7, 9, 11, 15]: knn KNeighborsClassifier(n_neighborsk) scores cross_val_score(knn, X_train_scaled, y_train, cv5) print(fK{k}, 交叉验证准确率: {scores.mean():.4f} ± {scores.std():.4f})在鸢尾花数据集上K5到K9通常表现最好准确率在0.95-0.97之间。4.2 进阶模型决策树、随机森林与支持向量机决策树Decision Tree的优势是可解释性强你可以直接把树画出来看它每一步怎么分裂。但单棵决策树容易过拟合需要限制深度。from sklearn.tree import DecisionTreeClassifier, plot_tree dt DecisionTreeClassifier(max_depth3, random_state42) dt.fit(X_train_scaled, y_train) y_pred_dt dt.predict(X_test_scaled) print(f决策树准确率: {accuracy_score(y_test, y_pred_dt):.4f}) plt.figure(figsize(12, 8)) plot_tree(dt, feature_namesiris.feature_names, class_namesiris.target_names, filledTrue) plt.show()max_depth3意味着树最多三层通常就能把鸢尾花分得很好了。如果不限制深度树可能长到十几层训练集准确率100%但测试集下降。随机森林Random Forest是决策树的集成版本通过bagging和特征随机采样降低方差。它通常比单棵决策树稳定而且能输出特征重要性。from sklearn.ensemble import RandomForestClassifier rf RandomForestClassifier(n_estimators100, random_state42) rf.fit(X_train_scaled, y_train) y_pred_rf rf.predict(X_test_scaled) print(f随机森林准确率: {accuracy_score(y_test, y_pred_rf):.4f}) # 特征重要性 for name, importance in zip(iris.feature_names, rf.feature_importances_): print(f{name}: {importance:.4f})在鸢尾花上随机森林的特征重要性排序通常是花瓣长度 花瓣宽度 花萼长度 花萼宽度。这和前面的EDA观察一致。支持向量机SVM在小样本高维数据上表现优秀。鸢尾花只有150条样本SVM很适合。核函数选择上线性核适合线性可分数据RBF核适合非线性边界。from sklearn.svm import SVC svm_linear SVC(kernellinear, C1.0, random_state42) svm_linear.fit(X_train_scaled, y_train) print(fSVM线性核准确率: {accuracy_score(y_test, svm_linear.predict(X_test_scaled)):.4f}) svm_rbf SVC(kernelrbf, C1.0, gammascale, random_state42) svm_rbf.fit(X_train_scaled, y_train) print(fSVM RBF核准确率: {accuracy_score(y_test, svm_rbf.predict(X_test_scaled)):.4f})4.3 模型对比表格与选型建议把上面几个模型的结果汇总到一张表里模型测试集准确率交叉验证均值优点缺点逻辑回归0.96670.9583简单、可解释、训练快只能学线性边界KNN (K5)0.96670.9583无需训练、直观预测慢、对尺度敏感决策树 (depth3)0.93330.9417可解释性极强容易过拟合随机森林0.96670.9667稳定、有特征重要性模型较大、解释性弱于单树SVM (RBF)0.96670.9667小样本表现好参数调优较复杂提示具体数值会因随机种子和划分方式略有不同但相对排序基本稳定。鸢尾花数据集上多个模型都能达到0.95以上的准确率差异不大。这说明数据本身区分度高模型选择不是瓶颈。选型建议如果你要给别人讲清楚模型为什么这么判断选逻辑回归或决策树如果你追求稳定性和特征重要性分析选随机森林如果你想练习超参数调优选SVM。4.4 混淆矩阵与分类报告解读准确率只是一个数字混淆矩阵能告诉你错在哪里。from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay cm confusion_matrix(y_test, y_pred_rf) disp ConfusionMatrixDisplay(confusion_matrixcm, display_labelsiris.target_names) disp.plot(cmapBlues) plt.show()在鸢尾花上Setosa类通常全部正确分类因为和其他两类完全分离错误主要发生在Versicolor和Virginica之间。这两个类别在花瓣特征上有重叠区域模型偶尔会把Versicolor判成Virginica反之亦然。classification_report给出每个类别的精确率precision、召回率recall和F1值精确率预测为该类别的样本中真正属于该类别的比例。高精确率意味着误报少。召回率真正属于该类别的样本中被正确预测的比例。高召回率意味着漏报少。F1值精确率和召回率的调和平均综合衡量。如果某个类别的F1明显低于其他类别说明这个类别是分类难点可以考虑针对性处理比如增加该类样本、调整类别权重、或设计专门的特征。5. 决策边界可视化与特征重要性分析5.1 二维决策边界的绘制方法鸢尾花有4个特征没法直接画在二维平面上。但我们可以选两个最重要的特征花瓣长度和花瓣宽度用这两个特征训练模型然后在平面上画出决策边界。import numpy as np # 只用花瓣长度和花瓣宽度 X_2d iris.data[:, [2, 3]] X_train_2d, X_test_2d, y_train_2d, y_test_2d train_test_split( X_2d, y, test_size0.2, random_state42, stratifyy ) scaler_2d StandardScaler() X_train_2d_scaled scaler_2d.fit_transform(X_train_2d) X_test_2d_scaled scaler_2d.transform(X_test_2d) # 训练SVM svm_2d SVC(kernelrbf, C1.0, gammascale) svm_2d.fit(X_train_2d_scaled, y_train_2d) # 生成网格点 x_min, x_max X_train_2d_scaled[:, 0].min() - 0.5, X_train_2d_scaled[:, 0].max() 0.5 y_min, y_max X_train_2d_scaled[:, 1].min() - 0.5, X_train_2d_scaled[:, 1].max() 0.5 xx, yy np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02)) # 预测网格点类别 Z svm_2d.predict(np.c_[xx.ravel(), yy.ravel()]) Z Z.reshape(xx.shape) # 绘图 plt.figure(figsize(10, 6)) plt.contourf(xx, yy, Z, alpha0.3, cmapSet2) plt.scatter(X_train_2d_scaled[:, 0], X_train_2d_scaled[:, 1], cy_train_2d, cmapSet2, edgecolorsk, s50) plt.xlabel(花瓣长度标准化) plt.ylabel(花瓣宽度标准化) plt.title(SVM决策边界二维特征) plt.show()这张图能直观展示模型如何划分三个类别。Setosa类通常被一条清晰的边界隔开Versicolor和Virginica之间的边界则更复杂可能是曲线。5.2 特征重要性排序与业务解释随机森林给出的特征重要性是一个很好的切入点用来理解哪些特征对分类贡献最大。import pandas as pd importances pd.Series(rf.feature_importances_, indexiris.feature_names) importances.sort_values().plot(kindbarh, figsize(8, 5)) plt.xlabel(重要性) plt.title(随机森林特征重要性) plt.show()在鸢尾花上典型的重要性排序是花瓣长度约0.45花瓣宽度约0.40花萼长度约0.10花萼宽度约0.05这个结果和EDA阶段的观察完全吻合。如果你在做真实业务项目这个排序能帮你做特征筛选——重要性极低的特征可以考虑去掉简化模型。实操心得特征重要性有两种计算方式一种是基于不纯度减少默认一种是基于排列permutation importance。前者对高基数特征有偏好后者更可靠但计算量大。如果特征重要性结果和你的业务直觉严重不符建议用permutation_importance交叉验证一下。5.3 PCA降维可视化与类别分离度如果你想在一张图上展示全部4个特征的信息可以用PCA降到2维from sklearn.decomposition import PCA pca PCA(n_components2) X_pca pca.fit_transform(iris.data) plt.figure(figsize(10, 6)) for i, name in enumerate(iris.target_names): plt.scatter(X_pca[y i, 0], X_pca[y i, 1], labelname, alpha0.7) plt.xlabel(f主成分1解释方差比{pca.explained_variance_ratio_[0]:.2%}) plt.ylabel(f主成分2解释方差比{pca.explained_variance_ratio_[1]:.2%}) plt.legend() plt.title(PCA降维后的类别分布) plt.show()通常前两个主成分能解释95%以上的方差。图上你会看到Setosa类聚成一簇Versicolor和Virginica有部分重叠但整体可分。这个图和前面的pairplot互相印证加深你对数据结构的理解。6. 常见问题与排查技巧实录6.1 模型不收敛或报收敛警告现象逻辑回归训练时出现ConvergenceWarning: lbfgs failed to converge。原因默认最大迭代次数100不够或者特征未标准化导致优化困难。解决增加max_iter比如设为200或500。做特征标准化。如果还不行换求解器比如solversaga或solverliblinear。lr LogisticRegression(max_iter500, solverlbfgs, random_state42)6.2 准确率异常低或异常高准确率异常低比如0.3左右检查标签是否对齐、特征是否加载错误、标准化是否用了测试集的统计量。我遇到过一次标签是字符串但模型期望数值sklearn没报错但结果全乱。准确率异常高比如1.0检查是否有数据泄露。最常见的是在划分训练集/测试集之前做了标准化或者特征中包含了标签信息。鸢尾花数据干净正常准确率在0.93-0.98之间如果跑到1.0大概率有问题。6.3 测试集与训练集表现差距过大现象训练集准确率0.99测试集0.85。原因过拟合。模型把训练集的噪声也学进去了。解决降低模型复杂度比如决策树限制max_depthSVM减小C。增加正则化比如逻辑回归用L2正则并增大C的倒数。增加训练数据量鸢尾花没法增加但真实项目可以。用交叉验证代替单次划分获得更稳定的评估。6.4 常见问题速查表问题可能原因排查方法解决方案模型不收敛迭代次数不足、未标准化看警告信息增加max_iter、标准化准确率异常低标签错位、特征错误检查数据形状和类型重新加载、对齐标签准确率异常高数据泄露检查预处理顺序先划分再标准化过拟合模型太复杂对比训练/测试得分降复杂度、加正则交叉验证方差大数据量小、划分敏感看std值增加K值、分层采样某类别F1低类别重叠、样本少看混淆矩阵特征工程、类别权重6.5 独家避坑技巧汇总固定随机种子random_state在划分、模型初始化、交叉验证中都要设保证结果可复现。我习惯统一用42。先划分再标准化这个顺序错了评估结果就不可信。不要盲目追求高准确率鸢尾花上0.97和0.98的差距可能只是随机波动没有实际意义。更重要的是理解模型为什么这么判断。保存模型训练好的模型用joblib保存下次直接加载不用重新训练。import joblib joblib.dump(rf, iris_rf_model.pkl) # 加载 loaded_model joblib.load(iris_rf_model.pkl)记录实验每次实验的参数、结果、观察都记下来。我用一个简单的Markdown表格记录比事后回忆靠谱得多。# 示例记录实验 experiment_log { model: RandomForest, params: {n_estimators: 100, random_state: 42}, test_accuracy: 0.9667, cv_mean: 0.9667, notes: 特征重要性花瓣长度最高 }这个实验我前前后后做过很多遍每次都有新收获。最开始只关心准确率后来开始关注决策边界长什么样再后来会去思考每个参数背后的数学含义。鸢尾花数据集虽小但它是一面镜子能照出你对机器学习流程的理解程度。如果你做完之后能给别人从头到尾讲清楚每一步为什么这么做那这个实验就没白做。后面再拿到新的数据集无非是把这套流程再走一遍换换模型、调调参数、做做特征工程骨架是不变的。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑