要开始使用 Python 进行机器学习,请选择一项小型任务,将数据划分为训练集和测试集,并将简单模型与基础基准进行比较。第一次练习无需租用 GPU。本指南将使用 CPU 构建一个完整的分类器,解读其错误,并确定何时需要调整基础设施。
目标是完成一个您能够复现和解释的实验。单独预测正确一次的价值,不如了解模型看过哪些数据、如何被评估以及在哪些地方会失败。
使用 Python 进行机器学习时首先应学习什么
一个监督学习项目包含输入(称为特征)和已知答案(称为目标)。在本文的示例中,特征是花朵的测量值,目标是物种。模型使用训练集学习一种关系,然后尝试对被留作测试的示例进行分类。
在选择库之前,请先写下您想回答的问题:
| 任务 | 响应类型 | 可行的第一个实验 |
|---|---|---|
| 对一条观测进行分类 | 一个类别 | 逻辑回归或决策树 |
| 估计一个数量 | 一个数值 | 线性回归和误差分析 |
| 查找无标签的组 | 聚类 | 一种聚类方法和对各组的检查 |
| 大规模处理图像或语言 | 更复杂的表示和预测 | 在定义评估方式后,使用合适的深度学习库 |
不要仅仅因为神经网络看起来更先进就选择它。如果简单的解决方案能在所需成本和期限内完成任务,它就是后续任何替代方案的重要基准。
准备隔离的环境
您需要安装与 scikit-learn 兼容的 Python,并且能够访问终端。请创建一个工作文件夹和虚拟环境,以避免与其他项目发生冲突:
python -m venv .venv
在 macOS 或 Linux 上,使用 source .venv/bin/activate 激活。在 Windows PowerShell 中,请根据本地终端策略使用 .venv\Scripts\Activate.ps1。然后安装该库并记录版本:
python -m pip install scikit-learn
python -m pip freeze > requirements.txt
如果您计算机上的可执行文件名是 python3,请使用它代替 python。依赖文件有助于重建环境;还应保存 Python 版本、代码和实验配置。
第一个完整模型:花卉分类
scikit-learn 的 Iris 数据集包含 150 条观测、四个数值特征和三个类别。它体量小,适合学习工作流程,但不能证明一个系统已准备好处理真实数据。
将以下代码保存为 exemplo_iris.py,然后运行 python exemplo_iris.py。它使用 120 条观测进行训练,30 条进行测试。分层划分会保持各类别的比例;固定随机种子使您能够复现相同的划分。
import platform
from time import perf_counter
import sklearn
from sklearn.datasets import load_iris
from sklearn.dummy import DummyClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, f1_score, confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.20, random_state=42, stratify=y
)
models = {
"baseline": DummyClassifier(strategy="most_frequent"),
"logistica": make_pipeline(
StandardScaler(), LogisticRegression(max_iter=1000)
),
}
for name, model in models.items():
start = perf_counter()
model.fit(X_train, y_train)
train_seconds = perf_counter() - start
pred = model.predict(X_test)
print(name, "acuracia=", round(accuracy_score(y_test, pred), 3),
"f1_macro=", round(f1_score(
y_test, pred, average="macro", zero_division=0
), 3))
print("matriz de confusao:", confusion_matrix(y_test, pred).tolist())
print("tempo de treino (s):", round(train_seconds, 6))
print("Python:", platform.python_version(),
"scikit-learn:", sklearn.__version__)
DummyClassifier 提供了一个不学习特征与类别之间关系的比较基准。使用此处的策略时,它会预测训练集中最常见的类别。如果更复杂的模型无法改进这样的基准,请先检查数据、目标和评估方式,再投入更多资源。有关策略,请参阅 DummyClassifier 文档。
逻辑回归通过一个 Pipeline 接收数据:先进行标准化,然后使用分类器。转换在训练集上拟合,并重新应用于测试集。这样可以避免使用本应保留用于评估的信息来计算尺度,这是一种常见的数据泄漏形式。scikit-learn 最佳实践文档解释了这一注意事项。
如何正确解读输出结果
在本示例的 CPU 运行中,使用 Python 3.14.4 和 scikit-learn 1.9.1,我们得到了以下结果。这些是该练习和该数据划分下的结果,并不代表对其他数据集的承诺。
| 模型 | 测试准确率 | 宏平均 F1 |
|---|---|---|
| 最常见类别基线 | 0,333 | 0,167 |
| 标准化 + 逻辑回归 | 0,933 | 0,933 |
第二个模型的矩阵为 [[10, 0, 0], [0, 9, 1], [0, 1, 9]]:测试集中的 30 朵花中,有两朵在最后两个类别之间被混淆。这比仅仅说模型的正确率约为 93% 更具信息量。
准确率表示评估数据集中预测正确的比例。宏平均 F1会计算每个类别的 F1,并取平均值,而不会给出现频率更高的类别更大的权重。混淆矩阵显示哪些类别被相互混淆。请结合这三种解读来理解模型行为,而不是只寻找最大的数字。
输出的时间仅是该次运行在您的计算机上的训练时间。对于如此小的数据集,它会随机器和测量噪声而变化。不要用这个数字来承诺云成本节省,或比较 CPU 和 GPU。
Iris 的结果也不应成为您产品准确率的预期。在自有数据上,分布、标签质量以及错误成本可能完全不同。一次罕见的失败可能比数十次容易的正确预测更重要。
在更换算法之前,请回答:
- 模型是否在完全相同的测试集上超过了基础基线?
- 哪一类集中了错误,这些错误对任务有什么影响?
- 输入中是否包含只有在预测之后才能获得的信息?
- 测试集是否代表新样本,还是包含与训练集重复或相关的观测值?
- 性能是否能在其他有效的数据划分中保持一致?
从练习到真实数据集
随机划分对 Iris 很方便。但如果您要预测未来事件、每个客户有多行数据,或遇到同一观测值的副本,它可能并不合适。在这些情况下,请根据模型的实际使用方式,考虑按时间或按组划分。参数 random_state 无法修正概念上错误的数据划分。train_test_split 参考文档描述了这种简单划分可用的控制选项。
保留验证集用于选择配置,并保持一个独立的最终测试集。如果您反复查看测试集来决定下一次调整,它就会开始影响您的选择。对于小型项目,一份实验电子表格已经很有帮助:
| 记录项 | 记录内容 |
|---|---|
| 数据 | 来源、日期、大小、列和排除规则 |
| 划分 | 按时间、按组或随机;适用时记录随机种子 |
| 模型 | 算法、参数和依赖项版本 |
| 评估 | 主要指标、各类别错误情况以及与基线的比较 |
| 运行 | 时间、内存、工件大小和实测成本 |
| 决策 | 有哪些改进,以及什么问题仍未解决 |
当您用自己的表格替换 Iris 时,请在训练前验证数据类型、缺失字段和类别。请将转换与模型放在一起,以便预测时使用相同的数据准备过程。即使代码仍能执行,单位发生变化的列也可能导致问题。
GPU 何时有帮助,以及何时没有帮助
本指南的示例在 CPU 上运行。向机器添加显卡并不会自动让所有 scikit-learn 代码使用它。该项目记录了对有限一组估计器和配置的 GPU 支持,包括通过特定输入和选项提供的支持。请确认所选算法的确切执行路径。
当存在兼容的实现,并且工作负载能够利用 GPU 时,GPU 值得进行实验,例如某些神经网络训练或批处理。即便如此,性能收益也需要抵消数据传输、环境准备和基础设施成本。
| 观察到的情况 | 建议的下一步操作 |
|---|---|
| 数据较少且在 CPU 上训练很快 | 优先关注数据质量和评估 |
| 读取或准备工作占用了大部分时间 | 测量存储、加载和转换环节 |
| 算法没有兼容 GPU 的执行路径 | 重新评估该库,或继续使用 CPU |
| 兼容 GPU 的训练占据了周期的大部分时间 | 在候选配置上执行受控测试 |
| 模型较大或推理量较高 | 使用实际负载测量内存、延迟和并发能力 |
比较获得有用结果所需的总时间,而不只是单个操作的执行时间。应包括安装、传输、训练、验证、存储和空闲时间。每个周期更快的替代方案,如果需要更多尝试才能达到所需质量,反而可能更差。
当项目进入这一阶段时,Flatkey Cloud GPU 可用于评估租用 NVIDIA GPU 的选项。请确认目标负载所需的配置、区域、可用性和条件。准备好数据集规模、所用库、所需内存和测试目标;完成本教程并不需要租用 GPU。
在将模型投入使用之前
定义可接受的输入格式、无效字段的处理方式,以及发布后如何跟踪错误。将模型版本与数据准备过程一同保存。在考虑扩展规模之前,先在 notebook 之外使用具有代表性的数据测试一次预测。
如果下一步是在自有基础设施上部署语言模型,vLLM 部署指南讨论的是另一种类型的负载。不要将小型表格分类器与 LLM 的运行混为一谈:它们对内存、评估和服务器的要求不同。
常见问题
学习使用 Python 进行机器学习需要 GPU 吗?
不需要。所展示的示例可以在 CPU 上运行。只有在存在已测得的瓶颈,并且实现能够利用更大规模基础设施时,才选择它。
为什么要在使用更复杂的模型之前先使用基础基准?
它能展示通过简单规则可以获得什么结果。这样可以评估模型是否学到了有用的内容,以及额外的复杂性是否合理。
相同的随机种子能保证在任何环境中得到相同结果吗?
它会固定由该参数控制的随机选择。还应记录版本和环境;实现和执行方式的差异可能会影响结果。不要将一次划分的可重复性误认为是性能的通用保证。
Iris 之后的下一个项目是什么?
选择一项小型任务:使用你理解的数据、可验证的目标和成功标准。重复这一流程:基准、正确划分、模型、错误分析和测量。这个习惯是让你在不提前增加成本的情况下,逐步提升使用 Python 进行机器学习能力的基础。



