掌握Python 机器学习 读书笔记 9 (流水线 && 算法保存)

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 其他

        1. 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