cha14 流水线
在机器学习里可以看到有一些必要的步骤, 这些步骤是可以作为workflow 自动化的。 而且流水线可以对每个fold来进行处理, 这样很大程度避免了数据泄露。 这也是为什么使用流水线的原因。
14.1 数据准备和建模的流水线
使用机器学习的时候很容易落入一个陷阱, 就是泄露你的训练数据到测试数据。 为了不陷入这个陷阱, 你需要严格的把训练和测试数据分开。 比如一种情况, 你在做正则化和标准化给整个数据集的时候, 很可能把整个数据集进行了处理。 这是不对的, 因为包括了训练和测试数据。 Pipeline 流水线会在这个地方帮助到你, 就是说在标准化的时候可以严格的作用在每fold上, 而不是互相干扰。 如下例:
- 其实从例子你看不到内在的这个处理, 这个是具体实现的时候
# Create a pipeline that standardizes the data then creates a model 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 # load data filename = 'pima-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] # create pipeline estimators = [] estimators.append(('standardize', StandardScaler())) estimators.append(('lda', LinearDiscriminantAnalysis())) model = Pipeline(estimators) # evaluate pipeline kfold = KFold(n_splits=10, random_state=7) results = cross_val_score(model, X, Y, cv=kfold) print(results.mean()) # 0.773462064252
14.2 特征抽取和建模流水线
特征抽取是另外一个很容易数据泄露的过程。 比如数据准备的时候, 特征抽取过程必须限定在你的训练数据里面。 而Pipeline流水线提供了一个FeatureUnion的方法帮你. 它可以把几种特征抽取放在一起然后得到更大的一组特征。 而且更为重要的是, 它会作为在每一个fold上, 而不是全部。
这个过程有四个部分:
- 用PCA 来做特征抽取
- 用统计选择来做特征抽取
- 特征联合
- 做逻辑回归
# Create a pipeline that extracts features from the data then creates a model 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 # load data filename = 'pima-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] # create feature union features = [] features.append(('pca', PCA(n_components=3))) features.append(('select_best', SelectKBest(k=6))) feature_union = FeatureUnion(features) # create pipeline estimators = [] estimators.append(('feature_union', feature_union)) estimators.append(('logistic', LogisticRegression())) model = Pipeline(estimators) # evaluate pipeline kfold = KFold(n_splits=10, random_state=7) results = cross_val_score(model, X, Y, cv=kfold) print(results.mean()) # 0.776042378674
14.3 其他
-
- Data Leakage定义
存在和利用这种倒‘因’为‘果’的feature的现象,叫数据竞赛中的Data Leakage。
这里的Data Leakage 跟其他场合说的数据安全数据泄漏完全不一样。从字面上理解,我们说的Data Leakage不是数据泄漏,而是因果关系的纰漏,是由于数据准备过程中出现的失误,使模型沿着有纰漏的,甚至是颠倒的因果关系进行预测,但得到极好的预测结果。
案例 Chris老师就举过一个非常经典的例子。在处理电信用户流失的时候,用原有的数据集轻轻松松就可以把AUC达到0.99以上。这让人非常警惕。于是Chris老师仔细查看了一下模型和数据,原来数据中有一个权重极高的feature是“3个月内的缴费纪录”。很多流失用户的账户内,这个feature的值是0。再进一步,他跟会计核实了一下,在会计记账中,这个feature 代表的是用户已经流失后的三个月的缴费纪录,那肯定就是0了。这是典型的因果关系颠倒。
竞赛选手们肯定希望自己能够找到Data Leakage, 这样排名就可以大幅度提升。但对于竞赛主办方,或者实际工作中的数据科学家,则要千方百计识别Data Leakage,要不然比赛会被引入歧途,还会影响日常工作质量。
refer to 1 data leakage http://blog.csdn.net/jiandanjinxin/article/details/54633475
17 保存和使用你的算法
这章是告诉大家如何保存你的算法, 然后如何实际使用。 通过本章的学习, 你可以知道
- 序列化算法的重要性
- 使用pickle来序列化和反序列化学习模型
- 使用joblib来序列化和反序列化学习模型
17.1 使用pickle来持久化你的算法
# Save Model Using Pickle from pandas import read_csv from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from pickle import dump from pickle import load filename = 'pima-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33, random_state=7) # Fit the model on 33% model = LogisticRegression() model.fit(X_train, Y_train) # save the model to disk filename = 'finalized_model.sav' dump(model, open(filename, 'wb')) # some time later... # load the model from disk loaded_model = load(open(filename, 'rb')) result = loaded_model.score(X_test, Y_test) print(result) # 0.755905511811
17.2 使用joblib来持久化你的算法
# Save Model Using joblib from pandas import read_csv from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.externals.joblib import dump from sklearn.externals.joblib import load filename = 'pima-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33, random_state=7) # Fit the model on 33% model = LogisticRegression() model.fit(X_train, Y_train) # save the model to disk filename = 'finalized_model.sav' dump(model, filename) # some time later... # load the model from disk loaded_model = load(filename) result = loaded_model.score(X_test, Y_test) print(result) # 0.755905511811
两种办法没有看出啥区别, 就是包不同: joblib 是scikitlearn里面提供的, 而pickle 则是单独的一个。
14.3 一些注意点
- python 版本
- library 的版本
- 使用手册的序列化
作者:zzbb
原文地址:https://my.oschina.net/sizhe/blog/1591642
喜欢 0
-