第 8 课:用 Scikit-learn 构建你的第一个机器学习模型
学习目标
通过本课学习,你将能够:
- 理解 Scikit-learn 库的基本功能和在机器学习流程中的作用。
- 掌握使用 Scikit-learn 加载内置数据集、分割训练集与测试集的方法。
- 学会初始化一个机器学习模型,并完成训练与预测的基本流程。
- 使用 Scikit-learn 提供的评估指标来衡量模型的性能。
- 完整地走通一个从数据准备到模型评估的机器学习入门项目。
核心概念
1. Scikit-learn 是什么? 想象一下,如果你想组装一台电脑,你需要处理器、显卡、内存等零件。在机器学习中,算法就是这些零件。Scikit-learn 就是一个巨大的、标准化的“零件仓库”。它提供了各种经典的机器学习算法(如线性回归、决策树、支持向量机)以及数据处理、模型评估等工具,让你无需从零开始实现算法,可以直接调用。
2. 机器学习的基本工作流程 使用 Scikit-learn 构建模型通常遵循一个固定、清晰的“四步法”:
- 准备数据:加载数据,并将其划分为“训练集”和“测试集”。训练集用于教模型,测试集用于检验模型的学习成果。
- 选择与创建模型:根据问题类型(分类、回归等),从 Scikit-learn 中选择一个合适的算法类,并创建一个模型实例。
- 训练模型:使用训练数据(特征
X_train和标签y_train)调用模型的.fit()方法,让模型学习数据中的规律。 - 预测与评估:用训练好的模型对测试数据进行预测(
.predict()),然后将预测结果与真实的测试标签进行比较,使用评估指标来量化模型的优劣。
代码示例
下面我们用经典的“鸢尾花分类”问题,完整演示这个四步流程。
# 步骤 0: 导入必要的库
# sklearn.datasets 用于加载内置数据集
# sklearn.model_selection 用于数据分割
# sklearn.neighbors 包含了K近邻分类算法
# sklearn.metrics 包含了评估指标
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
# 步骤 1: 准备数据
# 加载内置的鸢尾花数据集。data是特征(花瓣、花萼的长宽),target是类别标签(0,1,2三种花)。
iris = datasets.load_iris()
X = iris.data # 特征数据
y = iris.target # 标签数据
# 将数据集分割为训练集(70%)和测试集(30%)。random_state用于固定随机种子,保证每次分割结果相同。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
print("训练集样本数:", len(X_train))
print("测试集样本数:", len(X_test))
# 步骤 2: 选择与创建模型
# 这里我们选择 K-近邻(KNN)分类器,并设置邻居数为3。
model = KNeighborsClassifier(n_neighbors=3)
# 步骤 3: 训练模型
# 使用训练数据进行拟合(学习)。
model.fit(X_train, y_train)
# 步骤 4: 预测与评估
# 使用训练好的模型对测试集进行预测。
y_pred = model.predict(X_test)
# 评估模型性能
# 准确率:预测正确的样本数 / 总样本数
accuracy = accuracy_score(y_test, y_pred)
print(f"\n模型在测试集上的准确率: {accuracy:.2f}")
# 分类报告:提供更详细的评估,包括每个类别的精确率、召回率等。
print("\n详细分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
代码运行结果示例:
训练集样本数: 105
测试集样本数: 45
模型在测试集上的准确率: 1.00
详细分类报告:
precision recall f1-score support
setosa 1.00 1.00 1.00 19
versicolor 1.00 1.00 1.00 13
virginica 1.00 1.00 1.00 13
accuracy 1.00 45
macro avg 1.00 1.00 1.00 45
weighted avg 1.00 1.00 1.00 45
(注意:由于数据分割的随机性,你的具体数值可能略有不同,但本例准确率应非常高。)
实践练习
练习 1(基础):手写数字识别入门
使用 Scikit-learn 内置的 digits 数据集(包含0-9的手写数字图像特征)。
- 加载
digits数据集。 - 将数据分割为训练集和测试集(建议 test_size=0.2)。
- 初始化一个
KNeighborsClassifier(可尝试n_neighbors=5)。 - 训练模型并在测试集上进行预测。
- 计算并打印模型的准确率。
练习 2(进阶):尝试不同的模型
延续练习 1 的 digits 数据集。
- 尝试将分类器换成
DecisionTreeClassifier(从sklearn.tree导入)。 - 使用相同的训练集和测试集进行训练和预测。
- 对比两个模型(KNN 和 决策树)在测试集上的准确率,哪个更好?(提示:只需比较
accuracy_score的数值)
练习 3(应用):回归问题初体验 机器学习不只有分类,还有回归(预测连续值)。
- 加载 Scikit-learn 的
diabetes数据集(预测糖尿病进展)。 - 数据分割。
- 从
sklearn.linear_model导入LinearRegression,初始化并训练模型。 - 对测试集进行预测。由于回归任务,评估指标不同,可以使用
from sklearn.metrics import mean_squared_error来计算均方误差(MSE)。 - 打印均方误差值。
常见错误
- 忘记分割数据集:将全部数据用于训练,然后又用同一批数据测试模型。这会导致评估结果过于乐观,模型在真正的新数据上表现会很差。
- 正确做法:始终使用
train_test_split将数据分为训练和测试两部分。
- 正确做法:始终使用
- 使用测试集来训练或调参:在调整模型参数(如KNN中的K值)时,反复使用测试集评估会导致“信息泄露”,测试集不再能客观反映模型的泛化能力。
- 进阶提示:在更严谨的实践中,会引入“验证集”或“交叉验证”来调参,测试集仅在最终评估时使用一次。
- 未处理类别特征:某些算法(如线性模型)要求输入特征是数值型。如果你的数据中包含“红”、“绿”、“蓝”这样的字符串特征,直接输入会导致错误。
- 解决方法:需要使用如
sklearn.preprocessing.LabelEncoder或OneHotEncoder进行编码转换。
- 解决方法:需要使用如
小结
- Scikit-learn 是进行机器学习实践的高效工具箱,其 API 设计遵循“创建-训练-预测”的统一模式。
- 核心流程是:加载数据 -> 分割数据 -> 选择模型 -> 训练模型 (
fit) -> 预测 (predict) -> 评估 (score或 metrics)。 - 评估是关键:一定要在未参与训练的测试集上评估模型,才能了解其真实性能。准确率、均方误差等是常用的评估指标。
- 从今天开始,你已经具备了独立完成一个基础机器学习项目的能力。现在,打开你的编辑器,开始练习吧!这是迈向数据科学家的第一步。
练习编辑器
rust
Loading...