sklearn实战篇(一)-- 鸢尾花(iris)数据集可视化与模型评估
1. 鸢尾花数据集初探第一次接触鸢尾花数据集时我就被它的简洁和完整所吸引。这个数据集就像机器学习界的Hello World但千万别小看它——150朵鸢尾花的测量数据背后藏着分类问题的精髓。每朵花都有四个关键特征花萼长度、花萼宽度、花瓣长度和花瓣宽度正好对应着数据集的四列数值。而第五列则是花的品种标签分为山鸢尾(setosa)、变色鸢尾(versicolor)和维吉尼亚鸢尾(virginica)三类。加载数据集特别简单用sklearn的一行代码就能搞定from sklearn.datasets import load_iris iris load_iris()这个数据集最妙的地方在于它的规模恰到好处——大到能体现真实数据的复杂性小到可以在几分钟内完成分析和建模。我记得刚开始学机器学习时经常在这里栽跟头。比如有一次我直接拿全部数据训练模型然后在同样的数据上测试结果准确率接近100%高兴了半天才发现犯了数据泄露的低级错误。2. 数据可视化实战2.1 基础统计图表数据可视化是理解数据集的第一步。我习惯先用pandas的describe()快速查看统计摘要import pandas as pd iris_df pd.DataFrame(iris.data, columnsiris.feature_names) iris_df[target] iris.target print(iris_df.describe())但表格数据不够直观我更喜欢用matplotlib绘制箱线图import matplotlib.pyplot as plt iris_df.plot(kindbox, subplotsTrue, layout(2,2)) plt.show()箱线图能清晰展示每个特征的分布范围和离群值。比如我发现花萼宽度的离群点较多这可能预示着某些品种的特殊性。直方图则更适合观察数据分布形态iris_df.hist() plt.show()2.2 高级可视化技巧当需要分析特征间关系时seaborn的pairplot是我的首选import seaborn as sns sns.pairplot(iris_df, huetarget, palettehusl)这个图矩阵能一次性展示所有特征的两两关系而且用颜色区分了不同品种。从图中可以明显看出setosa的花瓣尺寸明显小于其他两类而versicolor和virginica在花萼特征上有部分重叠。热图则更适合分析特征相关性plt.figure(figsize(10,8)) sns.heatmap(iris_df.corr(), annotTrue, cmapcoolwarm)我发现花瓣长度和宽度的相关性高达0.96这提示我们在建模时可能需要考虑特征选择避免冗余信息。3. 数据预处理关键步骤3.1 训练测试集拆分新手最容易犯的错误就是跳过数据拆分。我吃过这个亏所以现在每次都会严格划分from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test train_test_split( iris.data, iris.target, test_size0.3, random_state42)这里有几个经验之谈random_state固定种子保证结果可复现测试集比例通常在20-30%之间分类问题要确保各类别在训练集和测试集中的分布均衡3.2 特征标准化虽然鸢尾花数据集的特征尺度相近但养成标准化习惯很重要from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)记住一定要用训练集的参数来转换测试集这是另一个容易出错的地方。我曾经在比赛中因为搞反了这个顺序导致模型效果异常的好——当然是假象。4. 模型构建与评估4.1 KNN模型实战K近邻是最直观的分类算法之一。在sklearn中实现非常简单from sklearn.neighbors import KNeighborsClassifier knn KNeighborsClassifier(n_neighbors3) knn.fit(X_train_scaled, y_train)但选择k值有讲究。我通常会用交叉验证来找最优kfrom sklearn.model_selection import cross_val_score import numpy as np k_range range(1, 31) k_scores [] for k in k_range: knn KNeighborsClassifier(n_neighborsk) scores cross_val_score(knn, X_train_scaled, y_train, cv5) k_scores.append(scores.mean()) best_k k_range[np.argmax(k_scores)]4.2 模型评估指标准确率虽然直观但在类别不平衡时可能产生误导。我习惯看分类报告from sklearn.metrics import classification_report y_pred knn.predict(X_test_scaled) print(classification_report(y_test, y_pred))混淆矩阵更直观from sklearn.metrics import confusion_matrix import seaborn as sns cm confusion_matrix(y_test, y_pred) sns.heatmap(cm, annotTrue, fmtd) plt.xlabel(Predicted) plt.ylabel(True)5. 多模型对比分析5.1 常用分类模型实现除了KNN我通常会尝试几个经典算法from sklearn.svm import SVC from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier models { SVM: SVC(), Decision Tree: DecisionTreeClassifier(), Random Forest: RandomForestClassifier() } for name, model in models.items(): model.fit(X_train_scaled, y_train) score model.score(X_test_scaled, y_test) print(f{name} accuracy: {score:.3f})5.2 特征重要性分析随机森林可以提供特征重要性rf RandomForestClassifier() rf.fit(X_train_scaled, y_train) importances rf.feature_importances_ indices np.argsort(importances)[::-1] plt.figure() plt.title(Feature importances) plt.bar(range(X_train.shape[1]), importances[indices]) plt.xticks(range(X_train.shape[1]), iris.feature_names, rotation90) plt.show()这个分析证实了之前的观察花瓣特征比花萼特征更具区分度。6. 模型优化技巧6.1 网格搜索调参手动调参效率低我习惯用GridSearchCVfrom sklearn.model_selection import GridSearchCV param_grid { C: [0.1, 1, 10, 100], gamma: [1, 0.1, 0.01, 0.001], kernel: [rbf, linear] } grid GridSearchCV(SVC(), param_grid, refitTrue, verbose2) grid.fit(X_train_scaled, y_train)6.2 交叉验证策略k折交叉验证能更好利用数据from sklearn.model_selection import KFold kf KFold(n_splits5, shuffleTrue, random_state42) for train_index, test_index in kf.split(X_train_scaled): X_train_kf, X_val X_train_scaled[train_index], X_train_scaled[test_index] y_train_kf, y_val y_train[train_index], y_train[test_index] # 训练和评估模型7. 项目经验分享在实际项目中我发现有几个关键点特别重要数据探索要彻底花在EDA上的时间永远不会浪费。有次我发现某个特征的分布异常排查后发现是数据收集时的单位不统一。特征工程比模型选择更重要好的特征能让简单模型表现优异。在鸢尾花数据集中我尝试创建了花瓣面积特征长×宽模型准确率提升了2%。模型解释性很重要特别是业务场景下决策树的可视化特别有用from sklearn.tree import plot_tree plt.figure(figsize(20,10)) plot_tree(model, filledTrue, feature_namesiris.feature_names, class_namesiris.target_names) plt.show()记录实验过程使用工具如MLflow或简单记事本记录每次实验的参数和结果这对回溯分析特别有帮助。鸢尾花数据集虽然简单但它教会了我机器学习的基本流程和方法论。每次重新分析这个数据集我都能发现新的insight。建议初学者不要急于跑复杂模型而是先扎实掌握这些基础技能它们会在你处理更复杂数据时发挥巨大作用。