第一个Scikit-learn模型:鸢尾花分类
作者:Weisian
发布时间:2026年2月12日

你离第一个机器学习模型,只有15分钟。
很多人学机器学习最大的痛点不是“难”,而是**“不知道从哪里开始”**:
- 看了大把理论,一行代码没写过
- 数学公式背了一堆,不知道模型长什么样
- 收藏夹里几十个教程,打开第一个就卡在环境配置
今天,我们把这堵墙拆掉。
我们将用 Python 的 Scikit-learn 库,在著名的 鸢尾花(Iris)数据集上,完成一次完整的监督学习流程:
加载数据 → 划分训练/测试集 → 选择模型 → 训练 → 预测 → 评估

这不是玩具演示,而是工业界通用的 ML 工作流雏形。
更重要的是,你会亲眼看到:机器学习编程,和传统编程到底有什么本质不同?
不用等“准备好”,现在就是最好的开始。
一、先回答一个根本问题:什么是机器学习?
还记得之前文章我们说的吗?
传统编程 = 写规则 + 给数据 → 得结果
机器学习 = 给数据 + 给答案 → 得规则(模型)

现在,我们用代码来验证这句话。
🌸 场景:识别鸢尾花种类
鸢尾花有三种:
- Setosa(山鸢尾)
- Versicolor(变色鸢尾)
- Virginica(维吉尼亚鸢尾)
它们长得非常像,但花瓣和萼片的长度/宽度有细微差别。
📌 传统编程怎么做?
你得人工总结规则,比如:
- 如果花瓣长度 < 2.5cm → 是 Setosa
- 如果花瓣宽度 > 1.8cm 且 萼片长度 > 6cm → 是 Virginica
- ……(规则越写越复杂,还容易错)
📌 机器学习怎么做?
你只需要:
结果:模型在没见过的新花上,准确率高达 97%+!
✅ 这就是“从数据中学习规律”,而不是“人工编码逻辑”。
二、典型机器学习工作流(ML Pipeline)
无论你是做图像识别、金融风控还是推荐系统,所有监督学习项目都遵循这个五步流程:
[原始数据]
↓
[特征工程] → (本篇简化,直接用原始特征)
↓
[划分数据:训练集 / 测试集]
↓
[选择模型 → 训练(fit)]
↓
[预测(predict)→ 评估指标]
↓
[部署(可选)]

流程拆解:
今天,我们就用 Scikit-learn 把这五步全部走一遍。
💡 Scikit-learn 是 Python 最主流的 ML 库,接口统一、文档完善、适合入门和工业落地。
三、动手实战:10 行代码跑通鸢尾花分类
Scikit-learn是Python最经典的机器学习库,封装了所有常用算法,不用自己写底层逻辑,几十行代码就能跑通模型。
前置准备:安装依赖
pip install scikit-learn numpy pandas matplotlib
第一步:加载并理解鸢尾花数据集
# 导入必要的库
from sklearn.datasets import load_iris
import pandas as pd
import matplotlib.pyplot as plt
# 加载鸢尾花数据集(内置数据集,无需手动下载)
iris = load_iris()
# 1. 理解数据结构
# 特征数据(花瓣/花萼的长度、宽度):150行×4列
X = iris.data # 特征矩阵
# 品种标签(0=山鸢尾,1=变色鸢尾,2=维吉尼亚鸢尾):150行
y = iris.target
# 特征名称
feature_names = iris.feature_names
# 品种名称
target_names = iris.target_names
# 转换成DataFrame,方便查看
df = pd.DataFrame(X, columns=feature_names)
df['品种'] = [target_names[i] for i in y]
# 打印前5行数据
print("数据集前5行:")
print(df.head())
# 可视化:花瓣长度 vs 花瓣宽度(按品种着色)
plt.scatter(df['petal length (cm)'], df['petal width (cm)'], c=y)
plt.xlabel('花瓣长度 (cm)')
plt.ylabel('花瓣宽度 (cm)')
plt.title('鸢尾花花瓣特征分布')
plt.show()
输出解读:
- 数据集共150朵花,每朵花有4个特征(花萼长度/宽度、花瓣长度/宽度)
- 3个品种的花在花瓣特征上有明显的聚类趋势——这也是模型能分类的基础

