如何自动化机器学习工作流程

序言

在机器学习项目中,有一些标准的流程可以自动化。在Python scikit-learn中,Pipeline有助于明确定义和自动化这些流程。通过本文,我们将了解scikit-learn中的Pipeline以及如何自动化常见的机器学习工作流程。

1. 如何使用管道来最小化数据泄露。

2. 如何构建数据准备和建模管道。

3. 如何构建特征提取和建模管道。

自动化机器学习工作流程

在应用机器学习中,有一些标准的流程。因为它们克服了常见问题,比如测试工具中的数据泄露。Python scikit-learn提供了一个Pipeline工具来帮助自动化机器学习工作流程。Pipeline通过允许将数据转换的线性序列链接在一起,最终形成一个可以评估的建模过程来工作。

目标是确保Pipeline中的所有步骤都受限于可用于评估的数据,例如训练数据集或交叉验证过程的每个折叠。

数据准备和建模管道

在应用机器学习中的一个容易陷入的陷阱是将训练数据集的数据泄露到测试数据集中。为了避免这个陷阱,我们需要一个健壮的测试工具,具有严格的训练和测试分离。这包括数据准备。数据准备是向算法泄露整个训练数据集知识的一个简单方法。例如,在学习和训练之前,对整个训练数据集进行归一化(Normalizer)或标准化(Standardizer),这样的测试是不有效的,因为训练数据集受到了测试集数据规模的影响。

Pipeline通过确保数据准备(如标准化)受限于交叉验证过程的每个折叠,有助于防止测试工具中的数据泄露。下面的例子演示了在皮马印第安人糖尿病发病数据集上这个重要的数据准备和模型评估工作流程。该管道定义了两个步骤:

1. 标准化数据。

2. 学习线性判别分析模型。

特征提取和建模管道

特征提取是另一个容易受到数据泄露影响的程序。与数据准备类似,特征提取程序也必须限制在训练数据集内。管道提供了一个方便的工具,称为FeatureUnion,它允许将多个特征选择和提取程序的结果组合成一个大数据集,在该数据集上可以训练模型。重要的是,所有的特征提取和特征联合都发生在交叉验证过程的每个折叠内部。下面的例子演示了定义为四个步骤的管道:

1. 使用主成分分析(3个特征)进行特征提取。

2. 使用统计选择进行特征提取(6个特征)。

3. 特征联合。

4. 学习逻辑回归模型。

通过使用FeatureUnion,可以在每个折叠内部独立地应用不同的特征提取方法,而不会将信息从训练集泄露到测试集。这样做可以确保模型在训练时只看到了训练数据,从而提高了模型的泛化能力。此外,通过在交叉验证过程中对每个折叠应用相同的特征提取和联合步骤,可以确保模型评估的公正性和一致性。

案例代码

# coding=utf-8
"""
本文件演示了如何使用皮马印第安人糖尿病数据集进行机器学习模型的构建和评估。
主要步骤包括:数据加载、数据清洗、特征标准化、模型构建与评估。
"""

from pathlib import Path  # 用于处理文件路径
import pandas as pd  # 用于数据处理
from sklearn.preprocessing import StandardScaler  # 用于特征标准化
from sklearn.model_selection import KFold, cross_val_score  # 用于交叉验证
from sklearn.pipeline import Pipeline, FeatureUnion  # 用于构建特征提取和建模的管道
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis  # 用于线性判别分析
from sklearn.linear_model import LinearRegression  # 用于线性回归(未在代码中使用)
from sklearn.decomposition import PCA  # 用于主成分分析
from sklearn.feature_selection import SelectKBest  # 用于特征选择

# 定义文件路径
filename = Path(__file__).parent / 'data/pima-indians-diabetes.csv'

# 加载数据
data = pd.read_csv(filename)

# 重命名列名以提高可读性
column_names = {'Pregnancies': 'pregnant_times',
                 'Glucose': 'glucose',
                 'BloodPressure': 'blood_pressure',
                 'SkinThickness': 'skin_thickness',
                 'Insulin': 'insulin',
                 'BMI': 'BMI',
                 'DiabetesPedigreeFunction': 'DPF',
                 'Age': 'age',
                 'Outcome': 'outcome'}
data.rename(columns=column_names, inplace=True)

