欢迎光临
我们一直在努力

进阶篇-机器学习篇-3--第一行机器学习代码,Scikit-learn模型:鸢尾花的分类

第一个Scikit-learn模型:鸢尾花分类

作者:Weisian
发布时间:2026年2月12日

在这里插入图片描述

你离第一个机器学习模型,只有15分钟。

很多人学机器学习最大的痛点不是“难”,而是**“不知道从哪里开始”**:

  • 看了大把理论,一行代码没写过
  • 数学公式背了一堆,不知道模型长什么样
  • 收藏夹里几十个教程,打开第一个就卡在环境配置

今天,我们把这堵墙拆掉。
我们将用 Python 的 Scikit-learn 库,在著名的 鸢尾花(Iris)数据集上,完成一次完整的监督学习流程:

加载数据 → 划分训练/测试集 → 选择模型 → 训练 → 预测 → 评估
在这里插入图片描述

这不是玩具演示,而是工业界通用的 ML 工作流雏形。
更重要的是,你会亲眼看到:机器学习编程,和传统编程到底有什么本质不同?

不用等“准备好”,现在就是最好的开始。


一、先回答一个根本问题:什么是机器学习?

还记得之前文章我们说的吗?

传统编程 = 写规则 + 给数据 → 得结果
机器学习 = 给数据 + 给答案 → 得规则(模型)

在这里插入图片描述

现在,我们用代码来验证这句话。

🌸 场景:识别鸢尾花种类

鸢尾花有三种:

  • Setosa(山鸢尾)
  • Versicolor(变色鸢尾)
  • Virginica(维吉尼亚鸢尾)

它们长得非常像,但花瓣和萼片的长度/宽度有细微差别。

📌 传统编程怎么做?

你得人工总结规则,比如:

  • 如果花瓣长度 < 2.5cm → 是 Setosa
  • 如果花瓣宽度 > 1.8cm 且 萼片长度 > 6cm → 是 Virginica
  • ……(规则越写越复杂,还容易错)
📌 机器学习怎么做?

你只需要:

  • 准备 150 条带标签的花的数据(每条包含 4 个测量值 + 品种)
  • 告诉模型:“这些是输入,这些是正确答案”
  • 让模型自己学规律
  • 结果:模型在没见过的新花上,准确率高达 97%+!

    ✅ 这就是“从数据中学习规律”,而不是“人工编码逻辑”。


    二、典型机器学习工作流(ML Pipeline)

    无论你是做图像识别、金融风控还是推荐系统,所有监督学习项目都遵循这个五步流程:

    [原始数据]

    [特征工程] → (本篇简化,直接用原始特征)

    [划分数据:训练集 / 测试集]

    [选择模型 → 训练(fit)]

    [预测(predict)→ 评估指标]

    [部署(可选)]

    在这里插入图片描述

    流程拆解:

  • 数据加载:获取并理解数据(比如鸢尾花的特征+品种标签)
  • 特征处理:清洗、转换数据(比如归一化、缺失值填充)
  • 模型训练:用算法从数据中学习规则(今天用KNN算法)
  • 模型评估:看模型预测准不准(用准确率衡量)
  • 模型部署:把模型用到实际场景(比如做个接口供APP调用)
  • 今天,我们就用 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,说明模型根据输入的特征,判断这朵花是山鸢尾。

    小结

  • 这段代码完整覆盖了监督学习的核心流程:数据加载→数据拆分→模型训练→评估→应用,是新手入门机器学习的标准模板;
  • 核心函数记忆:load_iris()(加载数据)、train_test_split()(拆分数据)、fit()(训练)、predict()(预测)、accuracy_score()(评估);
  • 新手重点理解“特征(X)”和“标签(y)”的关系,以及“训练集”和“测试集”的拆分逻辑,这是机器学习的基础认知。

  • 五、对比:传统编程 vs 机器学习编程

    维度传统编程机器学习编程(本例)
    核心动作 编写 if-else / for / 函数 调用 .fit() 和 .predict()
    知识来源 程序员的经验和逻辑 数据中的统计规律
    新增类别 必须手动加新规则 只需补充新标签数据,重新训练
    维护成本 规则越多越难维护 模型自动适应,只需更新数据

    ✅ 一句话破案:
    传统编程:你告诉机器每一步怎么做。
    机器学习:你给机器看大量例子,它自己学会怎么做。

    在这里插入图片描述


    六、一张图总结:鸢尾花项目全流程

    原始数据 ──→ 特征矩阵 X ──→ 训练集 ──→ 训练模型 ──→ 评估
    ↓ ↓ ↓ ↓ ↓
    150条记录 4个数值特征 80%数据 KNN分类器 97%+准确率
    (花萼/花瓣) 20%数据 ↓ ↓
    测试集 ←── 加载模型 ←── 保存模型

    预测新花 → setosa

    这个流程,未来会重复上百遍。
    每换一个数据集、每换一个业务场景,骨架完全一样。
    你只需要换数据、换模型、调参数——思维方式不变。

    ✅ 这就是机器学习工程师的“肌肉记忆”。

    在这里插入图片描述


    七、为什么选鸢尾花?它有什么特殊意义?

    • 历史地位:1936 年由统计学家 Fisher 提出,是机器学习界的“Hello World”
    • 数据干净:无缺失值、无噪声、特征少、类别平衡
    • 教学价值:能清晰展示分类、可视化、评估全流程

    🎯 它不是玩具,而是认知脚手架——帮你建立正确的 ML 思维框架。

    在这里插入图片描述


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

  • 机器学习 ≠ 写复杂算法,而是用标准流程解决预测问题
  • Scikit-learn 的 5 步法(load → split → fit → predict → evaluate)是通用模板
  • 模型的本质是“从带标签数据中归纳规律”,不是执行硬编码规则
  • 在这里插入图片描述


    结语:你已经迈出了最关键的一步

    今天你完成了三件大事:

  • ✅ 跑通了第一个机器学习模型——10行代码,0数学公式
  • ✅ 看懂了监督学习的核心逻辑——核心就是“数据有没有答案”
  • ✅ 走完了完整的工作流——从数据到评估,再到保存和推理
  • 这比90%收藏从未停止、行动从未开始的人,已经多走了100步。

    接下来你要做的不是“学更多模型”,而是把这个流程练成条件反射:

    • 拿到任何表格数据,第一反应:X在哪?y在哪?
    • 见到任何预测问题,第一反应:分类还是回归?
    • 训练完任何模型,第一反应:测试集分数多少?

    这套思维方式,比记住10个算法更有价值。

    在这里插入图片描述


    总结

  • 机器学习的核心是“从数据中学习规律”,区别于传统编程“手写规则”的核心逻辑;
  • Scikit-learn实现机器学习的通用流程为:加载数据→划分训练/测试集→训练模型→预测→评估,这是所有监督学习项目的基础框架;
  • 鸢尾花数据集作为机器学习入门经典案例,其简洁性和代表性能帮助快速建立正确的ML思维,后续可基于该流程扩展到真实业务场景。
    在这里插入图片描述
  • 赞(0)
    未经允许不得转载:171主机测评 » 进阶篇-机器学习篇-3--第一行机器学习代码,Scikit-learn模型:鸢尾花的分类
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址