用 Python 和 sklearn 跑通第一个机器学习分类

举报
静水流深-云海 发表于 2026/10/10 10:28:15 2026/10/10
【摘要】 很多朋友一听到"机器学习"就觉得门槛高,其实用 Python 的 scikit-learn 跑一个分类任务,半小时就能跑通。本文以经典的鸢尾花数据集为例,把环境准备、数据长相、训练预测、模型对比、评估指标和常见坑一次性讲清楚,代码全部可复制运行。

机器学习听起来很玄,但"分类"这件事的本质特别朴素:给你一堆已经标好类别的样本,让模型学会规律,再拿去判断新样本属于哪一类。本文用最经典的鸢尾花(Iris)数据集,带你在本地把整个流程跑通,不玩虚的。

做分类之前先想清楚一件事:你手上的数据是不是"带标签"的?像鸢尾花数据集,每一行都标了它是 setosa、versicolor 还是 virginica,这种叫监督学习;如果数据没标签,那就得用聚类,不是本文的范围。监督分类的核心就一句话——用历史数据拟合一个映射函数:特征 → 类别。

一、环境准备

别一上来就 pip install tensorflow,那属于杀鸡用牛刀。入门分类用 scikit-learn 就够了,它把绝大多数经典算法都封装好了,API 统一、文档友好。

# 建议先建个虚拟环境,避免把依赖装得到处都是
python -m venv venv
source venv/bin/activate      # Windows 用 venv\Scripts\activate

pip install scikit-learn pandas numpy

装完顺手验证一下版本,避免某些老教程在你的新环境里跑不通:

import sklearn, pandas, numpy
print(sklearn.__version__, pandas.__version__, numpy.__version__)

只要不报错、能打印出版本号,环境就齐了。

二、数据到底长什么样

鸢尾花数据集一共 150 条样本,每条有 4 个数值特征,对应 3 个类别。它的字段含义如下:

特征 含义 单位 大致范围
sepal length 花萼长度 cm 4.3 ~ 7.9
sepal width 花萼宽度 cm 2.0 ~ 4.4
petal length 花瓣长度 cm 1.0 ~ 6.9
petal width 花瓣宽度 cm 0.1 ~ 2.5
target 类别标签 — 0 / 1 / 2

值得注意的一点:这 4 个特征量纲一致(都是 cm),所以可以暂时不标准化;但如果你换了自己的业务数据,不同列单位差很多(比如"年龄"和"收入"),一定要先做标准化或归一化,否则数值大的特征会直接盖过小的,模型学偏。
image.png

三、完整可跑代码

下面这段代码是我建议你直接抄去跑的版本,从加载到评估一气呵成:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 1. 加载数据
X, y = load_iris(return_X_y=True)

# 2. 划分训练集 / 测试集,固定 random_state 保证结果可复现
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y
)

# 3. 特征标准化(虽然本例量纲一致,但养成习惯没坏处)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)   # 注意:测试集只用训练集的均值和方差

# 4. 训练模型
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)

# 5. 预测 + 评估
y_pred = model.predict(X_test)
print("准确率:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
print("混淆矩阵:\n", confusion_matrix(y_test, y_pred))

跑出来准确率通常在 0.95 以上。第一次看到这个数字别太兴奋——鸢尾花是"玩具数据集",真实业务数据远没这么友好,但这个流程是通用的。

四、换个模型对比看看

scikit-learn 的好处就是换模型几乎只改一行。下面把四种常见分类器拉出来对比,你一眼就能看出差异:

算法 优点 缺点 适合场景
逻辑回归 快、可解释、概率输出 只能分线性边界 基线模型、可解释要求高
K 近邻 (KNN) 简单、无需训练 预测慢、对量纲敏感 小数据集、边界复杂
决策树 直观、不需标准化 容易过拟合 规则可解释场景
支持向量机 (SVM) 小样本效果好 调参难、大数据慢 中小样本、高维

实际操作中我一般先用逻辑回归当基线,因为它最快、结果也最容易解释;如果基线不够好,再上随机森林或梯度提升这类更强的模型。别一上来就堆复杂模型,基线都还没跑通就调参,纯属浪费时间。

五、评估指标别只看准确率

准确率(accuracy)很直观,但它会骗人。比如 100 个样本里 95 个都是类别 A,模型全猜 A 也能拿 95 分,实际啥也没学会。所以至少要补两个指标:

  • 精确率 (precision):预测为正的样本里,真正为正的比例——关心"预测准不准"。
  • 召回率 (recall):真实为正的样本里,被预测出来的比例——关心"漏没漏"。
  • F1 值:精确率和召回率的调和平均,不平衡数据下的综合分。

还有混淆矩阵,它能告诉你模型具体把哪两类搞混了。分类问题看指标,脑子里一定要同时装着"准确率 + 混淆矩阵",否则容易被一个好看的数字误导。

六、新手最容易踩的坑

  1. 不划分测试集,直接拿全部数据评估:这等于考试前先看答案,分数再高也没意义。
  2. 测试集做了标准化但用了自己的均值:标准化必须只用训练集的统计量,否则就是"数据泄露"。
  3. random_state 不设:每次跑结果都不一样,排查问题时会怀疑人生,先固定再说。
  4. 一上来就上深度学习:鸢尾花这种小数据,深度学习不仅没必要,还容易过拟合。

小结

这篇从环境、数据、代码、模型对比到评估指标,把机器学习分类的标准闭环走了一遍。记住最关键的三点:一定要切分训练/测试集、换模型在 sklearn 里只是换个类、评估不能只盯准确率。把这套流程跑熟,后面换成你自己的业务数据,套路是完全一样的,只不过特征工程和模型调参会花更多心思。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。