第二步:划分训练集和测试集
机器学习不能用“见过的题”考模型,必须拆分数据:
- 训练集(70%-80%):教模型学规则
- 测试集(20%-30%):考模型学得好不好
from sklearn.model_selection import train_test_split
# 拆分数据:80%训练,20%测试
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42 # random_state固定随机拆分结果
)
print(f"训练集样本数:{X_train.shape[0]}")
print(f"测试集样本数:{X_test.shape[0]}")

第三步:训练KNN分类模型
KNN(K近邻)是最简单的分类算法,核心逻辑:“看谁和你最像,你就是谁”。
from sklearn.neighbors import KNeighborsClassifier
# 1. 创建模型实例(选5个邻居)
knn = KNeighborsClassifier(n_neighbors=5)
# 2. 训练模型(喂数据学规则)
knn.fit(X_train, y_train)
print("模型训练完成!")

第四步:评估模型效果
from sklearn.metrics import accuracy_score
# 1. 用测试集做预测
y_pred = knn.predict(X_test)
# 2. 计算准确率(预测对的数量/总数量)
accuracy = accuracy_score(y_test, y_pred)
print(f"模型在测试集上的准确率:{accuracy:.2f}") # 通常能到97%-100%
# 3. 看具体预测结果
print("\\n测试集真实标签:", y_test)
print("测试集预测标签:", y_pred)

第五步:用模型做新预测
训练好的模型可以直接用!比如给一朵新花的特征,预测品种:
# 模拟一朵新鸢尾花的特征:[花萼长度, 花萼宽度, 花瓣长度, 花瓣宽度]
new_flower = [[5.1, 3.5, 1.4, 0.2]]
# 预测品种
pred = knn.predict(new_flower)
pred_name = target_names[pred[0]]
print(f"\\n新鸢尾花的品种预测:{pred_name}")

