特徵選擇/範例三: Recursive feature elimination with cross-validation

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

REFCV比REF多一個交叉比對的分數(gridscores),代表選擇多少特徵後的準確率。但REFCV不用像REF要給定選擇多少特徵,而是會依照交叉比對的分數而自動選擇訓練的特徵數。

本範例示範RFE的進階版,當我們在使用RFE指令時,需要輸入訓練特徵數目,讓訓練機能排除到其他較不具有影響力的特徵,也就是要有預期的訓練特徵數目。在RFECV指令提供了使用交叉驗證來選擇有最好準確率的訓練特徵數目。而交叉驗證也可以幫助我們避免訓練時造成過度訓練(overfitting)的現象,也就是當我們從某一組資料中挑出一筆訓練資料,能夠對剩下的測試資料預測出準確度最好的分類,卻發現這個分類機狀態無法準確的辨識新進資料的結果,因為這個最佳狀態只適用在特定的組合情況。因此使用RFECV後,我們可以從結果看出,使用多少特徵做分類判斷可以得到的準確率高低。

  1. 以疊代方式計算模型
  2. 以交叉驗證來取得影響力特徵

(一)建立模擬資料

  1. # Build a classification task using 3 informative features
  2. X, y = make_classification(n_samples=1000, n_features=25, n_informative=3,
  3. n_redundant=2, n_repeated=0, n_classes=8,
  4. n_clusters_per_class=1, random_state=0)

說明可以參考EX1,執行過此函數後,我們可以得到具有25個特徵且有1000樣本的資料,其中具有目標影響力的特徵有三個,有兩個特徵是由具有資訊影響力的特徵線性組合出來的,而目標共有八個分類類別。

(二)以疊代排序特徵影響力,並以交叉驗證來選出具有實際影響力的特徵

在使用RFECV指令前,需要建立支持向量機物件,以及交叉驗證的形式。本範例仍使用SVC以及線性核函數來作為主要的分類機。

在交叉驗證的部分,我們使用StratifiedKFold指令來做K 堆疊(Fold)的交叉驗證。也就是將資料分為K堆,一堆作為預測用,剩下的(K-1)堆則用來訓練,經過計算後,再以另外一堆作為預測,重複K次。

scoring參數則是依照分類資料的形式,輸入對應的評分方式。以本例子為超過兩類型的分類,因此使用’accuracy’來對多重分類的評分方式。詳細可參考scoring

  1. # Create the RFE object and compute a cross-validated score.
  2. svc = SVC(kernel="linear")
  3. # The "accuracy" scoring is proportional to the number of correct
  4. # classifications
  5. rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(y, 2),
  6. scoring='accuracy')
  7. rfecv.fit(X, y)
  8. print("Optimal number of features : %d" % rfecv.n_features_)

以RFECV設定好的功能物件,即可用以做訓練的動作。其結果可由nfeatures得知有幾樣特徵是具有實際影響力。並可以由gridscores看出特徵的多寡如何影響準確率。
此功能需要設定交叉驗證的形式,本範例是以交叉驗證產生器做為輸入,其功能介紹如下。

(三)畫出具有影響力特徵對應準確率的圖

下圖的曲線表示選擇多少個特徵來做訓練,會得到多少的準確率。

Ex 3: Recursive Feature Elimination with Cross-Validation - 图1

可以看到選擇三個最具有影響力的特徵時,交叉驗證的準確率高達81.8%。與建立模擬資料的n_informative=3是相對應的。

(四) 原始碼出處

Python source code: plot_rfe_digits.py

  1. print(__doc__)
  2. import matplotlib.pyplot as plt
  3. from sklearn.svm import SVC
  4. from sklearn.cross_validation import StratifiedKFold
  5. from sklearn.feature_selection import RFECV
  6. from sklearn.datasets import make_classification
  7. # Build a classification task using 3 informative features
  8. X, y = make_classification(n_samples=1000, n_features=25, n_informative=3,
  9. n_redundant=2, n_repeated=0, n_classes=8,
  10. n_clusters_per_class=1, random_state=0)
  11. # Create the RFE object and compute a cross-validated score.
  12. svc = SVC(kernel="linear")
  13. # The "accuracy" scoring is proportional to the number of correct
  14. # classifications
  15. rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(y, 2),
  16. scoring='accuracy')
  17. rfecv.fit(X, y)
  18. print("Optimal number of features : %d" % rfecv.n_features_)
  19. # Plot number of features VS. cross-validation scores
  20. plt.figure()
  21. plt.xlabel("Number of features selected")
  22. plt.ylabel("Cross validation score (nb of correct classifications)")
  23. plt.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_)
  24. plt.show()

本章介紹到函式用法

RFECV() 的參數

  1. class sklearn.feature_selection.RFECV(estimator, step=1, cv=None, scoring=None, estimator_params=None, verbose=0)[source]

參數

  • estimator
  • step
  • cv: 若無輸入,預設為3-fold的交叉驗證。輸入整數i,則做i-fold交叉驗證。若為物件,則以該物件做為交叉驗證產生器。
  • scoring
  • estimator_params
  • verbose

輸出

  • n_features_: 預測有影響力的特徵的總數目
  • support_: 有影響力的特徵遮罩,可以用來挑出哪些特徵
  • ranking_: 各特徵的影響力程度
  • gridscores: 從最有影響力的特徵開始加入,計算使用多少個特徵對應得到的準確率。
  • estimator_