【火爐煉AI】機器學習028-五分鐘教你打造機器學習流水線

煉丹老頑童發表於2018-09-10

【火爐煉AI】機器學習028-五分鐘教你打造機器學習流水線

(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

現在的社會工業化大生產離不開流水線作業,有了流水線,我們可以輕鬆的製造出成千上萬相同的產品,而且所需要的價格成本極大地下降,所以說,流水線操作,使得工業化生產水平極大的提高。

那麼有沒有可能將這種流水線的處理思想轉移到機器學習領域了?我們可不可以將資料清洗-資料規整-資料處理-特徵選擇-監督學習-模型評估等一整套流程做成一條機器學習的流水線了?如果可以,那就能極大的節省我們打造一個AI模型的時間,極大的提高構建優秀AI的效率。

在此,【火爐煉AI】可以十分肯定的告訴你,這是可以的,而且打造這種機器學習流水線非常方便,只需要短短的五分鐘即可。


1. 流水線第一步:準備資料集

資料集在本專案中反而不是很重要,故而我們用sklearn自帶模組samples_generator生成一些示例資料即可。雖然numpy也在random模組中有隨機產生資料集的函式,但是numpy比較適合用於產生一些簡單的抽樣資料。而sklearn中的datasets類卻可以用來產生適合機器學習模型的資料集。

sklearn的datasets中常用的API有:

  1. 用make_regression 生成迴歸模型的資料

  2. 用make_hastie_10_2,make_classification或者make_multilabel_classification生成分類模型資料

  3. 用make_blobs生成聚類模型資料

  4. 用make_gaussian_quantiles生成分組多維正態分佈的資料

# 準備資料集
from sklearn.datasets import samples_generator
# 使用這個函式產生示例資料
X,y=samples_generator.make_classification(n_informative=4,
                                          n_features=20,
                                          n_redundant=0,
                                          random_state=5)
# 產生一個分類資料集,包含有100個樣本,20個features,2個類別,沒有冗餘特徵。
# print(X.shape) # (100, 20)
# print(y.shape)  # (100,)
# print(X[:3]) # 檢視沒有問題
複製程式碼

2. 流水線第二步:構建特徵選擇器

在資料集準備完成之後,需要提取資料集中最重要的幾個特徵,即對我們的分類結果影響最大的幾個主要特徵,這樣做可以減小模型的複雜程度,同時還能保持模型的預測精準度。sklearn框架也為我們準備好了特徵選擇函式SelectKBest(),我們只需要指定要選擇的特徵數K即可。如下為程式碼,非常簡單。

# 建立特徵選擇器
from sklearn.feature_selection import SelectKBest, f_regression
feature_selector=SelectKBest(f_regression,k=10) 
# 一共20個特徵向量,我們從中選擇最重要的10個特徵向量
複製程式碼

3. 流水線第三步:構建分類器

下一步,我們就需要構建分類器模型,前面在我的文章中講到了很多分類器演算法,比如SVM,隨機森林,樸素貝葉斯等,此處我們構建一個簡單的隨機森林分類器作為例子。

# 建立分類器
from sklearn.ensemble import RandomForestClassifier
classifier=RandomForestClassifier(n_estimators=50,max_depth=4)
# 此處構建隨機森林分類器作為例子,引數隨便指定
複製程式碼

4. 流水線第四步:組裝完整流水線

上面的幾個步驟相當於建立各種產品處理模組,這一步我們就需要將這些模組組裝起來,構建成一個可以完整執行的機器學習流水線。程式碼很簡單,如下所示。

# 第四步:組裝完整流水線
from sklearn.pipeline import Pipeline
pipeline=Pipeline([('selector',feature_selector),
                   ('rf_classifier',classifier)])
# 修改流水線中引數設定
# 假如我們希望特徵選擇器不是選擇10個特徵,而是5個特徵,
# 同時分類器中的引數n_estimators也要修改一下,可以採用:
pipeline.set_params(selector__k=5,
                    rf_classifier__n_estimators=25)
複製程式碼

------------------------輸---------出--------------------------------

Pipeline(memory=None,
steps=[('selector', SelectKBest(k=5, score_func=<function f_regression at 0x000000001891B7B8>)), ('rf_classifier', RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
max_depth=4, max_features='auto', max_leaf_nodes=None,
min_impurity_decrease=0.0, min...n_jobs=1,
oob_score=False, random_state=None, verbose=0,
warm_start=False))])

------------------------------完-------------------------------------

從上面的輸出中可以看出,這個流水線中只有兩個模組,一個是特徵選擇器selector,另外一個是分類器rf_classifier,各自分別的引數位於後面。

對於模型,最終都是要用資料集進行訓練,並且用訓練好的模型來對新樣本做出預測。如下為程式碼:

# 將資料輸入到流水線中
pipeline.fit(X,y) # 對流水線進行訓練

predict_y=pipeline.predict(X) #用訓練好的流水線預測樣本
# print(predict_y)

# 評估該流水線的模型效能
print('pipeline model score: {:.3f}'.format(pipeline.score(X,y)))
複製程式碼

----------------------輸---------出------------------------------

pipeline model score: 0.960

--------------------------完-------------------------------------

這個流水線模型在訓練集上的得分為0.960,貌似效能還不錯。

上面我們構建了一個特徵選擇器,但是怎麼知道哪些特徵被選擇,哪些陪拋棄了?如下程式碼:

# 檢視特徵選擇器選擇的特徵:
feature_status=pipeline.named_steps['selector'].get_support()
# get_support()會返回true/false,如果支援該feature,則為true.
selected_features=[]
for count,item in enumerate(feature_status):
    if item: selected_features.append(count)
print('selected features by pipeline, (0-indexed): \n{}'.format(
        selected_features))
複製程式碼

--------------------輸---------出--------------------------------

selected features by pipeline, (0-indexed): [5, 9, 10, 11, 15]

--------------------------完-------------------------------------

由此可以看出,流水線自動選擇了五個特徵(我們前面指定了k=5),這最重要的五個特徵分別是標號為5,9,10,11,15的特徵。

########################小**********結###############################

1,打造機器學習流水線非常簡單,只需要先構建機器學習的基本模組即可,然後將這些模組組裝起來。

2,前面的特徵提取器選擇最重要特徵的過程是先進行單變數統計測試,然後從特徵向量中抽取最優秀的特徵。這種測試之後,向量空間中的每個特徵將有一個評價分數,基於這些評價分數,選擇最好的K個特徵,一旦抽取出K個特徵,一旦K維的特徵向量形成,就可以用這個特徵向量用於分類器的輸入訓練資料。

3,打造這種流水線的優勢有很多,可以簡單快速的構建機器學習模型,可以方便的提取最重要的K個特徵向量,可以快速的評估構建的模型,正所謂,這是個快速進行AI模型構建的必備良器。

4,上面的流水線只是整合了特徵選擇,分類器部分,唯一讓人遺憾的是,怎麼把資料處理,資料清洗這部分也整合到流水線中?暫時我還沒有找到這部分內容,有哪位朋友找到了這種方法,請聯絡我啊。

#################################################################


注:本部分程式碼已經全部上傳到(我的github)上,歡迎下載。

參考資料:

1, Python機器學習經典例項,Prateek Joshi著,陶俊傑,陳小莉譯

相關文章