我正在訓練二元分類器使用python
和流行的scikit-learn
模塊的SVM
類。在訓練後,我使用predict
方法進行分類,如sci-kit's SVC documentation所示。查找支持向量機分類的最重要功能
我想知道更多關於我的樣本特徵對經過訓練的decision_function
(支持向量)所產生的分類的重要性。歡迎使用這種模型進行預測時評估特徵重要性的任何策略。
謝謝! Andre
我正在訓練二元分類器使用python
和流行的scikit-learn
模塊的SVM
類。在訓練後,我使用predict
方法進行分類,如sci-kit's SVC documentation所示。查找支持向量機分類的最重要功能
我想知道更多關於我的樣本特徵對經過訓練的decision_function
(支持向量)所產生的分類的重要性。歡迎使用這種模型進行預測時評估特徵重要性的任何策略。
謝謝! Andre
您可以使用SelectFromModel in sklearn來獲取模型的最相關特徵的名稱。 Here is an example提取LassoCV的功能。
您還可以查看this example,它利用SVM中的coef_
屬性顯示最上面的特徵。
那麼,我們如何解釋給定樣本分類的特徵顯着性?
我認爲使用線性內核是首先解決這個問題的最直接的方法,因爲訓練模型的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)
正如你可以看到,我們似乎已經訪問了適當攔截和係數值。由於我們的評分系統基於線性係數,現在我們可以輕鬆研究每個特徵對最終分類的貢獻程度,我們可以很容易地調查每個特徵對最終分類的貢獻程度。這裏我們在該樣本的最後得分上顯示每個特徵效果。
## 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)
我們也可以簡單地排序此相同的數據獲得的功能對於一個給定的分類看貢獻排名列表,它的功能貢獻最大的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
從這個排名列表我們可以看到,爲了最終得分貢獻(約-20連同分類「良性」)的五大功能指標均[0, 22, 13, 2, 21]
對應於我們的數據集中的功能名稱; ['mean radius', 'worst perimeter', 'area error', 'mean perimeter', 'worst texture']
。