机器学习基础:令你事半功倍的pipeline处理机制

简介: 机器学习基础:令你事半功倍的pipeline处理机制

why Pipeline?


你有没有遇到过这种情况:在机器学习项目中,对训练集的各种数据预处理操作,比如:特征提取、标准化、主成分分析等,在测试集上要重复使用这些参数。


为了避免重复操作,这里就要用到机器学习中的pipeline机制


按照sklearn官网的解释 pipeline 有以下妙用:


1、便捷性和封装性:直接调用fit和predict方法来对pipeline中的所有算法模型进行训练和预测。

2、联合的参数选择:你可以一次grid search管道中所有评估器的参数。

3、安全性:训练转换器和预测器使用的是相同样本,管道有助于防止来自测试数据的统计数据泄露到交叉验证的训练模型中。


是不是有点云里雾里?下面我们开始这一期的刨根问题~~


Pipeline的原理


pipeline可以将许多算法模型串联起来,形成一个典型的机器学习问题工作流。


640.png


Pipeline处理机制就像是把所有模型塞到一个管子里,然后依次对数据进行处理,得到最终的分类结果,


例如模型1可以是一个数据标准化处理,模型2可以是特征选择模型或者特征提取模型,模型3可以是一个分类器或者预测模型(模型不一定非要三个,根据自己实际需要)。


Pipleline中最后一个之外的所有评估器都必须是变换器,最后一个评估器可以是任意类型(transformer,classifier,regresser),若最后一个评估器是分类器,则整个pipeline就可以作为分类器使用,如果最后一个estimator是个回归器,则整个pipeline就可以作为回归器使用。


注:


Estimator:估计器,所有的机器学习算法模型,都被称为估计器。


Transformer:转换器,比如标准化。转换器的输出可以放入另一个转换器或估计器中作为输入。


一个完整的Pipeline步骤举例:


1.首先对数据进行预处理,比如缺失值的处理

2.数据的标准化

3.降维

4.特征选择算法

5.分类或者预测或者聚类算法(估计器,estimator)


640.png


实际上,调用pipeline的fit方法,是用前n-1个变换器处理特征,之后传递给最后的estimator训练。pipeline继承最后一个estimator的所有方法。


Pipeline的用法


调用方法:


sklearn.pipeline.Pipeline(steps, memory=None, verbose=False)


参数详解:


steps : 步骤:使用(key, value)列表来构建,其中 key 是你给这个步骤起的名字, value 是一个评估器对象。


memory:内存参数,默认None


Pipeline的function


Pipline的方法都是执行各个学习器中对应的方法,如果该学习器没有该方法,会报错。假设该Pipline共有n个学习器:


transform:依次执行各个学习器的transform方法


fit:依次对前n-1个学习器执行fit和transform方法,第n个学习器(最后一个学习器)执行fit方法


predict:执行第n个学习器的predict方法


score:执行第n个学习器的score方法


set_params:设置第n个学习器的参数


get_param:获取第n个学习器的参数


Pipeline妙用:模块化Feature Transform


以鸢尾花数据集分类任务为例


from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
iris=load_iris()
pipe=Pipeline([('sc', StandardScaler()),('pca',PCA()),('svc',SVC())])
#('sc', StandardScaler()) sc为自定义转换器名称,StandardScaler()为执行标准化任务的转换器
pipe.fit(iris.data,iris.target)


先用 StandardScaler 对数据集每一列做标准化处理(transformer)


再用 PCA 主成分分析进行特征降维(transformer)


最后再用 SVC 模型(Estimator)


输出结果:


Pipeline(memory=None,
         steps=[('sc',
                 StandardScaler(copy=True, with_mean=True, with_std=True)),
                ('pca',
                 PCA(copy=True, iterated_power='auto', n_components=None,
                     random_state=None, svd_solver='auto', tol=0.0,
                     whiten=False)),
                ('svc',
                 SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
                     decision_function_shape='ovr', degree=3,
                     gamma='auto_deprecated', kernel='rbf', max_iter=-1,
                     probability=False, random_state=None, shrinking=True,
                     tol=0.001, verbose=False))],
         verbose=False)


训练得到的是一个模型,可直接用来预测,预测时,数据会从step1开始进行转换,避免了模型用来预测的数据还要额外写代码实现。还可通过pipe.score(X,Y)得到这个模型在X训练集上的正确率。


array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])


Pipeline妙用:自动化 Grid Search


Pipeline可以结合GridSearch来对参数进行选择:


