Python 数据分析与机器学习入门 (八):用 Scikit-Learn 跑通第一个机器学习模型
引言:初识 Scikit-Learn
Scikit-learn 是 Python 机器学习领域的黄金标准库。它构建在 NumPy, SciPy 和 Matplotlib 之上,提供了大量用于分类、回归、聚类和降维等任务的算法。Scikit-learn 广受欢迎的原因在于其三大核心优势:
- 一致的 API 设计: 几乎所有的算法都遵循相同的、简洁的接口模式,使得学习和应用新模型变得非常容易。
- 丰富的算法选择: 涵盖了从经典的线性模型到强大的集成方法等绝大多数机器学习算法。
- 强大的生态集成: 与 NumPy 数组和 Pandas DataFrame 无缝集成,是整个 Python 数据科学生态的核心组件之一。
本篇的目标是带领您走完使用 Scikit-learn 构建一个完整机器学习模型的全过程,让您亲身体验其简洁与强大,并为后续更复杂的项目建立信心。
Scikit-Learn 的核心 API 模式
Scikit-learn 的设计哲学是“一致性”。一旦你掌握了一个模型的使用方法,你就几乎掌握了所有模型的使用方法。这个通用的模式可以概括为以下几个步骤,我们称之为“Estimator API”:
-
选择模型类 (Choose a model)
从 Scikit-learn 的模块中导入你需要的模型类。例如,from sklearn.tree import DecisionTreeClassifier
。 -
实例化模型 (Instantiate the model)
创建该模型类的一个实例,并可以设置其超参数(Hyperparameters)。超参数是模型在学习前设置的参数,例如决策树的最大深度。# 超参数 max_depth=3 在实例化时设置 model = DecisionTreeClassifier(max_depth=3)
-
拟合模型 (Fit the model)
使用训练数据来训练模型。这一步通过调用模型的.fit()
方法完成,传入训练集的特征X_train
和标签y_train
。model.fit(X_train, y_train)
-
预测 (Predict)
使用训练好的模型对新数据(通常是测试集)进行预测。这一步通过调用.predict()
方法完成,传入测试集的特征X_test
。predictions = model.predict(X_test)
-
评估 (Evaluate)
比较模型的预测结果和真实的测试集标签,以评估模型性能。这通常通过调用.score()
方法或使用sklearn.metrics
模块中的函数来完成。accuracy = model.score(X_test, y_test)
这个“导入-实例化-拟合-预测-评估”的流程是 Scikit-learn 的核心。掌握了这个模式,你就掌握了使用 Scikit-learn 的钥匙,可以轻松地在不同算法之间切换和实验。
你的第一个模型:决策树分类器实战
为了专注于 Scikit-learn 的工作流程,我们将使用一个简单且干净的内置数据集——鸢尾花(Iris)数据集。这是一个典型的多分类问题,我们的任务是根据四个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)来预测鸢尾花的种类。
步骤 1: 导入库并加载数据
首先,我们导入所有需要的库和函数,并加载 Iris 数据集。load_iris()
函数返回一个类似字典的对象,其中 .data
属性是特征数据,.target
属性是标签数据。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score# 加载数据集
iris = load_iris()
X = iris.data # 特征矩阵
y = iris.target # 标签向量
步骤 2: 划分训练集和测试集
遵循我们在上一篇文章中学到的原则,我们使用 train_test_split
函数将数据划分为训练集和测试集,通常将 30% 的数据作为测试集。random_state
参数用于确保每次运行代码时,随机划分的结果都是一样的,这对于结果复现很重要。
# 划分数据,70% 用于训练,30% 用于测试
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)print(f"训练集大小: {X_train.shape}, 测试集大小: {X_test.shape}")
步骤 3 & 4: 实例化并训练模型
现在我们应用 Scikit-learn 的核心 API 模式。我们选择 DecisionTreeClassifier
作为我们的模型,创建一个实例,然后用训练数据 .fit()
它。
# 1. 实例化决策树分类器
clf = DecisionTreeClassifier()# 2. 使用训练数据训练模型
clf.fit(X_train, y_train)
步骤 5: 进行预测
模型训练好之后,我们用它来对测试集 X_test
进行预测。
# 对测试集进行预测
y_pred = clf.predict(X_test)
步骤 6: 评估模型
最后一步是评估模型的性能。我们将模型预测的 y_pred
与真实的测试集标签 y_test
进行比较。对于分类问题,最直观的评估指标是准确率 (Accuracy),即正确预测的样本占总样本的比例。
# 计算并打印模型的准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy:.2f}")
运行代码后,你可能会看到一个接近 1.00
的准确率,这表明我们的简单决策树模型在这个问题上表现得非常好。
结果解读
准确率为 1.00 意味着我们的模型在测试集上正确预测了所有样本的类别。虽然这是一个非常理想的结果,但在更复杂、更“脏”的真实世界数据集中,达到这样的性能是罕见的。
注意:准确率虽然直观,但并非总是最佳的评估指标,尤其是在处理类别不平衡的数据集时。在后续的项目中,我们将接触到更多评估指标,如精确率 (Precision)、召回率 (Recall) 和 F1 分数 (F1-score)。
总结与展望
恭喜!您已经成功地使用 Scikit-learn 构建、训练并评估了您的第一个机器学习模型。您不仅完成了一个完整的流程,更重要的是,您掌握了 Scikit-learn 通用的 Estimator API,这为您探索更多高级算法铺平了道路。
现在,您已经具备了数据处理、可视化和基础建模的能力。是时候将这些技能整合起来,挑战一个更真实、更复杂的项目了。在下一篇文章中,我们将踏上泰坦尼克号的航程,运用目前所学的一切,预测这艘传奇巨轮上的生还者。