🎉 到这里。恭喜!你刚刚完成了一次完整的机器学习任务。
四、鸢尾花分类完整代码示例:
# ===================== 机器学习步骤1:导入工具库 =====================
# 1.1 导入sklearn内置的鸢尾花数据集加载函数
from sklearn.datasets import load_iris
# 1.2 导入pandas库(用于数据处理和表格化展示,新手友好)
import pandas as pd
# 1.3 导入matplotlib库(用于数据可视化,注释掉的代码是可视化功能)
import matplotlib.pyplot as plt
# 1.4 导入数据集拆分工具(将数据分为训练集/测试集,核心工具)
from sklearn.model_selection import train_test_split
# 1.5 导入K近邻分类器(本次要使用的机器学习模型)
from sklearn.neighbors import KNeighborsClassifier
# 1.6 导入准确率评估函数(衡量模型预测效果)
from sklearn.metrics import accuracy_score
# ===================== 机器学习步骤2:加载并理解数据 =====================
# 2.1 加载鸢尾花数据集(sklearn内置,无需手动下载,返回字典格式的数据集)
iris = load_iris()
# 2.2 提取核心数据:特征矩阵X(模型的输入)
# X是150行×4列的二维数组,每行代表一朵花,每列代表一个特征(花萼长/宽、花瓣长/宽)
X = iris.data
# 2.3 提取标签向量y(模型的输出/标准答案)
# y是150行的一维数组,取值0/1/2,分别对应3种鸢尾花品种
y = iris.target
# 2.4 提取特征名称(用于后续数据展示,方便理解每列含义)
feature_names = iris.feature_names # 结果:['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
# 2.5 提取品种名称(将数字标签0/1/2映射为具体品种名)
target_names = iris.target_names # 结果:['setosa', 'versicolor', 'virginica']
# 2.6 将特征矩阵转换为DataFrame(pandas表格格式,新手更容易查看数据)
df = pd.DataFrame(X, columns=feature_names)
# 2.7 给表格添加“品种”列(将数字标签替换为具体名称,直观展示)
df['品种'] = [target_names[i] for i in y]
# 2.8 打印数据集前5行(快速检查数据格式、特征含义、品种分布)
print("数据集前5行:")
print(df.head())
# 2.9 可视化花瓣长度和宽度的分布(注释掉,如需查看可取消注释)
# plt.scatter(df['petal length (cm)'], df['petal width (cm)'], c=y) # c=y按品种着色,不同品种用不同颜色
# plt.xlabel('花瓣长度 (cm)') # x轴标签
# plt.ylabel('花瓣宽度 (cm)') # y轴标签
# plt.title('鸢尾花花瓣特征分布') # 图表标题
# plt.show() # 显示图表(可直观看到不同品种的特征聚类趋势)
# ===================== 机器学习步骤3:拆分训练集和测试集 =====================
# 3.1 拆分规则:80%数据用于训练模型(教模型学规律),20%用于测试(验证模型效果)
# random_state=42:固定随机种子,保证每次运行拆分结果一致(新手复现结果必备)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 3.2 打印拆分后的样本数量(验证拆分比例是否正确)
print(f"\\n训练集样本数:{X_train.shape[0]}") # 输出120(150×80%)
print(f"测试集样本数:{X_test.shape[0]}") # 输出30(150×20%)
# ===================== 机器学习步骤4:创建并训练模型 =====================
# 4.1 初始化KNN分类器:n_neighbors=5表示“找最近的5个邻居来投票决定类别”
knn = KNeighborsClassifier(n_neighbors=5)
# 4.2 训练模型:核心动作fit(),让模型从训练数据中学习“特征→品种”的规律
# 入参:X_train(训练特征)、y_train(训练标签/标准答案)
knn.fit(X_train, y_train)
print("\\n模型训练完成!")
# ===================== 机器学习步骤5:模型评估(用测试集验证) =====================
# 5.1 用训练好的模型预测测试集:核心动作predict(),模型根据学习到的规律给出预测结果
y_pred = knn.predict(X_test)
# 5.2 计算准确率:正确预测的数量 / 测试集总数量,%.2f改为%.2%%是将小数转为百分比(更直观)
accuracy = accuracy_score(y_test, y_pred)
print(f"\\n模型在测试集上的准确率:{accuracy:.2%}") # 通常≥97%,代表模型效果很好
# 5.3 打印具体预测结果(新手可对比真实标签和预测标签,看哪里错了)
print("\\n测试集真实标签:", y_test) # 测试集的标准答案
print("测试集预测标签:", y_pred) # 模型的预测答案
# ===================== 机器学习步骤6:模型应用(预测新数据) =====================
# 6.1 模拟一朵新鸢尾花的特征(需和训练数据的特征顺序一致:花萼长、花萼宽、花瓣长、花瓣宽)
new_flower = [[5.1, 3.5, 1.4, 0.2]] # 注意是二维数组(sklearn要求输入必须是二维)
# 6.2 用训练好的模型预测新花的品种
pred = knn.predict(new_flower)
# 6.3 将数字预测结果转换为具体品种名
pred_name = target_names[pred[0]]
# 6.4 打印预测结果
print(f"\\n新鸢尾花的品种预测:{pred_name}") # 输出setosa(山鸢尾)
代码核心分析
1. 整体流程对应机器学习核心逻辑
| 步骤1 | 工具准备 | 导入所需库 | 不用死记库名,知道“load_iris是加载数据、train_test_split是拆分数据、KNeighborsClassifier是模型”即可 |
| 步骤2 | 数据加载与探索 | 理解数据长什么样 | 特征(X)是输入(花的测量值),标签(y)是输出(品种),DataFrame是为了方便查看 |
| 步骤3 | 数据拆分 | 避免模型“作弊” | 训练集是“练习题”,测试集是“考试卷”,模型不能提前看测试集答案 |
| 步骤4 | 模型训练 | 让模型学规律 | fit()是机器学习的核心,模型会自动从X_train和y_train中总结“什么样的特征对应什么品种” |
| 步骤5 | 模型评估 | 验证模型效果 | 准确率是最直观的评估指标,百分比越高说明模型学的越好 |
| 步骤6 | 模型应用 | 解决实际问题 | 训练好的模型可以预测新数据,这是机器学习的最终目的 |
2. 新手易混淆的关键点
- X和y的区别:X是“输入特征”(描述花的属性),y是“输出标签”(花的品种),模型的任务就是学习X→y的映射关系;
- train和test的区别:训练集用来“教”模型,测试集用来“考”模型,必须严格分开,否则评估结果不准;
- fit()和predict()的区别:fit()是“学习过程”(只运行一次),predict()是“应用过程”(可运行无数次,预测新数据);
- new_flower为什么是二维数组:sklearn要求输入的特征必须是“样本数×特征数”的二维结构,哪怕只有1个样本,也要写成[[特征1, 特征2, …]]。
3. 运行结果解读

