特徵選擇/範例一: Pipeline Anova SVM

http://scikit-learn.org/stable/auto_examples/feature_selection/feature_selection_pipeline.html

此機器學習範例示範佇列的使用,依照順序執行ANOVA挑選主要特徵,並且使用C-SVM來計算特徵的權重與預測。

  1. 使用 make_classification 建立模擬資料
  2. 使用 SelectKBest 設定要用哪種目標函式,以挑出可提供信息的特徵
  3. 使用 SVC 設定支持向量機為分類計算以及其核函數
  4. make_pipeline 合併 SelectKBest物件 與 SVC物件
  5. fit 做訓練,並且以 predict 來做預測

(一)建立模擬資料

在選擇特徵之前需要有整理好的特徵與目標資料。在此範例中,將以make_classification功能建立特徵與目標。該功能可以依照使用者想模擬的情況,建立含有不同特性的模擬資料,像是總特徵數目,其中有幾項特徵含有目標資訊性、目標聚集的程度、目標分為幾類等等的特性。

  1. # import some data to play with
  2. X, y = samples_generator.make_classification(
  3. n_features=20, n_informative=3, n_redundant=0, n_classes=4,
  4. n_clusters_per_class=2)

在本範例,我們將X建立為一個有20個特徵的資料,其中有3種特徵具有目標資訊性,0個特徵是由目標資訊性特徵所產生的線性組合,目標分為4類,而每個分類的目標分布為2個群集。

(二)選擇最好的特徵

在機器學習的訓練之前,可以藉由統計或指定評分函數,算出特徵與目標之間的關係,並挑選出最具有關係的特徵作為訓練的素材,而不直接使用所有特徵做為訓練的素材。

其中一種方法是統計特徵與目標之間的F-score做為評估分數,再挑選F-score最高的幾個特徵作為訓練素材。我們可以用 SelectKBest() 來建立該功能的運算物件。

  1. # ANOVA SVM-C
  2. # 1) anova filter, take 3 best ranked features
  3. anova_filter = SelectKBest(f_regression, k=3)

SelectKBest()的第一項參數須給定評分函數,在本範例是設定為f_regression 。第二項參數代表選擇評估分數最高的3個特徵做為訓練的素材。建立完成後,即可用物件內的方法.fit_transform(X,y) 來提取被選出來的特徵。

(三)以佇列方式來設定支持向量機分類法運算物件

Scikit-lenarn的支持向量機分類涵式庫提供使用簡單易懂的指令,只要用 SVC() 建立運算物件後,便可以用運算物件內的方法 .fit().predict() 來做訓練與預測。

本範例在建立運算物件後,不直接用SelectKBest().fit_transform() 提出訓練素材。而是以 make_pipeline()合併先前設定好的兩個運算物件。再執行.fit().predict()來完成訓練與預測的動作。

  1. # 2) svm
  2. clf = svm.SVC(kernel='linear')
  3. anova_svm = make_pipeline(anova_filter, clf)
  4. anova_svm.fit(X, y)
  5. anova_svm.predict(X)

當我們以佇列建立好的運算物件,就可以直接給定所有的特徵資料與目標資料做訓練與預測。在訓練過程中,會依照給定的特徵素材數目從特徵資料中挑出特徵素材。預測時,也會從預測資料中挑出對應特徵素材的資料來做預測判斷。

若是將SelectKBest()SVC()物件分開來執行,當 SVC()物件在做學習時給定的特徵即為被選出來的特徵素材數目。那預測的時候也必須從預測資料中,挑出被SelectKBest()選出來的特徵來給SVC()做預測。


(四)原始碼

Python source code: feature_selection_pipeline.py

  1. from sklearn import svm
  2. from sklearn.datasets import samples_generator
  3. from sklearn.feature_selection import SelectKBest, f_regression
  4. from sklearn.pipeline import make_pipeline
  5. # import some data to play with
  6. X, y = samples_generator.make_classification(
  7. n_features=20, n_informative=3, n_redundant=0, n_classes=4,
  8. n_clusters_per_class=2)
  9. # ANOVA SVM-C
  10. # 1) anova filter, take 3 best ranked features
  11. anova_filter = SelectKBest(f_regression, k=3)
  12. # 2) svm
  13. clf = svm.SVC(kernel='linear')
  14. anova_svm = make_pipeline(anova_filter, clf)
  15. anova_svm.fit(X, y)
  16. anova_svm.predict(X)

(五)函式用法

make_classification() 的參數

  1. sklearn.datasets.make_classification( n_samples=100,
  2. n_features=20,
  3. n_informative=2,
  4. n_redundant=2,
  5. n_repeated=0,
  6. n_classes=2,
  7. n_clusters_per_class=2,
  8. weights=None,
  9. flip_y=0.01,
  10. class_sep=1.0,
  11. hypercube=True,
  12. shift=0.0,
  13. scale=1.0,
  14. shuffle=True,
  15. random_state=None)

參數:

  • n_samples :
  • n_fratures : 總特徵數目
  • n_informative: 有意義的特徵數目
  • n_redundant : 產生有意義特徵的隨機線性組合
  • n_repeated
  • n_classes: 共分類為幾類
  • n_clusters_per_class: 一個類群有幾個群組分布
  • weights :
  • flip_y :
  • class_sep :
  • hypercube :
  • shift :
  • scale :
  • shuffle :
  • random_state :

輸出:

  • X : 特徵矩陣資料
  • Y : 對應目標資料

類似的功能:

make_blobs

make_gaussian_quantiles


SelectKBest() 的參數

SelectKBest 的使用:

  • 選擇最好的特徵(目標函式, 特徵個數)
  • 目標函式: 測試X與Y之間關係,須提供F score與p-value
  • 特徵個數: 最好的特徵個數

f_regression 的使用:

  • f_regression(X,y)
  • 輸入X與y
  • 輸出F score與p-value