第 99 课 - 项目实战:机器学习入门项目(使用 scikit-learn)
学习目标
通过本课学习,你将能够:
- 理解机器学习项目的完整流程,包括数据准备、模型选择、训练和评估。
- 使用 scikit-learn 库执行基本的分类任务。
- 掌握数据集划分(训练集/测试集)的重要性和方法。
- 评估分类模型的性能,并理解常用指标(如准确率)。
- 尝试调整一个简单的模型参数,并观察对结果的影响。
核心概念
什么是机器学习?
想象一下,传统编程是"你给计算机明确的指令,它按指令执行"。而机器学习则是"你给计算机大量的数据和期望的结果,让它自己找出其中的规律或规则"。
机器学习主要分为监督学习和无监督学习。本课聚焦于监督学习中的分类问题,就像给计算机看很多"水果"的照片并告诉它"这是苹果"、"那是香蕉",最后让它学会自己判断新照片里是什么水果。
scikit-learn 是什么?
scikit-learn (简称 sklearn) 是 Python 中最流行、最易用的机器学习库之一。它就像一个装满各种标准化机器学习工具的"工具箱",涵盖了从数据预处理、模型训练到评估的完整流程。它的API设计非常一致,让切换不同算法变得很简单。
机器学习项目的基本流程
- 获取数据:找到或创建你的数据集。
- 准备数据:清洗、处理缺失值、转换特征(本课使用已处理好的数据)。
- 划分数据集:将数据分为用于训练模型的"训练集"和用于最终评估的"测试集"。这是防止模型"死记硬背"(过拟合)的关键。
- 选择模型:从
scikit-learn提供的众多算法中选择一个适合你任务的。 - 训练模型:让模型从训练集中学习规律。
- 评估模型:用测试集检验模型的泛化能力。
- 调优与部署:根据评估结果调整参数,最终投入使用。
代码示例
我们将使用经典的 鸢尾花(Iris)数据集。这个数据集包含150朵鸢尾花的4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和它们对应的类别(山鸢尾、变色鸢尾、维吉尼亚鸢尾)。
我们的目标是:根据这4个特征,训练一个模型来预测一朵鸢尾花属于哪个种类。
# 第一步:导入必要的库
from sklearn.datasets import load_iris # 用于加载鸢尾花数据集
from sklearn.model_selection import train_test_split # 用于划分数据集
from sklearn.neighbors import KNeighborsClassifier # 我们选择的模型:K近邻分类器
from sklearn.metrics import accuracy_score # 用于计算准确率
# 第二步:加载数据
# sklearn内置了很多经典数据集,鸢尾花是其中之一。
iris = load_iris()
# iris.data 是特征数据(150个样本,每个样本4个特征)
X = iris.data
# iris.target 是标签(150个样本的类别,0,1,2分别代表三种鸢尾花)
y = iris.target
print("特征数据形状:", X.shape) # 输出: (150, 4)
print("标签数据形状:", y.shape) # 输出: (150,)
print("前5个样本的特征:\n", X[:5])
print("前5个样本的标签:", y[:5])
# 第三步:划分数据集
# test_size=0.3 表示将30%的数据作为测试集,70%作为训练集
# random_state=42 是一个随机种子,确保每次划分结果相同,便于复现
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
print(f"\n训练集样本数: {len(X_train)}")
print(f"测试集样本数: {len(X_test)}")
# 第四步:选择模型并实例化
# K近邻算法:看一个新样本周围最近的K个样本属于什么类别,就把它归为那个类别。
# n_neighbors=3 表示看最近的3个邻居。
model = KNeighborsClassifier(n_neighbors=3)
# 第五步:训练模型
# .fit() 方法就是"学习"的过程
model.fit(X_train, y_train)
print("\n模型训练完成!")
# 第六步:评估模型
# 用训练好的模型去预测测试集的特征
y_pred = model.predict(X_test)
# 将预测结果与真实标签进行比较,计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型在测试集上的准确率: {accuracy:.2%}") # 通常能得到95%以上
# (可选)第七步:进行新数据的预测
# 假设我们有一朵新鸢尾花,测量其特征如下:
new_flower = [[5.1, 3.5, 1.4, 0.2]] # 注意:需要是二维数组(一个样本)
prediction = model.predict(new_flower)
# 将数字标签转为花名
flower_names = iris.target_names
print(f"\n新鸢尾花的特征: {new_flower[0]}")
print(f"预测其种类为: {flower_names[prediction[0]]}")
实践练习
- 基础练习:将
test_size改为0.2(即使用80%的数据训练),重新运行代码,观察准确率有何变化?并解释为什么。 - 进阶练习:尝试将
KNeighborsClassifier的n_neighbors参数分别改为1和5,重新训练和评估模型。哪个参数值下的模型表现更好?思考n_neighbors值过大或过小可能带来的问题。 - 挑战练习:
scikit-learn提供了另一个著名的数据集load_digits(手写数字识别)。请使用类似的方法,加载digits数据集,完成以下任务:- 划分数据集。
- 使用
KNeighborsClassifier(n_neighbors=3)训练模型。 - 评估模型准确率。
- (提示:
from sklearn.datasets import load_digits)
常见错误
- 忘记划分数据集:直接将所有数据用于训练,然后又用同样的数据评估,会导致评估结果虚高,无法反映模型真实性能。
- 评估指标误用:对于分类问题,尤其是在类别不平衡的数据集上,仅看"准确率"可能具有误导性。在后续课程中,我们会学习精确率、召回率、F1分数等更全面的指标。
- 不理解随机性:
train_test_split的random_state参数很重要。如果不固定它,每次运行代码数据划分都不同,导致模型评估结果波动,不利于调试和比较。 - 数据形状错误:
scikit-learn的模型要求特征数据X是二维数组(n_samples, n_features),标签y是一维数组(n_samples,)。直接使用列表或形状错误的数组会报错。 - 过拟合:虽然本课示例不明显,但初学者常错误地追求在训练集上获得100%的准确率。这往往意味着模型"死记硬背"了训练数据,对新数据(测试集)的预测能力反而很差。我们的目标是提高测试集的性能。
小结
本课我们迈出了机器学习实战的第一步:
- 体验了完整流程:从加载数据、划分数据集,到模型训练和评估。
- 掌握了核心工具:使用了
scikit-learn的train_test_split进行数据划分,KNeighborsClassifier作为入门模型,accuracy_score作为评估指标。 - 理解了关键概念:知道了为什么要划分"训练集"和"测试集",以及模型评估的重要性。
- 获得了可运行代码:这是一个可以套用到其他类似分类任务上的模板。
记住,机器学习是一个"实验-评估-改进"的循环过程。通过不断尝试不同的数据处理方法、模型和参数,你会逐渐提升解决实际问题的能力。在下一课,我们将探索更复杂的模型和任务。
练习编辑器
python
Loading...