如何确定SVM中非线性核的特征重要性

时间:2017-01-13 05:58:57

标签: python machine-learning scikit-learn svm

我正在使用以下代码进行功能重要性计算。

from matplotlib import pyplot as plt
from sklearn import svm

def features_importances(coef, names):
    imp = coef
    imp,names = zip(*sorted(zip(imp,names)))
    plt.barh(range(len(names)), imp, align='center')
    plt.yticks(range(len(names)), names)
    plt.show()

features_names = ['input1', 'input2']
svm = svm.SVC(kernel='linear')
svm.fit(X, Y)
feature_importances(svm.coef_, features_names)

我如何能够计算非线性核的特征重要性,在给定的例子中,它不能给出预期的结果。

2 个答案:

答案 0 :(得分:0)

简短回答:这是不可能的,(至少目前的图书馆无法做到这一点。)线性SVM的特征重要性可以找到但不能用于非线性SVM,原因是,当SVM是非线性的时,数据集被映射到更高维度的空间,这与父数据集完全不同,并且获得超平面,并且这个高维数据因此属性从父数据集的属性改变,因此无法找到此SVM与父数据集要素相关的要素重要性。

答案 1 :(得分:0)

N x N 核结果不可逆,只能追溯! 请检查,如果您使用或可以使用渐变。 那些通常应该跟踪计算。 我猜你需要脉冲响应后的跟踪的重要性。 因此,如果您输入一堆。

我对 SciKit-Learn 的实现并没有那么深入,如果尝试访问跟踪有意义的话。 但在那一点上,您将响应追溯到功能,它应该给您重要性。

尽管如此,任何梯度下降都不是专门用于直接跟踪输入而不是导致特定输出的参数。

您必须找到内核 w.r.t. 的那些反向传播参数。响应(给定响应本身的内核参数的梯度)。

因为这甚至可能是不可能的或绝对复杂的,所以我会提到任何可以带来好的结果的东西。 例如样本不同维度之间的内核,而不是每个单独样本之间的内核。 或者一些响应函数,可以很好地动态缩放你的特征。