如何在SVM中显示特征重要性?

如何显示对SVM模型有贡献的重要特征,并显示特征名称?

我的代码如下所示,

首先我导入了模块

from sklearn.preprocessing import StandardScalerfrom sklearn.pipeline import Pipelinefrom sklearn.grid_search import GridSearchCVfrom sklearn.metrics import accuracy_scorefrom sklearn.preprocessing import StandardScalerfrom sklearn.pipeline import Pipelinefrom sklearn.svm import SVCfrom sklearn.model_selection import cross_val_scorefrom sklearn.model_selection import GridSearchCVfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import confusion_matrix, classification_report

然后我将数据分为特征和变量

y = df_new[['numeric values']]X = df_new.drop('numeric values', axis=1).values

然后我设置了管道

steps = [('scalar', StandardScaler()),         ('SVM', SVC(kernel='linear'))]pipeline = Pipeline(steps)

然后我指定了超参数空间

parameters = {'SVM__C':[1, 10, 100],              'SVM__gamma':[0.1, 0.01]}

我创建了训练和测试集

X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2, random_state=21)

实例化GridSearchCV对象:cv

cv = GridSearchCV(pipeline,param_grid = parameters,cv=5)

拟合训练集

cv.fit(X_train,y_train.values.ravel())

预测测试集的标签:y_pred

y_pred = cv.predict(X_test)feature_importances = cv.best_estimator_.feature_importances_

我得到的错误信息

‘Pipeline’ object has no attribute ‘feature_importances_’


回答:

我理解的是,假设你构建了一个包含100个特征的模型,你想知道哪个特征更重要,哪个特征不太重要,如果是这种情况该怎么办?

可以尝试使用单变量特征选择方法,这是一种非常基础的方法,你可以在进入更高级的方法之前先用它来处理你的数据。scikit-learn本身提供了样本代码,你可以根据需要进行修改。

print(__doc__)import numpy as npimport matplotlib.pyplot as pltfrom sklearn import datasets, svmfrom sklearn.feature_selection import SelectPercentile, f_classif################################################################################ 导入一些数据来玩玩# 鸢尾花数据集iris = datasets.load_iris()# 一些不相关的噪声数据E = np.random.uniform(0, 0.1, size=(len(iris.data), 20))# 将噪声数据添加到信息特征中X = np.hstack((iris.data, E))y = iris.target###############################################################################plt.figure(1)plt.clf()X_indices = np.arange(X.shape[-1])################################################################################ 使用F检验进行单变量特征选择# 我们使用默认的选择函数:选择10%最显著的特征selector = SelectPercentile(f_classif, percentile=10)selector.fit(X, y)scores = -np.log10(selector.pvalues_)scores /= scores.max()plt.bar(X_indices - .45, scores, width=.2,        label=r'单变量得分($-Log(p_{value})$)', color='g')################################################################################ 与SVM的权重进行比较clf = svm.SVC(kernel='linear')clf.fit(X, y)svm_weights = (clf.coef_ ** 2).sum(axis=0)svm_weights /= svm_weights.max()plt.bar(X_indices - .25, svm_weights, width=.2, label='SVM权重', color='r')clf_selected = svm.SVC(kernel='linear')clf_selected.fit(selector.transform(X), y)svm_weights_selected = (clf_selected.coef_ ** 2).sum(axis=0)svm_weights_selected /= svm_weights_selected.max()plt.bar(X_indices[selector.get_support()] - .05, svm_weights_selected,        width=.2, label='选择后的SVM权重', color='b')plt.title("比较特征选择")plt.xlabel('特征编号')plt.yticks(())plt.axis('tight')plt.legend(loc='upper right')plt.show()

代码参考 http://scikit-learn.org/0.15/auto_examples/plot_feature_selection.html

注意;对于每个特征,该方法将绘制单变量特征选择的p值以及相应的SVM权重。此方法选择那些显示较大SVM权重的特征。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注