java使用joblib模型_掌握Python 机器学习 读书笔记 9 (流水线 && 算法保存)

本文介绍了Python机器学习中的流水线(Pipeline)及其重要性,避免数据泄露问题。通过实例展示了如何使用Pipeline进行数据标准化和模型构建。同时,讲解了特征抽取和建模的流水线,结合PCA和SelectKBest进行特征选择。此外,文章讨论了数据竞赛中的数据泄露问题以及如何识别。最后,探讨了如何使用pickle和joblib库保存与加载模型。
摘要由CSDN通过智能技术生成

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,要不然比赛会被引入歧途,还会影响日常工作质量。

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 的版本

使用手册的序列化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值