声明:版权所有,转载请联系作者并注明出处 http://blog.csdn.net/u013719780?viewmode=contents
博主简介:风雪夜归子(英文名: Allen),机器学习算法攻城狮,喜爱钻研Machine Learning的黑科技,对Deep Learning和Artificial Intelligence充满兴趣,经常关注kaggle数据挖掘竞赛平台,对数据、Machine Learning和Artificial Intelligence有兴趣的各位童鞋可以一起探讨哦,个人CSDN博客: http://blog.csdn.net/u013719780?viewmode=contents
用管线命令处理多个步骤
管线命令不经常用,但是很有用。它们可以把多个步骤组合成一个对象执行。这样可以更方便灵活地调节和控制整个模型的配置,而不只是一个一个步骤调节。
Getting ready
这是我们把多个数据处理步骤组合成一个对象的第一部分。在scikit-learn里称为pipeline
。这里我们首先通过计算处理缺失值;然后将数据集调整为均值为0,标准差为1的标准形。
让我们创建一个有缺失值的数据集,然后再演示pipeline
的用法:
from sklearn import datasets
import numpy as np
mat = datasets.make_spd_matrix(10)
masking_array = np.random.binomial(1, .1, mat.shape).astype(bool)
mat[masking_array] = np.nan
mat[:4, :4]
How to do it...
如果不用管线命令,我们可能会这样实现:
from sklearn import preprocessing
impute = preprocessing.Imputer()
scaler = preprocessing.StandardScaler()
mat_imputed = impute.fit_transform(mat)
mat_imputed[:4, :4]
mat_imp_and_scaled = scaler.fit_transform(mat_imputed)
mat_imp_and_scaled[:4, :4]
现在我们用pipeline
来演示:
from sklearn import pipeline
pipe = pipeline.Pipeline([('impute', impute), ('scaler', scaler)])
我们看看pipe
的内容。和前面介绍一致,管线命令定义了处理步骤:
pipe
然后在调用pipe
的fit_transform
方法,就可以把多个步骤组合成一个对象了:
new_mat = pipe.fit_transform(mat)
new_mat[:4, :4]
可以用Numpy验证一下结果:
np.array_equal(new_mat, mat_imp_and_scaled)
完全正确!本书后面的主题中,我们会进一步展示管线命令的威力。不仅可以用于预处理步骤中,在降维、算法拟合中也可以很方便的使用。
How it works...
前面曾经提到过,每个scikit-learn的算法接口都类似。pipeline
最重要的函数也不外乎下面三个:
fit
transform
fit_transform
具体来说,如果管线命令有N
个对象,前N-1
个对象必须实现fit
和transform
,第N
个对象至少实现fit
。否则就会出现错误。
如果这些条件满足,管线命令就会运行,但是不一定每个方法都可以。例如,pipe
有个inverse_transform
方法就是这样。因为由于计算步骤没有inverse_transform
方法,一运行就有错误:
pipe.inverse_transform(new_mat)
但是,scalar
对象可以正常运行:
scaler.inverse_transform(new_mat)[:4, :4]
只要把管线命令设置好,它就会如愿运行。它就是一组for
循环,对每个步骤执行fit
和transform
,然后把结果传递到下一个变换操作中。
使用管线命令的理由主要有两点:
- 首先是方便。代码会简洁一些,不需要重复调用
fit
和transform
。 - 其次,也是更重要的作用,就是使用交叉验证。模型可以变得很复杂。如果管线命令中的一个步骤调整了参数,那么它们必然需要重新测试;测试一个步骤参数的代码管理成本是很低的。但是,如果测试5个步骤的全部参数会变都很复杂。管线命令可以缓解这些负担。