繁体   English   中英

查找 SVM 分类最重要的特征

[英]Find the most import features for a SVM classification

我正在使用python和流行的scikit-learn模块的SVM类训练一个二元分类器。 训练后,我使用predict方法进行分类,如sci-kit 的 SVC 文档中所述

我想更多地了解我的样本特征对训练有素的decision_function (支持向量)所做的分类结果的重要性。 欢迎使用任何在使用此类模型进行预测时评估特征重要性的策略。

谢谢! 安德烈

那么,我们如何解释给定样本分类的特征显着性?

我认为使用线性内核是首先解决这个问题的最直接的方法,因为训练模型的svc.coef_属性的重要性/相对简单性。 查看 Bitwise 的答案

下面我将使用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

如您所见,我们似乎确实访问了适当的截距和系数值。 我们的决策边界徘徊在 0 左右,班级分数明显分离。

现在我们有了一个基于线性系数的评分系统,我们可以轻松地研究每个特征如何对最终分类做出贡献。 在这里,我们显示每个特征对样本最终得分的影响。

## 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']

假设您有词袋特征化,并且您想知道哪些词对分类很重要,然后将此代码用于线性 svm

weights = np.abs(lr_svm.coef_[0])
sorted_index = np.argsort(wt)[::-1]
top_10 = sorted_index[:10]
terms = text_vectorizer.get_feature_names()
for ind in top_10:
    print(terms[ind])

您可以在 sklearn 中使用SelectFromModel来获取模型中最相关特征的名称。 这是为 LassoCV 提取特征的示例。

您还可以查看此示例该示例使用 SVM 中的coef_属性来可视化最重要的特征。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM