2017-10-04 59 views
-1

我正在訓練二元分類器使用python和流行的scikit-learn模塊的SVM類。在訓練後,我使用predict方法進行分類,如sci-kit's SVC documentation所示。查找支持向量機分類的最重要功能

我想知道更多關於我的樣本特徵對經過訓練的decision_function(支持向量)所產生的分類的重要性。歡迎使用這種模型進行預測時評估特徵重要性的任何策略。

謝謝! Andre

回答

1

那麼,我們如何解釋給定樣本分類的特徵顯着性?

我認爲使用線性內核是首先解決這個問題的最直接的方法,因爲訓練模型的svc.coef_屬性的重要性/相對簡單性。 check out Bitwise's answer

下面我將使用scikit訓練數據訓練線性核SVM。然後我們將看看coef_屬性。我將包含一個簡單的圖,顯示分類器係數和訓練特徵數據的點積如何劃分結果類。

from sklearn import svm 
from sklearn.datasets import load_breast_cancer 
import numpy as np 
import matplotlib.pyplot as plt 

data = load_breast_cancer() 
X = data.data    # training features 
y = data.target    # training labels 
lin_clf = svm.SVC(kernel='linear') 
lin_clf.fit(X,y) 

scores = np.dot(X, lin_clf.coef_.T) 

b0 = y==0 # boolean or "mask" index arrays 
b1 = y==1 
malignant_scores = scores[b1] 
benign_scores = scores[b1] 

fig = plt.figure() 
fig.suptitle("score breakdown by classification", fontsize=14, fontweight='bold') 
score_box_plt = ply.boxplot(
    [malignant_scores, benign_scores], 
    notch=True, 
    labels=list(data.target_names), 
    vert=False 
) 
plt.show(score_box_plt)   

score_box_plt

正如你可以看到,我們似乎已經訪問了適當攔截和係數值。由於我們的評分系統基於線性係數,現在我們可以輕鬆研究每個特徵對最終分類的貢獻程度,我們可以很容易地調查每個特徵對最終分類的貢獻程度。這裏我們在該樣本的最後得分上顯示每個特徵效果。

## sample we're using X[2] --> classified benign, lin_clf score~(-20) 
lin_clf.predict(X[2].reshape(1,30)) 

contributions = np.multiply(X[2], lin_clf.coef_.reshape((30,))) 
feature_number = np.arange(len(contributions)) +1 

plt.bar(feature_number, contributions, align='center') 
plt.xlabel('feature index') 
plt.ylabel('score contribution') 
plt.title('contribution to classification outcome by feature index') 
plt.show(feature_contrib_bar) 

contribution to classification outcome by feature index

我們也可以簡單地排序此相同的數據獲得的功能對於一個給定的分類看貢獻排名列表,它的功能貢獻最大的score我們正在評估的組成。

abs_contributions = np.flip(np.sort(np.absolute(contributions)), axis=0) 
feat_and_contrib = [] 
for contrib in abs_contributions: 
    if contrib not in contributions: 
     contrib = -contrib 
     feat = np.where(contributions == contrib) 
     feat_and_contrib.append((feat[0][0], contrib)) 
    else: 
     feat = np.where(contributions == contrib) 
     feat_and_contrib.append((feat[0][0], contrib)) 

# sorted by max abs value. each row a tuple:;(feature index, contrib) 
feat_and_contrib 

contribution-ranked list including feature index

從這個排名列表我們可以看到,爲了最終得分貢獻(約-20連同分類「良性」)的五大功能指標均[0, 22, 13, 2, 21]對應於我們的數據集中的功能名稱; ['mean radius', 'worst perimeter', 'area error', 'mean perimeter', 'worst texture']