前面几篇文章讲了人工智能概念、机器学习流程、模型训练评估和神经网络基础。这一篇用一个小实战把流程跑通:使用 Python 和 scikit-learn 完成一个二分类任务。
这个例子使用 scikit-learn 内置的 breast cancer 数据集,不需要额外下载文件。重点不是追求最高分,而是完整经历数据加载、拆分、标准化、训练、预测和评估。
注意:这个数据集只用于机器学习教学练习,不能用于医疗判断或现实诊断。本文关注的是分类流程,而不是医学结论。
一、准备环境
建议先创建虚拟环境,再安装依赖:
python3 -m venv .venv
source .venv/bin/activate
pip install scikit-learn
本文只使用 scikit-learn,不依赖深度学习框架。这样可以把注意力放在机器学习的基本流程上。
二、完整代码
下面是一份可以直接运行的代码:
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
def main():
dataset = load_breast_cancer()
X = dataset.data
y = dataset.target
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.2,
random_state=42,
stratify=y,
)
model = Pipeline(
steps=[
("scaler", StandardScaler()),
("classifier", LogisticRegression(max_iter=500)),
]
)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Confusion matrix:")
print(confusion_matrix(y_test, y_pred))
print("Classification report:")
print(classification_report(y_test, y_pred, target_names=dataset.target_names))
if __name__ == "__main__":
main()
保存为 ai_classification_demo.py 后运行:
python ai_classification_demo.py
如果你第一次运行时下载或导入依赖较慢,可以先确认虚拟环境已经启用,并用 python -c "import sklearn; print(sklearn.__version__)" 检查 scikit-learn 是否安装成功。
三、数据集是什么
load_breast_cancer() 会返回一个二分类数据集。每条样本包含多个数值特征,标签表示样本属于哪一类。
在代码里:
X是特征矩阵,每一行是一条样本y是标签数组,每个元素对应一条样本的类别dataset.target_names保存类别名称
这个数据集已经被整理成数值特征,适合用来练习基础分类流程。
四、为什么要拆分训练集和测试集
代码中使用了 train_test_split():
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.2,
random_state=42,
stratify=y,
)
这里 test_size=0.2 表示 20% 数据用于测试。stratify=y 表示划分后尽量保持类别比例一致,这对分类任务很有用。
如果不拆分测试集,只在训练集上看结果,模型可能只是记住了训练样本,而不是真的具备泛化能力。
五、为什么使用 Pipeline
代码里没有单独先标准化再训练,而是使用了 Pipeline:
model = Pipeline(
steps=[
("scaler", StandardScaler()),
("classifier", LogisticRegression(max_iter=500)),
]
)
这样做有两个好处:
- 标准化和模型训练被放在同一个流程里,不容易漏步骤
- 测试集会使用训练集上学到的标准化参数,避免数据泄漏
数据泄漏是初学者常见错误。如果你先对完整数据做标准化,再拆分训练集和测试集,测试集的信息就已经提前影响了训练过程。
六、模型为什么选逻辑回归
逻辑回归是分类任务里非常经典的基线模型。它训练速度快、结果稳定、容易解释,适合作为入门模型。
这里没有直接使用神经网络,是因为入门时先跑通完整流程更重要。等你能解释这段代码的每一步,再换成随机森林、支持向量机或神经网络会更自然。
七、怎么看评估结果
代码会输出三类结果:
Accuracy:整体预测正确比例confusion_matrix:模型把哪些类别预测错了classification_report:precision、recall、F1-score 等指标
如果准确率很高,也不要马上结束。你还应该看混淆矩阵,确认模型主要错在哪一类;再看 recall 和 precision,判断错误类型是否符合业务要求。
八、一次可复查的预期输出
不同 scikit-learn 版本可能让最后几位小数略有变化,但运行同一份代码时,输出结构应该类似下面这样。重点不是记住具体数字,而是确认你能解释每个指标来自哪里。
Accuracy: 0.97...
Confusion matrix:
[[40 3]
[ 1 70]]
Classification report:
precision recall f1-score support
malignant ... ... ... 43
benign ... ... ... 71
如果你的准确率明显低很多,先检查三件事:是否使用了 stratify=y,是否把 StandardScaler 放进了 Pipeline,以及 LogisticRegression(max_iter=500) 是否正常收敛。
九、可以继续尝试什么
跑通代码后,可以做几个小实验:
- 把
test_size改成 0.3,观察结果是否稳定 - 去掉
StandardScaler,比较指标变化 - 把
LogisticRegression换成RandomForestClassifier - 打印
dataset.feature_names,理解每个特征的含义 - 尝试找出预测错误的样本索引,看看它们有什么特点
人工智能基础学习的关键,是把每个例子都拆成可解释的步骤。你不只是运行了一个分类模型,而是完整走过了一次机器学习工作流。
十、对照实验怎么设计
小实战最有价值的部分是对照实验。不要一次改很多东西,否则不知道结果变化来自哪里。建议一次只改一个变量,并记录指标变化。
| 实验 | 只改变什么 | 观察重点 |
|---|---|---|
| 去掉标准化 | 删除 StandardScaler |
逻辑回归是否更难收敛,指标是否下降 |
| 改变测试集比例 | test_size 从 0.2 改成 0.3 |
指标波动是否仍在可接受范围 |
| 更换模型 | 换成随机森林 | 是否真正超过基线,错误类型是否改变 |
| 去掉分层抽样 | 删除 stratify=y |
类别比例是否变化,少数类 recall 是否不稳定 |
这样做能帮助你从“跑通代码”过渡到“理解实验”。一个结果是否可靠,通常不是看一次分数,而是看在合理扰动下是否仍然稳定。
十一、把这个练习写进学习笔记
建议你运行完代码后,记录下面几项:
- 数据集有多少样本、多少特征、几个类别
- 训练集和测试集分别有多少样本
- 准确率、precision、recall 和 F1-score 分别是多少
- 混淆矩阵里哪一类错误更多
- 去掉标准化或换模型后,结果有什么变化
这些记录比单纯截图一个准确率更有价值,因为它们能帮助你解释实验,而不是只保存结果。
十二、系列回顾
这篇文章把前面的内容落到了代码上。需要回看概念时,可以从 人工智能基础学习路线 重新开始,也可以回到 博客页 查看完整系列。