99·模块十八:综合项目实战高级

项目实战:机器学习入门项目(使用 scikit-learn)

projectmachine-learningscikit-learn

第 99 课 - 项目实战:机器学习入门项目(使用 scikit-learn)

学习目标

通过本课学习,你将能够:

  1. 理解机器学习项目的完整流程,包括数据准备、模型选择、训练和评估。
  2. 使用 scikit-learn 库执行基本的分类任务。
  3. 掌握数据集划分(训练集/测试集)的重要性和方法。
  4. 评估分类模型的性能,并理解常用指标(如准确率)。
  5. 尝试调整一个简单的模型参数,并观察对结果的影响。

核心概念

什么是机器学习?

想象一下,传统编程是"你给计算机明确的指令,它按指令执行"。而机器学习则是"你给计算机大量的数据和期望的结果,让它自己找出其中的规律或规则"。

机器学习主要分为监督学习无监督学习。本课聚焦于监督学习中的分类问题,就像给计算机看很多"水果"的照片并告诉它"这是苹果"、"那是香蕉",最后让它学会自己判断新照片里是什么水果。

scikit-learn 是什么?

scikit-learn (简称 sklearn) 是 Python 中最流行、最易用的机器学习库之一。它就像一个装满各种标准化机器学习工具的"工具箱",涵盖了从数据预处理、模型训练到评估的完整流程。它的API设计非常一致,让切换不同算法变得很简单。

机器学习项目的基本流程

  1. 获取数据:找到或创建你的数据集。
  2. 准备数据:清洗、处理缺失值、转换特征(本课使用已处理好的数据)。
  3. 划分数据集:将数据分为用于训练模型的"训练集"和用于最终评估的"测试集"。这是防止模型"死记硬背"(过拟合)的关键。
  4. 选择模型:从 scikit-learn 提供的众多算法中选择一个适合你任务的。
  5. 训练模型:让模型从训练集中学习规律。
  6. 评估模型:用测试集检验模型的泛化能力。
  7. 调优与部署:根据评估结果调整参数,最终投入使用。

代码示例

我们将使用经典的 鸢尾花(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]]}")

实践练习

  1. 基础练习:将 test_size 改为 0.2(即使用80%的数据训练),重新运行代码,观察准确率有何变化?并解释为什么。
  2. 进阶练习:尝试将 KNeighborsClassifiern_neighbors 参数分别改为 15,重新训练和评估模型。哪个参数值下的模型表现更好?思考 n_neighbors 值过大或过小可能带来的问题。
  3. 挑战练习scikit-learn 提供了另一个著名的数据集 load_digits(手写数字识别)。请使用类似的方法,加载 digits 数据集,完成以下任务:
    • 划分数据集。
    • 使用 KNeighborsClassifier(n_neighbors=3) 训练模型。
    • 评估模型准确率。
    • (提示:from sklearn.datasets import load_digits

常见错误

  1. 忘记划分数据集:直接将所有数据用于训练,然后又用同样的数据评估,会导致评估结果虚高,无法反映模型真实性能。
  2. 评估指标误用:对于分类问题,尤其是在类别不平衡的数据集上,仅看"准确率"可能具有误导性。在后续课程中,我们会学习精确率、召回率、F1分数等更全面的指标。
  3. 不理解随机性train_test_splitrandom_state 参数很重要。如果不固定它,每次运行代码数据划分都不同,导致模型评估结果波动,不利于调试和比较。
  4. 数据形状错误scikit-learn 的模型要求特征数据 X 是二维数组 (n_samples, n_features),标签 y 是一维数组 (n_samples,)。直接使用列表或形状错误的数组会报错。
  5. 过拟合:虽然本课示例不明显,但初学者常错误地追求在训练集上获得100%的准确率。这往往意味着模型"死记硬背"了训练数据,对新数据(测试集)的预测能力反而很差。我们的目标是提高测试集的性能。

小结

本课我们迈出了机器学习实战的第一步:

  • 体验了完整流程:从加载数据、划分数据集,到模型训练和评估。
  • 掌握了核心工具:使用了 scikit-learntrain_test_split 进行数据划分,KNeighborsClassifier 作为入门模型,accuracy_score 作为评估指标。
  • 理解了关键概念:知道了为什么要划分"训练集"和"测试集",以及模型评估的重要性。
  • 获得了可运行代码:这是一个可以套用到其他类似分类任务上的模板。

记住,机器学习是一个"实验-评估-改进"的循环过程。通过不断尝试不同的数据处理方法、模型和参数,你会逐渐提升解决实际问题的能力。在下一课,我们将探索更复杂的模型和任务。

练习编辑器

python
Loading...

继续学习

完成本课后,建议继续学习下一课「毕业项目:自选主题与完整项目展示」 以巩固所学知识。