# 删除含有缺失值的行以进行数据清洗
data.dropna(inplace=True)  

# 对特征数据进行标准化处理
scaler = StandardScaler()
X = scaler.fit_transform(data.iloc[:, :-1])  
# 提取目标变量
Y = data.iloc[:, -1]  
print(X.shape, Y.shape)

###### 数据准备和建模管道 ######
# 此部分旨在通过标准化和线性判别分析(LDA)创建一个数据处理和建模的管道,并使用10折交叉验证来评估该模型的性能。
print("\n\033[1;30m数据准备和建模管道:\033[0m")

# 定义处理流程,包括两个步骤:标准化和LDA。标准化用于缩放数据,使得数据具有零均值和单位方差;LDA是一种监督学习方法,用于降维和分类。
estimators = []
estimators.append(('standardize', StandardScaler()))
estimators.append(('lda', LinearDiscriminantAnalysis()))
model = Pipeline(estimators) # 创建处理管道

# 设置10折交叉验证,随机种子为7,且在划分训练集和测试集时进行数据洗牌,以确保结果的随机性和可重复性。
kfold = KFold(n_splits=10, random_state=7, shuffle=True)

# 使用交叉验证评估模型的准确性,返回每个折的得分平均值和标准差。
results = cross_val_score(model, X, Y, cv=kfold)

# 打印模型的平均准确率和标准差,以评估模型的性能。
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean() * 100, results.std() * 100))

###### 特征提取和建模管道 ######
# 此部分代码用于展示如何构建一个包含特征提取和模型训练的管道,并使用交叉验证来评估其性能。
# 管道首先通过主成分分析(PCA)和选择最佳特征(SelectKBest)进行特征提取和降维。
# 然后,使用线性回归(LinearRegression)模型进行建模。
# 最后,通过10折交叉验证来评估模型的平均准确率及其标准差。
print("\n\033[1;30m特征提取和建模管道:\033[0m")

# 创建特征提取流程
features = []
features.append(('pca', PCA(n_components=3)))  # 应用主成分分析,保留前3个主成分
features.append(('select_best', SelectKBest(k=6)))  # 选择最好的6个特征
feature_union = FeatureUnion(features)  # 将两个特征提取方法合并

# 将特征提取流程和线性回归模型合并到一个管道中
estimators = []
estimators.append(('feature_union', feature_union))
estimators.append(('lr', LinearRegression()))
model = Pipeline(estimators)  # 创建管道模型

# 使用10折交叉验证评估模型
kfold = KFold(n_splits=10, random_state=7, shuffle=True)
results = cross_val_score(model, X, Y, cv=kfold)  # 计算交叉验证的得分

# 打印平均准确率和标准差
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean() * 100, results.std() * 100))

总结

如何有效地防止应用机器学习中的数据泄露一直是个难题。我们发现了Python scikit-learn中的管道(Pipeline)工具,以及它们如何用于自动化标准的应用机器学习工作流程。我们学习了如何在两个重要的用例中使用管道:

1. 数据准备和建模限制在交叉验证过程的每个折叠内。

2. 特征提取和特征联合限制在交叉验证过程的每个折叠内。

通过使用scikit-learn的Pipeline,我们可以将数据预处理、特征提取、模型训练等步骤串联起来,形成一个流水线。这样做的好处是:

  • 自动化:减少了编写大量样板代码的需要,简化了机器学习工作流程。

  • 一致性:确保了在交叉验证的每个折叠上应用相同的预处理和特征提取步骤,从而提高了结果的可重复性。

  • 效率:通过在单个调用中执行多个步骤,可以节省计算时间。

在实践中,使用Pipeline可以有效地减少数据泄露的风险,因为所有的数据转换和模型训练都是在交叉验证的每个折叠内部进行的,这意味着模型从未看到过训练集外的数据。这对于保持模型的公正性和泛化能力至关重要。

此外,通过将特征提取和特征联合步骤也包含在Pipeline中,可以确保这些步骤同样受到交叉验证的限制,从而进一步减少了数据泄露的可能性。特征联合允许您将多个特征转换器的输出合并为一个单一的特征集,这对于复杂的特征工程任务特别有用。

参考文献

Scikit-Learn: Dataset transformations

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绎岚科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值