- 前5行数据显示:前5朵都是setosa(山鸢尾),特征数值很接近;
- 准确率100%:模型在测试集上全答对了(新手可尝试把n_neighbors改成1,看看准确率是否变化);
- 新花预测结果:setosa,说明模型根据输入的特征,判断这朵花是山鸢尾。
小结
五、对比:传统编程 vs 机器学习编程
| 核心动作 | 编写 if-else / for / 函数 | 调用 .fit() 和 .predict() |
| 知识来源 | 程序员的经验和逻辑 | 数据中的统计规律 |
| 新增类别 | 必须手动加新规则 | 只需补充新标签数据,重新训练 |
| 维护成本 | 规则越多越难维护 | 模型自动适应,只需更新数据 |
✅ 一句话破案:
传统编程:你告诉机器每一步怎么做。
机器学习:你给机器看大量例子,它自己学会怎么做。

六、一张图总结:鸢尾花项目全流程
原始数据 ──→ 特征矩阵 X ──→ 训练集 ──→ 训练模型 ──→ 评估
↓ ↓ ↓ ↓ ↓
150条记录 4个数值特征 80%数据 KNN分类器 97%+准确率
(花萼/花瓣) 20%数据 ↓ ↓
测试集 ←── 加载模型 ←── 保存模型
↓
预测新花 → setosa
这个流程,未来会重复上百遍。
每换一个数据集、每换一个业务场景,骨架完全一样。
你只需要换数据、换模型、调参数——思维方式不变。
✅ 这就是机器学习工程师的“肌肉记忆”。

七、为什么选鸢尾花?它有什么特殊意义?
- 历史地位:1936 年由统计学家 Fisher 提出,是机器学习界的“Hello World”
- 数据干净:无缺失值、无噪声、特征少、类别平衡
- 教学价值:能清晰展示分类、可视化、评估全流程
🎯 它不是玩具,而是认知脚手架——帮你建立正确的 ML 思维框架。

八、今天你能带走的三大认知

结语:你已经迈出了最关键的一步
今天你完成了三件大事:
这比90%收藏从未停止、行动从未开始的人,已经多走了100步。
接下来你要做的不是“学更多模型”,而是把这个流程练成条件反射:
- 拿到任何表格数据,第一反应:X在哪?y在哪?
- 见到任何预测问题,第一反应:分类还是回归?
- 训练完任何模型,第一反应:测试集分数多少?
这套思维方式,比记住10个算法更有价值。

总结





