有一些标准的流程可以实现机器学习问题的自动化处理,在scikit-learn中通过Pipeline来定义和自动化运行这些流程。
接下来介绍:
- 如何通过Pipeline来最小化数据缺失
- 如何构建数据准备和生成模型的Pipeline
- 如何构建特征选择和生成模型的Pipeline
数据准备和生成模型的Pipeline
在机器学习的实践中有一个很常见的错误,就是训练数据集与评估数据集之间的数据泄漏,这会影响到评估的准确度。要避免这个问题,需要有一个合适的方式把数据分离成训练数据集和评估数据集,这个过程包含在数据准备中。数据准备过程是很好的理解数据和算法关系的过程,如当对训练数据集做标准化和正太化处理来训练算法时,就应该理解并接受这同样要受评估数据集的影响。
Pipeline能够处理训练数据集与评估数据集指尖的数据泄漏问题,通常会在数据处理过程中对分离出的所有数据子集做同样的数据处理,如正态化处理。
下面演示如何通过Pipeline来处理这个过程,共分为两步:
- 正态化数据
- 训练一个线性判别分析模型
在使用Pipeline进行流程化算法模型的评估过程中,采用10折交叉验证来分离数据集。
1 #Pipeline数据准备 2 from pandas import read_csv 3 from sklearn.model_selection import KFold 4 5 from sklearn.discriminant_analysis import LinearDiscriminantAnalysis 6 from sklearn.preprocessing import StandardScaler 7 from sklearn.pipeline import Pipeline 8 from sklearn.model_selection import cross_val_score 9 10 11 filename='/home/aistudio/work/pima_data1.csv' 12 names=['preg','plas','pres','skin','test','mass','pedi','age','class'] 13 data=read_csv(filename,names=names) 14 #将数据分为输入数据和输出数据 15 array=data.values 16 x=array[:,0:8] 17 y=array[:,8] 18 num_folds=10 19 seed=7 20 kfold=KFold(n_splits=num_folds,random_state=seed) 21 22 steps=[] 23 steps.append(('Standardize',StandardScaler())) 24 steps.append(('lda',LinearDiscriminantAnalysis())) 25 model=Pipeline(steps) 26 result=cross_val_score(model,x,y,cv=kfold) #10折交叉验证 27 print(result.mean()) #打印正确率
0.773462064251538
补充:十折交叉验证(来自百度百科)
十折交叉验证,英文名叫做10-fold cross-validation,用来测试算法准确性。是常用的测试方法。将数据集分成十份,轮流将其中9份作为训练数据,1份作为测试数据,进行试验。
每次试验都会得出相应的正确率(或差错率)。10次的结果的正确率(或差错率)的平均值作为对算法精度的估计,一般还需要进行多次10折交叉验证(例如10次10折交叉验证),再求其均值,作为对算法准确性的估计。
十折交叉验证之所以选择将数据集分为10份,是因为通过利用大量数据集、使用不同学习技术进行的大量试验,表明10折是获得最好误差估计的恰当选择,而且也有一些理论根据可以证明这一点。但这并非最终诊断,争议仍然存在。而且似乎5折或者20折与10折所得出的结果也相差无几。
特征选择和生成模型的Pipeline
特征选择也是一个容易收到数据泄漏影响的过程。和数据准备一样,特征选择时也必须保证数据的稳固性,Pipeline也提供了一个工具(FeatureUnion)来保证数据特征选择时数据的稳固性,一般包括:
- 通过主要成分分析进行特征选择
- 通过统计选择进行特征选择
- 特征集合
- 生成逻辑回归模型
在本例中也采用10折交叉验证来分离训练数据集和评估数据集。
1 #Pipeline特征选择 2 from pandas import read_csv 3 from sklearn.model_selection import KFold 4 5 from sklearn.discriminant_analysis import LinearDiscriminantAnalysis 6 from sklearn.preprocessing import StandardScaler 7 from sklearn.pipeline import Pipeline 8 from sklearn.model_selection import cross_val_score 9 from sklearn.pipeline import FeatureUnion 10 from sklearn.linear_model import LogisticRegression 11 from sklearn.decomposition import PCA 12 from sklearn.feature_selection import SelectKBest 13 14 filename='/home/aistudio/work/pima_data1.csv' 15 names=['preg','plas','pres','skin','test','mass','pedi','age','class'] 16 data=read_csv(filename,names=names) 17 #将数据分为输入数据和输出数据 18 array=data.values 19 x=array[:,0:8] 20 y=array[:,8] 21 num_folds=10 22 seed=7 23 kfold=KFold(n_splits=num_folds,random_state=seed) 24 25 #生成feature 26 features=[] 27 features.append(('pca',PCA())) 28 features.append(('select_best',SelectKBest(k=6))) 29 30 #生成Pipeline 31 steps=[] 32 steps.append(('feature_union',FeatureUnion(features))) 33 steps.append(('logistic',LogisticRegression())) 34 model=Pipeline(steps) 35 result=cross_val_score(model,x,y,cv=kfold) #10折交叉验证 36 print(result.mean()) #打印正确率
0.7799555707450445
此处先创建了FeatureUnion,然后将其作为Pipeline的一个生成步骤。