sklearn实战篇(一)-- 鸢尾花(iris)数据集可视化与模型评估
2026/5/14 17:51:19 网站建设 项目流程

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, columns=iris.feature_names) iris_df['target'] = iris.target print(iris_df.describe())

但表格数据不够直观,我更喜欢用matplotlib绘制箱线图:

import matplotlib.pyplot as plt iris_df.plot(kind='box', subplots=True, layout=(2,2)) plt.show()

箱线图能清晰展示每个特征的分布范围和离群值。比如我发现花萼宽度的离群点较多,这可能预示着某些品种的特殊性。直方图则更适合观察数据分布形态:

iris_df.hist() plt.show()

2.2 高级可视化技巧

当需要分析特征间关系时,seaborn的pairplot是我的首选:

import seaborn as sns sns.pairplot(iris_df, hue='target', palette='husl')

这个图矩阵能一次性展示所有特征的两两关系,而且用颜色区分了不同品种。从图中可以明显看出,setosa的花瓣尺寸明显小于其他两类,而versicolor和virginica在花萼特征上有部分重叠。

热图则更适合分析特征相关性:

plt.figure(figsize=(10,8)) sns.heatmap(iris_df.corr(), annot=True, cmap='coolwarm')

我发现花瓣长度和宽度的相关性高达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_size=0.3, random_state=42)

这里有几个经验之谈:

  1. random_state固定种子保证结果可复现
  2. 测试集比例通常在20-30%之间
  3. 分类问题要确保各类别在训练集和测试集中的分布均衡

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_neighbors=3) knn.fit(X_train_scaled, y_train)

但选择k值有讲究。我通常会用交叉验证来找最优k:

from 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_neighbors=k) scores = cross_val_score(knn, X_train_scaled, y_train, cv=5) 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, annot=True, fmt='d') 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, rotation=90) plt.show()

这个分析证实了之前的观察:花瓣特征比花萼特征更具区分度。

6. 模型优化技巧

6.1 网格搜索调参

手动调参效率低,我习惯用GridSearchCV:

from 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, refit=True, verbose=2) grid.fit(X_train_scaled, y_train)

6.2 交叉验证策略

k折交叉验证能更好利用数据:

from sklearn.model_selection import KFold kf = KFold(n_splits=5, shuffle=True, random_state=42) 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. 项目经验分享

在实际项目中,我发现有几个关键点特别重要:

  1. 数据探索要彻底:花在EDA上的时间永远不会浪费。有次我发现某个特征的分布异常,排查后发现是数据收集时的单位不统一。

  2. 特征工程比模型选择更重要:好的特征能让简单模型表现优异。在鸢尾花数据集中,我尝试创建了花瓣面积特征(长×宽),模型准确率提升了2%。

  3. 模型解释性很重要:特别是业务场景下,决策树的可视化特别有用:

from sklearn.tree import plot_tree plt.figure(figsize=(20,10)) plot_tree(model, filled=True, feature_names=iris.feature_names, class_names=iris.target_names) plt.show()
  1. 记录实验过程:使用工具如MLflow或简单记事本记录每次实验的参数和结果,这对回溯分析特别有帮助。

鸢尾花数据集虽然简单,但它教会了我机器学习的基本流程和方法论。每次重新分析这个数据集,我都能发现新的insight。建议初学者不要急于跑复杂模型,而是先扎实掌握这些基础技能,它们会在你处理更复杂数据时发挥巨大作用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询