Sklearn中Pipeline的使用

Pipeline可以將許多算法模型串聯(lián)起來,比如將特征提取、歸一化、分類組織在一起形成一個典型的機器學(xué)習(xí)問題工作流。主要帶來兩點好處:

  1. 直接調(diào)用fit和predict方法來對pipeline中的所有算法模型進行訓(xùn)練和預(yù)測。
  2. 可以結(jié)合grid search對參數(shù)進行選擇。

在下面的例子中,我們使用決策樹模型來預(yù)測泰坦尼克乘客生還,我們首先將非數(shù)值型數(shù)據(jù)轉(zhuǎn)換為數(shù)值型數(shù)據(jù),然后使用決策樹模型來進行分類:

import pandas as pd
import numpy as np
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
titanic.head()
titanic.info()
X = titanic[['pclass','age','sex']]
y = titanic['survived']
X['age'].fillna(X['age'].mean(),inplace=True)
X.info()
from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=33)
X_train = X_train.to_dict(orient='record')
X_test = X_test.to_dict(orient='record')
#將非數(shù)值型數(shù)據(jù)轉(zhuǎn)換為數(shù)值型數(shù)據(jù)
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier
from sklearn.pipeline import Pipeline
clf = Pipeline([('vecd',DictVectorizer(sparse=False)),('dtc',DecisionTreeClassifier())])
vec = DictVectorizer(sparse=False)

clf.fit(X_train,y_train)
y_predict = clf.predict(X_test)
from sklearn.metrics import classification_report
print (clf.score(X_test,y_test))
print(classification_report(y_predict,y_test,target_names=['died','survivied']))

Pipeline可以結(jié)合GridSearch來對參數(shù)進行選擇,參考下面的例子:

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簡化系統(tǒng)搭建流程,將文本抽取與分類器模型串聯(lián)起來
clf = Pipeline([
    ('vect',TfidfVectorizer(stop_words='english')),('svc',SVC())
])

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)

%time _=gs.fit(X_train,y_train)
print (gs.best_params_,gs.best_score_)
print (gs.score(X_test,y_test))

可以看到,parameters變量里面的key都有一個前綴,不難發(fā)現(xiàn),這個前綴其實就是在Pipeline中定義的操作名。二者相結(jié)合,是我們的代碼變得十分簡潔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容