【问题标题】:How to determine feature importance of non linear kernals in SVM如何确定 SVM 中非线性核的特征重要性
【发布时间】:2017-05-28 10:49:14
【问题描述】:

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

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)

我如何能够计算非线性内核的特征重要性,这在给定的示例中没有给出预期的结果。

【问题讨论】:

标签: python machine-learning scikit-learn svm


【解决方案1】:

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

我对 SciKit-Learn 的实施并没有那么深入,如果尝试访问这些痕迹是否有意义。 但那时,您将响应追溯到功能,它应该给您重要性。

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

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

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

【讨论】:

  • 另一方面,有几个库已经做了这样的事情。例如sklearn.inspection.permutation_importance 或 SHAP 包
【解决方案2】:

简短的回答:这是不可能的,(至少目前的库无法做到这一点。)线性 SVM 的特征重要性可以被发现,但对于非线性 SVM,原因是,当 SVM 是非线性 数据集被映射到更高维度的空间,这与父数据集完全不同,并且获得了超平面,并且该高维数据因此属性与父数据集的属性发生了变化,因此不可能找出这个 SVM 相对于父数据集特征的特征重要性。

【讨论】:

    猜你喜欢
    • 2012-06-19
    • 2019-12-13
    • 1970-01-01
    • 2011-11-18
    • 2019-04-25
    • 2019-11-26
    • 2020-03-14
    • 2014-10-16
    • 2019-09-11
    相关资源
    最近更新 更多