10 行python代码实现机器学习建模
建立机器学习模型 现在已成为每个人都能做到的事情。只需要一些关于这一领域的人工智能(AI)基础知识和一些编程技能。为了以编程方式优雅且紧凑地构建机器学习模型,今天通常首选Python。
本文深入探讨了在构建机器学习模型时常见的 Python 编程实践。具体而言,我们研究了 Python 编写单行代码的能力,这些单行代码能够高效且简洁地完成有意义的任务,以解释10个常用且有助于构建、评估和验证能够从数据中学习的模型的单行代码。
1. 从CSV数据集中加载一个Pandas DataFrame
大多数经典机器学习模型都利用结构化或表格数据。在这种情况下,Pandas 库肯定是一个方便的解决方案,用于将这些数据存储到DataFrame
对象中,理想地适合于包含结构化的行-列数据观察值。因此,这行代码是你编写程序构建机器学习模型时可能会遇到的初始代码行之一。
df = pd.read_csv("path_to_dataset.csv")
在这里,数据集的路径可以是公共数据集的URL(例如,作为GitHub仓库中原始文件可用的文件)或编程环境中的本地文件。
有时,像 Scikit-learn 这样的机器学习建模库会提供一些示例数据集的目录,例如用于分类花卉种类的鸢尾花数据集。在这种情况下,上述一行代码可以像这样使用,并添加额外的参数来指定数据属性的名称:
df = pd.DataFrame(load_iris().data, columns=load_iris().feature_names)
2. 处理缺失值
在实际数据集中发现的常见问题是,存在一个或多个属性值缺失的条目。虽然有一些策略可以估计(填充)这些值,但在某些情况下,直接删除包含缺失值的数据实例可能是一个更好的解决方案,特别是如果我们处于非高风险场景,且包含缺失值的观察值比例非常小。
起初,有些人可能会认为你需要一个循环来遍历整个数据集,并逐行检查是否有缺失值。事实并非如此,这个简单的单行代码可以应用于包含在Pandas DataFrame
中的数据集,一次性自动删除所有此类条目。
df_clean = df.dropna()
在这里我们创建了一个新的DataFrame
(df_clean
),从原始的DataFrame (df
)中减去缺失值的行 (dropna()
)。阅读更多关于dropna()
函数的内容。
3. 将类别特征编码为数值
独热编码是一种常见的方法,用于将类别特征(例如尺寸(小、中、大))编码为多个二进制属性,这些属性通过1(分别通过0)的值表示实例是否属于原始特征中的每个可能类别。
例如,一个中等大小的披萨实例可以被描述——而不是使用类别特征大小——使用三个one-hot编码的特征,一个对应每个可能的大小(small_size
,medium_size
,large_size
),这样这个披萨在新的特征size_medium
上具有值1,而与小和大尺寸相关的另外两个新特征上具有值0。Pandas提供了get_dummies()
函数来无缝实现这一点。
df_encoded = pd.get_dummies(df, drop_first=True)
在上面的代码中,get_dummies()
函数接受原始 DataFrame
(df
),删除标题行 (drop_first=True
),并返回一个独热编码 DataFrame
被分配到 df_encoded
。
4. 将数据集拆分为训练和测试
在构建任何机器学习模型时,这一点至关重要:我们必须将原始数据集分为两部分,一部分用于训练模型,另一部分用于进行测试预测,并查看模型在面对未来未见过的数据时的表现。借助 Scikit-learn 库及其 model_selection
模块,使用 train_test_split()
函数进行这个分割过程再简单不过了。
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 模型
您不需要首先初始化机器学习(例如,逻辑回归分类器),然后在单独的指令中进行训练。您可以像这样同时完成这两步。
model = LogisticRegression().fit(X_train, y_train)
想想你将节省的时间和代码行数!
6. 在测试数据上评估模型准确性
一旦你使用训练数据和标签构建了机器学习模型,这个一行代码可以用来快速查看其在之前分割原始数据集时留出的测试数据上的准确率。
accuracy = model.score(X_test, y_test)
虽然这可以作为模型性能的预览,但在大多数实际应用中,您可能希望使用几种更复杂的指标的组合,以全面了解您的模型在不同类型的数据上的表现。
7. 应用交叉验证
交叉验证是一种更系统和严谨的方法,用于仔细评估机器学习模型的性能,更重要的是,其在面对未来新数据时的良好泛化能力。
这行代码提供了一种非常快速的方法来执行交叉验证,只需指定要验证的模型、测试数据和标签,以及在验证过程中您的数据应被分割成的折数。
scores = cross_val_score(model, X, y, cv=5)
有关交叉验证的更多信息,请查看 这里.
8. 进行预测
这是一个相当简单的问题,但是使用你新建立的机器学习模型是必不可少的!Scikit-learn predict()
函数接受一组测试数据实例,并返回它们的预测列表。
preds = model.predict(X_test)
通常情况下,您可以使用返回的预测列表(preds
)来将其与这些观察的实际标签进行比较,从而获得模型准确性的客观测量。
9. 特征缩放
许多机器学习模型在数据首先被标准化到一个共同的尺度时表现更好,特别是在各个特征的数值范围差异很大的情况下。这就是如何使用Scikit-learn的StandardScaler
对象在一行代码中做到这一点的方法。
X_scaled = StandardScaler().fit_transform(X)
结果 X_scaled DataFrame
将通过以下方式对 X DataFrame
特征进行缩放,以去除均值并缩放至单位方差:
在这里了解更多关于 Scikit-learn 的信息.StandardScaler
10. 构建预处理和模型训练Pipeline
这个看起来相当酷(在本作者的意见中),但其适用性和可解释性取决于你需要将哪些过程封装到一个管道中。Scikit-learn的make_pipeline()
函数创建Pipeline
从估计器创建的对象。
pipe = make_pipeline(StandardScaler(), LogisticRegression()).fit(X_train, y_train)
上述管道将数据集的特征缩放、模型初始化和模型训练作为一个统一的过程进行管理。
这特别适用于可以轻松将相对简单的数据准备和模型训练阶段链接在一起的管道。将上面相对容易理解的管道与以下内容进行比较:
在这个“不合理的”管道中:
SimpleImputer(strategy="constant", fill_value=-1):
用任意哨兵值替换缺失数据PolynomialFeatures(degree=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检验选择前四个特征LogisticRegression(elasticnet):
使用混合的L1/L2惩罚项进行训练,使用了异常高的max_iter
以实现收敛CalibratedClassifierCV(method="isotonic", cv=4):
包裹逻辑回归模型,使用4折等压回归重新校准其概率输出
这个管道过于复杂和不透明,使得难以理解各个分层的元估计器如何影响最终结果——更不用说,许多这些附加的估计器是冗余的,导致最终模型容易过拟合。
结论
CV(method=“isotonic”, cv=4):`包裹逻辑回归模型,使用4折等压回归重新校准其概率输出
这个管道过于复杂和不透明,使得难以理解各个分层的元估计器如何影响最终结果——更不用说,许多这些附加的估计器是冗余的,导致最终模型容易过拟合。
结论
本文介绍了十行有效的Python代码,熟悉这些代码将提升并简化你从数据收集和准备到训练模型再到基于测试预测评估和验证机器学习模型的过程。