机器学习基础12-Pipeline实现自动化流程处理(基于印第安糖尿病Pima 数据集)

有一些标准的流程可以实现对机器学习问题的自动化处理,在 scikitlearn 中通过Pipeline来定义和自动化运行这些流程。本节就将介绍如何通过Pipeline实现自动化流程处理。

  • 如何通过Pipeline来最小化数据缺失。
  • 如何构建数据准备和生成模型的Pipeline。
  • 如何构建特征选择和生成模型的Pipeline。

机器学习的自动流程

在机器学习方面有一些可以采用的标准化流程,这些标准化流程是从共同的问题中提炼出来的,例如评估框架中的数据缺失等。在 scikit-learn中提供了自动化运行流程的工具——Pipeline。Pipeline 能够将从数据转换到评估模型的整个机器学习流程进行自动化处理。读者可以到scikit-learn的官方网站阅读关于Pipeline的章节,加深对Pipeline的理解。

数据准备和生成模型的Pipeline

在机器学习的实践中有一个很常见的错误,就是训练数据集与评估数据集之间的数据泄露,这会影响到评估的准确度。要想避免这个问题,需要有一个合适的方式把数据分离成训练数据集和评估数据集,这个过程被包含在数据的准备过程中。数据准备过程是很好的理解数据和算法关系的过程,举例来说,当对训练数据集做标准化和正态化处理来训练算法时,就应该理解并接受这同样要受评估数据集的影响。

Pipeline能够处理训练数据集与评估数据集之间的数据泄露问题,通常会在数据处理过程中对分离出的所有数据子集做同样的数据处理,如正态化处理。

下面将演示如何通过Pipeline来处理这个过程,共分为以下两个步
骤:
(1)正态化数据。
(2)训练一个线性判别分析模型。
在使用Pipeline进行流程化算法模型的评估过程中,采用10折交叉验证来分离数据集。

数据集下载

其代码如下:


import pandas as pd
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.linear_model import LogisticRegression

from sklearn.model_selection import cross_val_score, ShuffleSplit, KFold
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]
# 分割数据集
n_splits = 10

# 随机数种子
seed = 7

kfold = KFold(n_splits=n_splits, random_state=seed, shuffle=True)


steps = []
steps.append(('Standardize', StandardScaler()))
steps.append(('lda',LinearDiscriminantAnalysis()))


model = Pipeline(steps)

result = cross_val_score(model, X, Y, cv=kfold)

print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))




Pipeline的各个步骤,通过列表参数传递给Pipeline实例,并通过
Pipeline进行流程化处理过程。运行结果:

算法评估结果:0.767 (0.048)

特征选择和生成模型的Pipeline

特征选择也是一个容易受到数据泄露影响的过程。和数据准备一样,特征选择时也必须确保数据的稳固性,Pipeline 也提供了一个工具(FeatureUnion)来保证数据特征选择时数据的稳固性。下面是一个在数据选择过程中保持数据稳固性的例子。

这个过程包括以下四个步骤:
(1)通过主要成分分析进行特征选择。
(2)通过统计选择进行特征选择。
(3)特征集合。
(4)生成一个逻辑回归模型。

在本例中也采用10折交叉验证来分离训练数据集和评估数据集。

代码如下:


import pandas as pd
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.feature_selection import SelectKBest
from sklearn.linear_model import LogisticRegression

from sklearn.model_selection import cross_val_score, ShuffleSplit, KFold
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.preprocessing import StandardScaler

#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]
# 分割数据集
n_splits = 10

# 随机数种子
seed = 7

kfold = KFold(n_splits=n_splits, random_state=seed, shuffle=True)


features = []
features.append(('PCA', PCA(n_components=3)))
#添加select_best
features.append(('select_best', SelectKBest(k=6)))

steps = []
steps.append(('feature_union', FeatureUnion(features)))

steps.append(('logistic', LogisticRegression()))

model = Pipeline(steps)

result = cross_val_score(model, X, Y, cv=kfold)

print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))


运行结果:
此处先创建了FeatureUnion,然后将其作为Pipeline的一个生成步骤。

算法评估结果:0.771 (0.048)

本节学习了通过 scikit-learn 中的 Pipeline 进行自动流程化数据准备和特征选择的过程。接下来将探讨针对要处理的问题,如何提高机器学习算法的准确度。

猜你喜欢

转载自blog.csdn.net/hai411741962/article/details/132492171