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

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

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

如今的社會工業化大生產離不開流水線做業,有了流水線,咱們能夠輕鬆的製造出成千上萬相同的產品,並且所須要的價格成本極大地降低,因此說,流水線操做,使得工業化生產水平極大的提升。git

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

在此,【火爐煉AI】能夠十分確定的告訴你,這是能夠的,並且打造這種機器學習流水線很是方便,只須要短短的五分鐘便可。算法


1. 流水線第一步:準備數據集

數據集在本項目中反而不是很重要,故而咱們用sklearn自帶模塊samples_generator生成一些示例數據便可。雖然numpy也在random模塊中有隨機產生數據集的函數,可是numpy比較適合用於產生一些簡單的抽樣數據。而sklearn中的datasets類卻能夠用來產生適合機器學習模型的數據集。bootstrap

sklearn的datasets中經常使用的API有:app

  1. 用make_regression 生成迴歸模型的數據框架

  2. 用make_hastie_10_2,make_classification或者make_multilabel_classification生成分類模型數據dom

  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著,陶俊傑,陳小莉譯

相關文章
相關標籤/搜索