摘要:本文介绍了机器学习管道(Pipeline)的概念及其在数据科学工作流中的重要性。管道通过标准化流程实现从数据摄入到模型部署的全过程自动化,包含数据准备、模型训练、评估和再训练等关键环节。文章分析了数据质量、可靠性和可访问性三大挑战,并通过两个Python实例(使用Scikit-learn的皮马印第安人糖尿病数据集)演示了如何利用管道防止数据泄露:第一个示例展示标准化和线性判别分析的管道实现(准确率77.9%),第二个示例展示通过FeatureUnion结合PCA和特征选择的逻辑回归模型(准确率77.89%)。这些案例验证了管道在确保数据准备和特征提取过程隔离方面的有效性。
目录
引言
机器学习管道的组成部分如下:
机器学习管道面临的挑战
数据质量
数据可靠性
数据可访问性
机器学习管道建模与数据准备
示例
输出结果
机器学习管道建模与特征提取
示例
输出结果
引言
为了成功执行并生成结果,机器学习模型必须自动化一些标准工作流。借助 Scikit-learn 管道(Pipelines),可以实现这些标准工作流的自动化。从数据科学家的角度来看,管道是一个具有普遍性但至关重要的概念。它本质上允许数据从原始格式转化为有用的信息。管道的工作原理可通过以下图表理解:数据摄入→数据准备→机器学习模型训练→模型评估→模型部署→机器学习模型再训练
机器学习管道的组成部分如下:
机器学习管道面临的挑战
创建机器学习管道时,数据科学家会遇到诸多挑战。这些挑战主要分为以下三类:
数据质量
任何机器学习模型的成功都在很大程度上依赖于数据质量。如果提供给机器学习模型的数据不准确、不可靠且不稳健,那么最终将会得到错误或具有误导性的输出结果。
数据可靠性
机器学习管道面临的另一个挑战是所提供数据的可靠性。众所周知,数据科学家可以通过多种来源获取数据,但为了获得最佳结果,必须确保这些数据来源是可靠且可信的。
数据可访问性
要从机器学习管道中获得最佳结果,数据本身必须具有可访问性,这就需要对数据进行整合、清洗和整理。由于数据具有可访问性这一特性,元数据会通过新的标签进行更新。
机器学习管道建模与数据准备
在为机器学习模型准备数据时,数据科学家需要处理的一个重要问题是训练数据集向测试数据集的数据泄露。通常,在数据准备阶段,数据科学家会在模型训练前对整个数据集使用标准化或归一化等技术。但这些技术无法帮助我们避免数据泄露,因为训练数据集会受到测试数据集中数据尺度的影响。通过使用机器学习管道,可以防止这种数据泄露,因为管道能确保数据准备(如标准化)仅限于交叉验证过程的每个折(fold)。
示例
以下是一个 Python 示例,展示了数据准备和模型评估的工作流。本示例使用 Scikit-learn 中的皮马印第安人糖尿病数据集(Pima Indian Diabetes dataset)。首先,我们将创建一个用于标准化数据的管道;然后,构建一个线性判别分析(Linear Discriminant Analysis)模型;最后,使用 20 折交叉验证对管道进行评估。首先,导入所需的库:
接下来,按照之前的示例加载皮马印第安人糖尿病数据集:
然后,通过以下代码创建管道:
estimators = []
estimators.append(('standardize', StandardScaler()))
estimators.append(('lda', LinearDiscriminantAnalysis()))
model = Pipeline(estimators)
最后,评估该管道并输出其准确率:
kfold = KFold(n_splits=20, random_state=7, shuffle=True) # 添加shuffle=True以确保结果可复现(Scikit-learn 1.2+版本)
results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())
输出结果
plaintext
0.7790148448043184
上述输出结果是该设置在数据集上的准确率汇总。
机器学习管道建模与特征提取
在机器学习模型的特征提取阶段也可能发生数据泄露。因此,特征提取过程也应受到限制,以防止训练数据集中出现数据泄露。与数据准备阶段类似,通过使用机器学习管道,也可以防止这种数据泄露。管道提供的工具 FeatureUnion(特征联合)可用于此目的。
示例
以下是一个 Python 示例,展示了特征提取和模型评估的工作流。本示例同样使用 Scikit-learn 中的皮马印第安人糖尿病数据集。首先,通过主成分分析(PCA)提取 3 个特征;然后,通过统计分析提取 6 个特征;特征提取后,使用 FeatureUnion 工具组合多个特征选择和提取过程的结果;最后,构建一个逻辑回归(Logistic Regression)模型,并使用 20 折交叉验证对管道进行评估。首先,导入所需的库:
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.pipeline import FeatureUnion
from sklearn.linear_model import LogisticRegression
from sklearn.decomposition import PCA
from sklearn.feature_selection import SelectKBest
接下来,按照之前的示例加载皮马印第安人糖尿病数据集:
path = r"C:\\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
然后,创建特征联合:
features = []
features.append(('pca', PCA(n_components=3)))
features.append(('select_best', SelectKBest(k=6)))
feature_union = FeatureUnion(features)
接下来,通过以下代码创建管道:
estimators = []
estimators.append(('feature_union', feature_union))
estimators.append(('logistic', LogisticRegression(max_iter=1000))) # 增加max_iter以确保模型收敛
model = Pipeline(estimators)
最后,评估该管道并输出其准确率:
kfold = KFold(n_splits=20, random_state=7, shuffle=True) # 添加shuffle=True以确保结果可复现(Scikit-learn 1.2+版本)
results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())
输出结果
plaintext
0.7789811066126855
上述输出结果是该设置在数据集上的准确率汇总。
网硕互联帮助中心




评论前必须登录!
注册