from sklearn.datasets import fetch_20newsgroups
import numpy as np
news = fetch_20newsgroups(subset='all')
from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test = train_test_split(news.data[:3000],news.target[:3000],test_size=0.25,random_state=33)
from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer()
X_count_train = vec.fit_transform(X_train)
X_count_test = vec.transform(X_test)
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
#使用pipeline简化系统搭建流程,将文本抽取与分类器模型串联起来
clf = Pipeline([
    ('vect',TfidfVectorizer(stop_words='english')),('svc',SVC())
])
# 注意,这里经pipeline进行特征处理、SVC模型训练之后,得到的直接就是训练好的分类器clf
parameters = {
    'svc__gamma':np.logspace(-2,1,4),
    'svc__C':np.logspace(-1,1,3),
    'vect__analyzer':['word']
}
#n_jobs=-1代表使用计算机的全部CPU
from sklearn.grid_search import GridSearchCV
gs = GridSearchCV(clf,parameters,verbose=2,refit=True,cv=3,n_jobs=-1)
gs.fit(X_train,y_train)
print (gs.best_params_,gs.best_score_)
print (gs.score(X_test,y_test))


输出


{'svc__C': 10.0, 'svc__gamma': 0.1, 'vect__analyzer': 'word'} 0.7906666666666666
0.8226666666666667


Pipeline其他用法


Pipeline 还有一些其他用法,这里只简单介绍最最常用的两个make_pipeline


pipeline.make_pipeline(\*steps, \*\*kwargs)


make_pipeline函数是Pipeline类的简单实现,只需传入每个step的类实例即可,不需自己命名,自动将类的小写设为该step的名。


make_pipeline(StandardScaler(),GaussianNB())


输出


Pipeline(steps=[('standardscaler', StandardScaler(copy=True, with_mean=
True, with_std=True)), ('gaussiannb', GaussianNB(priors=None))])
p=make_pipeline(StandardScaler(),GaussianNB())
p.steps


输出


[('standardscaler', StandardScaler(copy=True, with_mean=True, with_std=True)),
 ('gaussiannb', GaussianNB(priors=None))]


FeatureUnion


pipeline.FeatureUnion(transformer_list[, …])


FeatureUnion,同样通过(key,value)对来设置,通过set_params设置参数。不同的是,每一个step分开计算,FeatureUnion最后将它们计算得到的结果合并到一块,返回的是一个数组,不具备最后一个estimator的方法。有些数据需要标准化,或者取对数,或onehot编码最后形成多个特征项,再选择重要特征,这时候FeatureUnion非常管

用。


from sklearn.pipeline import FeatureUnion
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import FunctionTransformer
from numpy import log1p
step1=('Standar',StandardScaler())
step2=('ToLog',FunctionTransformer(log1p))
steps=FeatureUnion(transformer_list=[step1,step2])
steps.fit_transform(iris.data)
data=steps.fit_transform(iris.data)


大家可以运行看看结果

相关文章
|
4天前
|
机器学习/深度学习 安全 算法
利用机器学习优化网络安全防御机制
【2月更文挑战第23天】 在数字化时代,网络安全已成为维护信息完整性、保障用户隐私的关键挑战。随着攻击手段的日益复杂化,传统的防御策略逐渐显得力不从心。本文通过引入机器学习技术,探索其在网络安全防御中的应用及优化路径。首先,概述了当前网络安全面临的主要威胁和机器学习的基本概念;其次,分析了机器学习在识别恶意行为、自动化响应等方面的潜力;最后,提出了一个基于机器学习的网络安全防御框架,并通过案例分析展示了其有效性。本研究旨在为网络安全领域提供一种创新的防御思路,以适应不断演变的网络威胁。
38 2
|
4天前
|
机器学习/深度学习 数据采集 算法
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
163 0
|
4天前
|
机器学习/深度学习 Python
机器学习中的工作流机制
机器学习中的工作流机制
|
4天前
|
机器学习/深度学习 自然语言处理 并行计算
【机器学习】“注目未来:自注意力机制的巧妙设计引领自然语言处理新潮流“
【机器学习】“注目未来:自注意力机制的巧妙设计引领自然语言处理新潮流“
52 0
|
机器学习/深度学习 算法 Python
机器学习基础:用 Lasso 做特征选择
机器学习基础:用 Lasso 做特征选择
机器学习基础:用 Lasso 做特征选择
|
10月前
|
机器学习/深度学习 数据采集 算法
Scikit-learn中的Pipeline:让机器学习流程更加简单、高效、可靠
Scikit-learn是一个非常流行的机器学习库,提供了各种各样的算法、工具和API,让用户可以轻松地构建和调整机器学习模型。其中一个非常有用的工具是Pipeline,它可以将多个数据预处理步骤和机器学习模型组合在一起,构建起整个机器学习流程。 在这篇博客中,我们将介绍Scikit-learn中的Pipeline,包括Pipeline的基本概念、使用方法和实际案例。这篇博客将将解如何使用Pipeline来构建高效且可靠的机器学习流程,使你的机器学习任务更加简单、高效和可靠。
|
12月前
|
机器学习/深度学习 数据采集 分布式计算
Spark机器学习管道 - Pipeline
Spark机器学习管道 - Pipeline
|
12月前
|
机器学习/深度学习 自然语言处理 语音技术
瞎聊机器学习——Attention机制
瞎聊机器学习——Attention机制
|
机器学习/深度学习 数据采集 存储
机器学习基础
机器学习基础
107 0

热门文章

最新文章