我正在使用以下代码进行特征重要性计算。
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)
我怎么能计算非线性核的真实重要性呢?在给定的例子中,非线性核并没有给出预期的结果。
简短的回答:这是不可能的(至少目前的库无法做到这一点。)线性SVM的特征重要性可以找到,但对于非线性SVM来说却不能找到,原因是,当SVM是非线性的时,数据集被映射到更高维的空间中,这与父数据集和超平面非常不同,并且该高维数据和因此性质与父数据集中的性质不同,并且因此不可能找到该SVM相对于父数据集特征的特征重要性。
一个N x N内核结果是不可逆的,只能追溯!请检查,如果你使用或可以使用梯度。这些通常应该跟踪计算。对于重要性,我想你需要一个冲动反应后的痕迹。因此,如果您输入一堆1。
我并没有深入了解SciKit Learn的实现,如果尝试访问跟踪有意义的话。但在这一点上,你可以追溯到功能的响应,它应该会给你带来重要性。
然而,任何梯度下降都不是专门为了直接跟踪输入而不是导致特定输出的参数。
你必须找到那些反向传播的内核参数w.r.t.响应(给定响应本身的内核参数的梯度)。
因为这可能是不可能的,也可能是绝对复杂的,所以我会提到任何可以带来好结果的东西。例如样本的不同维度之间的内核,而不是每个单独样本之间的内核。或者一些响应函数,可以很好地动态缩放您的功能。
不能直接提取SVM的特征重要性。但是,你可以使用sklearn的排列重要性来获得它。
这里有一个例子:
from sklearn.svm import SVC
from sklearn.inspection import permutation_importance
import numpy as np
import matplotlib.pyplot as plt
svm = SVC(kernel='poly')
svm.fit(X, Y)
perm_importance = permutation_importance(svm, X, Y)
# Making the sum of feature importance being equal to 1.0,
# so feature importance can be understood as percentage
perm_importance_normalized = perm_importance.importances_mean/perm_importance.importances_mean.sum()
# Feature's name (considering your X a DataFrame)
feature_names = X.columns
features = np.array(feature_names)
# Sort to plot in order of importance
sorted_idx = perm_importance_normalized.argsort()
# Plotting
plt.figure(figsize=(13,5))
plt.title('Feature Importance',fontsize=20)
plt.barh(features[sorted_idx], perm_importance_normalized[sorted_idx], color='b', align='center')
plt.xlabel('Relative Importance', fontsize=15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
for index, value in enumerate(perm_importance_normalized[sorted_idx]):
plt.text(value, index,
str(round(value,2)), fontsize=15)
plt.show()