
Python 中用于机器学习建模的 10 个单行代码
图片来源:编辑 | Midjourney
构建机器学习模型现在已是人人都能掌握的本领。这一切只需要对人工智能(AI)这一领域的知识有所了解,并掌握一些编程技能。为了以编程方式、优雅且紧凑地构建机器学习模型,Python 通常是当今的首选。
本文将对常见的 Python 编程实践进行一次富有洞察力、实用的介绍,并结合机器学习模型的构建。具体来说,我们将探讨 Python 编写单行代码(一行代码即可高效、简洁地完成有意义的任务)的能力,以阐述10 个常见且有用的单行代码,它们对于构建、评估和验证能够从数据中学习的模型至关重要。
1. 从 CSV 数据集加载 Pandas DataFrame
大多数经典的机器学习模型都使用结构化或表格数据。在这些情况下,Pandas 库无疑是方便的解决方案,可以将这些数据存储到 DataFrame
对象中,这些对象非常适合包含行-列结构的数据观测。因此,当您编写程序来构建机器学习模型时,此单行代码可能是您最早使用的代码之一。
1 |
df = pd.read_csv("path_to_dataset.csv") |
这里,数据集的路径可以是公共数据集的 URL(例如,GitHub 存储库中可用的原始文件)或编程环境的本地文件。
有时,诸如 Scikit-learn 之类的机器学习建模库会提供样本数据集目录,例如用于对花卉种类进行分类的鸢尾花数据集。在这些情况下,上面的单行代码可以这样使用,并带有附加参数来指定数据属性的名称。
1 |
df = pd.DataFrame(load_iris().data, columns=load_iris().feature_names) |
2. 删除缺失值
现实世界的数据集中一个常见的问题是某些属性存在缺失值。虽然有一些策略可以估计(填充)这些值,但在某些情况下,简单地删除包含缺失值的数据实例可能是更好的解决方案,尤其是在非高风险场景中,并且包含缺失值的观测比例非常小的情况下。
起初,有些人可能会认为您需要一个循环来遍历整个数据集,逐行检查是否存在缺失值。但事实并非如此,这个简单的单行代码可以应用于包含在 Pandas DataFrame
中的数据集,一次性自动删除所有此类条目。
1 |
df_clean = df.dropna() |
在这里,我们从原始 DataFrame(df
)创建了一个新的 DataFrame
(df_clean
),其中删除了带有缺失值的行(dropna()
)。在此处 阅读有关 dropna()
函数的更多信息。
3. 将分类特征进行数值编码
独热编码是一种常见的编码分类特征(例如,大小:小、中、大)的方法,将其转换为多个二进制属性,通过值 1(或 0)指示实例是否属于原始特征的每个可能类别。
例如,一个中等大小的比萨实例可以描述为——而不是使用分类特征“大小”——使用三个独热编码特征,每个特征代表一个可能的大小(small_size
、medium_size
、large_size
),使得这个比萨在新的特征 size_medium
上具有值为 1,而在与小尺寸和中等尺寸相关联的其他两个新特征上具有值为 0。Pandas 提供了 get_dummies()
函数来无缝实现这一点。
1 |
df_encoded = pd.get_dummies(df, drop_first=True) |
在上面的代码中,get_dummies()
函数接受原始 DataFrame
(df
),删除第一个类别(drop_first=True
),并返回一个独热编码的 DataFrame
,该 DataFrame
被赋值给 df_encoded
。
4. 分割数据集用于训练和测试
在构建任何机器学习模型时,这一点都极为重要:我们必须分割我们的原始数据集,以便只有一部分用于训练模型,然后其余部分用于进行一些测试预测,并初步了解模型在面对未来未见过的数据时的性能。借助 Scikit-learn 库及其 model_selection
模块,使用 train_test_split()
函数可以使此分区过程变得非常容易。
1 |
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) |
上面的例子随机将数据观测分割成一个训练集(包含原始观测的 80%)和一个测试集(包含剩余的 20% 实例)。在此处 阅读有关 train_test_split()
的各种参数和选项的更多信息。
5. 初始化和训练 Scikit-learn 模型
您无需先初始化您的机器学习模型——例如,一个逻辑回归分类器——然后再在单独的指令中训练它。您可以像这样一次完成这两项操作。
1 |
model = LogisticRegression().fit(X_train, y_train) |
想想您将节省的时间和代码行数!
6. 评估测试数据上的模型准确率
一旦您使用训练数据和标签构建了机器学习模型,您就可以使用此单行代码来快速查看模型在之前分割原始数据集时保留下来的测试数据上的准确率。
1 |
accuracy = model.score(X_test, y_test) |
虽然这对于对模型性能进行初步了解是有效的,但在大多数实际应用中,您可能希望使用多种更复杂的指标的组合,以全面了解模型在不同类型数据上的表现。
7. 应用交叉验证
交叉验证是一种更系统、更严谨的方法,用于仔细评估您的机器学习模型的性能,更重要的是,评估其在新数据上的泛化能力。
此单行代码通过简单地指定要验证的模型、测试数据和标签,以及数据在验证过程中应分割成的折数,提供了一种非常快速的执行交叉验证的方法。
1 |
scores = cross_val_score(model, X, y, cv=5) |
有关交叉验证的更多信息,请在此处 查看。
8. 进行预测
这是一个非常简单但必不可少的操作,用于利用您新构建的机器学习模型!Scikit-learn 的 predict()
函数接受一组测试数据实例,并返回它们的预测列表。
1 |
preds = model.predict(X_test) |
您通常可以使用返回的预测列表(preds
)来将其与这些观测的实际标签进行比较,从而获得模型准确率的客观衡量。
9. 特征缩放
许多机器学习模型在数据首先标准化到通用尺度后效果更好,尤其是在数值范围因特征而异的情况下。这是您可以使用 Scikit-learn 的 StandardScaler
对象以单行代码完成此操作的方法。
1 |
X_scaled = StandardScaler().fit_transform(X) |
生成的 X_scaled DataFrame
将通过减去均值并缩放到单位方差来缩放 X DataFrame
的特征,计算公式为:
\[
z = \frac{x – \mu}{\sigma}
\]
在此处 阅读有关 Scikit-learn 的 StandardScaler
的更多信息。
10. 构建预处理和模型训练管道
这个单行代码看起来很酷(在此作者看来),但其适用性和可解释性取决于您需要封装到单个管道中的过程的复杂性。Scikit-learn 的 make_pipeline()
函数从估计器创建 Pipeline
对象。
1 |
pipe = make_pipeline(StandardScaler(), LogisticRegression()).fit(X_train, y_train) |
上面的管道将数据集的特征缩放、模型初始化和模型训练作为一个统一的过程来管理。
这特别推荐用于数据准备和模型训练阶段相对简单、易于链接的管道。将上面相对易于理解的管道与下面的管道进行比较:
1 2 3 4 5 6 7 8 9 10 11 |
# 一个不合理的复杂管道 crazy_pipe = make_pipeline( SimpleImputer(strategy="constant", fill_value=-1), PolynomialFeatures(degree=6, include_bias=True), StandardScaler(with_std=False), PCA(n_components=8), MinMaxScaler(feature_range=(0, 10)), SelectKBest(score_func=f_classif, k=4), LogisticRegression(penalty="elasticnet", l1_ratio=0.5, solver="saga", max_iter=20000), CalibratedClassifierCV(cv=4, method="isotonic") ).fit(X_train, y_train) |
在这个“不合理”的管道中:
SimpleImputer(strategy="constant", fill_value=-1):
用任意哨兵值替换缺失数据PolynomialFeatures(degree=6):
创建 6 次交互项,导致特征空间爆炸StandardScaler(with_std=False):
使每个特征中心化(减去均值),但跳过标准差缩放PCA(n_components=8):
将庞大的多项式空间缩减回 8 个主成分MinMaxScaler(feature_range=(0, 10)):
将这些主成分重新缩放到[0, 10]
范围SelectKBest(score_func=f_classif, k=4):
通过 ANOVA F 检验选择排名前 4 的特征LogisticRegression(elasticnet):
使用 L1/L2 惩罚的混合来训练,使用异常高的max_iter
以便收敛CalibratedClassifierCV(method="isotonic", cv=4):
包装逻辑回归模型,通过 4 折同质回归校准其概率输出
这个管道过于复杂且不透明,使得很难理解各个分层元估计器如何影响最终结果——更不用说许多附加的估计器是冗余的,并且使生成的模型容易过拟合。
结论
本文介绍了十种有效的 Python 单行代码,一旦您熟悉了它们,它们将极大地提升和简化您构建机器学习模型的过程,从数据收集和准备,到模型训练过程,再到基于测试预测对其进行评估和验证。
我想对这门课程有很好的理解