机器学习 - 自动工作流
引言
为了成功执行并产生结果,机器学习模型必须自动化一些标准工作流。自动化这些标准工作流的过程可以通过 Scikit-learn Pipelines 来实现。从数据科学家的角度来看,pipeline 是一个通用但非常重要的概念。它基本上允许数据从原始格式流向有用的信息。pipeline 的工作原理可以通过以下图示来理解 −
ML pipeline 的模块如下 −
数据摄取 − 顾名思义,这是将数据导入 ML 项目中使用的数据过程。数据可以实时或批量从单个或多个系统提取。这是最具挑战性的步骤之一,因为数据质量会影响整个 ML 模型。
数据准备 − 导入数据后,我们需要准备数据以用于我们的 ML 模型。数据预处理是数据准备中最重要的一种技术。
ML 模型训练 − 下一步是训练我们的 ML 模型。我们有各种 ML 算法,如监督学习、无监督学习、强化学习,用于从数据中提取特征并进行预测。
模型评估 − 接下来,我们需要评估 ML 模型。在 AutoML pipeline 的情况下,可以使用各种统计方法和业务规则来评估 ML 模型。
ML 模型重新训练 − 在 AutoML pipeline 的情况下,并不一定第一个模型就是最好的。第一个模型被视为 baseline model,我们可以重复训练它以提高模型的准确性。
部署 − 最后,我们需要部署模型。此步骤涉及将模型应用并迁移到业务运营中以供使用。
ML Pipeline 面临的挑战
为了创建 ML pipeline,数据科学家会面临许多挑战。这些挑战分为以下三类 −
数据质量
任何 ML 模型的成功在很大程度上取决于数据质量。如果我们提供给 ML 模型的数据不准确、不可靠且不稳健,那么最终结果将是错误或误导性的输出。
数据可靠性
与 ML pipeline 相关的另一个挑战是我们提供给 ML 模型的数据可靠性。正如我们所知,数据科学家可以从各种来源获取数据,但要获得最佳结果,必须确保数据来源可靠且可信。
数据可访问性
要从 ML pipeline 中获得最佳结果,数据本身必须是可访问的,这需要对数据进行整合、清洗和整理。作为数据可访问性属性的结果,metadata 将更新新的标签。
建模 ML Pipeline 和数据准备
数据泄漏,从训练数据集到测试数据集的发生,是数据科学家在为 ML 模型准备数据时需要处理的重要问题。通常,在数据准备阶段,数据科学家会在学习之前对整个数据集使用标准化或归一化等技术。但这些技术无法帮助我们防止数据泄漏,因为训练数据集会受到测试数据集中的数据尺度影响。
通过使用 ML pipelines,我们可以防止这种数据泄漏,因为 pipelines 确保数据准备(如标准化)被限制在我们交叉验证过程中的每个 fold 中。
示例
以下是一个 Python 示例,演示了数据准备和模型评估工作流程。为此,我们使用来自 Sklearn 的 Pima Indian Diabetes 数据集。首先,我们将创建一个标准化数据的 pipeline。然后创建一个 Linear Discriminant Analysis 模型,最后使用 10 折交叉验证来评估 pipeline。
首先,按以下方式导入所需的包 −
from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
现在,我们需要像之前示例中那样加载 Pima 糖尿病数据集 −
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
接下来,我们将使用以下代码创建一个 pipeline −
estimators = []
estimators.append(('standardize', StandardScaler()))
estimators.append(('lda', LinearDiscriminantAnalysis()))
model = Pipeline(estimators)
最后,我们将评估这个 pipeline 并输出其准确率,如下所示 −
kfold = KFold(n_splits=20, random_state=7) results = cross_val_score(model, X, Y, cv=kfold) print(results.mean())
输出
0.7790148448043184
上述输出是该设置在数据集上的准确率总结。
建模 ML Pipeline 和特征提取
数据泄漏也可能发生在 ML 模型的特征提取步骤。因此,特征提取过程也应受到限制,以防止训练数据集中出现数据泄漏。与数据准备的情况类似,通过使用 ML pipeline,我们也可以防止这种数据泄漏。FeatureUnion 是 ML pipeline 提供的一个工具,可用于此目的。
示例
以下是一个 Python 示例,演示了特征提取和模型评估的工作流程。为此,我们使用来自 Sklearn 的 Pima Indian Diabetes 数据集。
首先,使用 PCA (Principal Component Analysis) 提取 3 个特征。然后,使用 Statistical Analysis 提取 6 个特征。特征提取后,使用 FeatureUnion 工具将多个特征选择和提取过程的结果组合。最后,创建一个 Logistic Regression 模型,并使用 10 折交叉验证评估 pipeline。
首先,按以下方式导入所需的包 −
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
现在,我们需要像之前示例中那样加载 Pima 糖尿病数据集 −
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
接下来,按以下方式创建 feature union −
features = []
features.append(('pca', PCA(n_components=3)))
features.append(('select_best', SelectKBest(k=6)))
feature_union = FeatureUnion(features)
接下来,使用以下脚本行创建 pipeline −
estimators = []
estimators.append(('feature_union', feature_union))
estimators.append(('logistic', LogisticRegression()))
model = Pipeline(estimators)
最后,我们将评估这个 pipeline 并输出其准确率,如下所示 −
kfold = KFold(n_splits=20, random_state=7) results = cross_val_score(model, X, Y, cv=kfold) print(results.mean())
输出
0.7789811066126855
上述输出是该设置在数据集上的准确率摘要。