小工具知识网

当前位置: 首页 > 行业知识 > 掌握Python 机器学习 读书笔记 9 (流水线 && 算法保存)

行业知识

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

2026-11-13 08:43:26 来源:互联网转载

cha14 流水线

在���器学习里可以看到有一些必要的步骤, 这些步骤是可以作为workflow 自动化的。 而且流水线可以对每个fold来进行处理, 这样很大程度避免了数据泄露。 这也是为什么使用流水线的原因。

()

14.1 数据准备和建模的流水线

使用机器学习的时候很容易落入一个陷阱, 就是泄露你的训练数据到测试数据。 为了不陷入这个陷阱, 你需要严格的把训练和测试数据分开。 比如一种情况, 你在做正则化和标准化给整个数据集的时候, 很可能把整个数据集进行了处理。 这是不对的, 因为包括了训练和测试数据。 Pipeline 流水线会在这个地方帮助到你, 就是说在标准化的时候可以严格的作用在每fold上, 而不是互相干扰。 如下例:

  • 其实从例子你看不到内在的这个处理, 这个是具体实现的时候
    # Create a pipeline that standardizes the data then creates a modelfrom pandas import read_csvfrom sklearn.model_selection import KFoldfrom sklearn.model_selection import cross_val_scorefrom sklearn.preprocessing import StandardScalerfrom sklearn.pipeline import Pipelinefrom sklearn.discriminant_analysis import LinearDiscriminantAnalysis# load datafilename = 'pima-indians-diabetes.data.csv'names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']dataframe = read_csv(filename, names=names)array = dataframe.valuesX = array[:,0:8]Y = array[:,8]# create pipelineestimators = []estimators.append(('standardize', StandardScaler()))estimators.append(('lda', LinearDiscriminantAnalysis()))model = Pipeline(estimators)# evaluate pipelinekfold = 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 modelfrom pandas import read_csvfrom sklearn.model_selection import KFoldfrom sklearn.model_selection import cross_val_scorefrom sklearn.pipeline import Pipelinefrom sklearn.pipeline import FeatureUnionfrom sklearn.linear_model import LogisticRegressionfrom sklearn.decomposition import PCAfrom sklearn.feature_selection import SelectKBest# load datafilename = 'pima-indians-diabetes.data.csv'names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']dataframe = read_csv(filename, names=names)array = dataframe.valuesX = array[:,0:8]Y = array[:,8]# create feature unionfeatures = []features.append(('pca', PCA(n_components=3)))features.append(('select_best', SelectKBest(k=6)))feature_union = FeatureUnion(features)# create pipelineestimators = []estimators.append(('feature_union', feature_union))estimators.append(('logistic', LogisticRegression()))model = Pipeline(estimators)# evaluate pipelinekfold = 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 Picklefrom pandas import read_csvfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegressionfrom pickle import dumpfrom pickle import loadfilename = 'pima-indians-diabetes.data.csv'names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']dataframe = read_csv(filename, names=names)array = dataframe.valuesX = 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 diskfilename = 'finalized_model.sav'dump(model, open(filename, 'wb'))# some time later...# load the model from diskloaded_model = load(open(filename, 'rb'))result = loaded_model.score(X_test, Y_test)print(result)# 0.755905511811

          17.2 使用joblib来持久化你的算法

          # Save Model Using joblibfrom pandas import read_csvfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegressionfrom sklearn.externals.joblib import dumpfrom sklearn.externals.joblib import loadfilename = 'pima-indians-diabetes.data.csv'names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']dataframe = read_csv(filename, names=names)array = dataframe.valuesX = 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 diskfilename = 'finalized_model.sav'dump(model, filename)# some time later...# load the model from diskloaded_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

上一篇:夏季汽车维护与保养,高温下的全面维修指南

下一篇:iis服务器怎么设置伪静态?