sklearn逻辑回归-重要特征

16

我相信这个问题以前已经被问过了,但我找不到答案。

在Python中使用sklearn运行逻辑回归时,我可以使用Transform方法将我的数据集转换为最重要的特征。

classf = linear_model.LogisticRegression()
func  = classf.fit(Xtrain, ytrain)
reduced_train = func.transform(Xtrain)

我怎样才能知道哪些特征被选为最重要的?更普遍地说,我怎样才能计算数据集中每个特征的p值?

3个回答

15

如上面的评论所建议,您可以(而且应该)在拟合之前对数据进行缩放,从而使系数可比较。下面是一些代码,以展示如何实现这一点。我采用格式进行比较。

import numpy as np    
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
import pandas as pd
import matplotlib.pyplot as plt

x1 = np.random.randn(100)
x2 = np.random.randn(100)
x3 = np.random.randn(100)

#Make difference in feature dependance
y = (3 + x1 + 2*x2 + 5*x3 + 0.2*np.random.randn()) > 0

X = pd.DataFrame({'x1':x1,'x2':x2,'x3':x3})

#Scale your data
scaler = StandardScaler()
scaler.fit(X) 
X_scaled = pd.DataFrame(scaler.transform(X),columns = X.columns)

clf = LogisticRegression(random_state = 0)
clf.fit(X_scaled, y)

feature_importance = abs(clf.coef_[0])
feature_importance = 100.0 * (feature_importance / feature_importance.max())
sorted_idx = np.argsort(feature_importance)
pos = np.arange(sorted_idx.shape[0]) + .5

featfig = plt.figure()
featax = featfig.add_subplot(1, 1, 1)
featax.barh(pos, feature_importance[sorted_idx], align='center')
featax.set_yticks(pos)
featax.set_yticklabels(np.array(X.columns)[sorted_idx], fontsize=8)
featax.set_xlabel('Relative Feature Importance')

plt.tight_layout()   
plt.show()

为了简洁起见,您也可以使用 scale 代替 StandardScaler:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.scale.html - istewart
你可以在以下代码中对数据进行缩放:clf = LogisticRegression().fit(X/np.std(X, 0),y) - rafine

4
您可以查看已拟合模型的coef_属性中的系数,以查看哪些特征最重要。(对于LogisticRegression而言,所有transform所做的就是查看绝对值最高的系数。)
大多数scikit-learn模型不提供计算p值的方法。广义上讲,这些模型旨在用于实际预测输出,而不是被检查以获取关于如何进行预测的理解。如果您对p值感兴趣,可以看一下statsmodels,尽管它比sklearn成熟度略低。

3
据我理解,coefs_的大小并不是衡量特征重要性的标准。您能否详细说明一下我应该如何看待这些数字?谢谢。 - mel
1
@mel:从源代码来看,我可以看到LogisticRegression.transform确实使用coef_来评估特征的重要性。它只是认为绝对值更高的系数更重要。相关代码在这里。如果你想要其他定义的“重要性”,你需要解释一下是什么。 - BrenBarn
6
实际上,np.abs(coef_) 是一种糟糕的尝试来量化特征重要性 - 在多变量设置中这个概念其实并没有太多意义(即变量共同作用来进行预测),除非你的模型通过稀疏性对变量进行选择。如果模型促进稀疏性,那么你可以丢弃权重为零的变量,但从技术上讲,这是你真正能做的全部,如果你想要做到严谨。一些其他的模型会暴露出feature_importance,具体取决于模型,这是一个更或者更少关于如何解释数据特征的单变量度量。 - eickenberg
1
你无法将数据标准化以使系数可比吗? - Santosh

4
LogisticRegression.transform接受一个threshold值,用于确定要保留哪些特征。直接引用文档字符串:
阈值:字符串、浮点数或None,可选(默认为None) 用于特征选择的阈值值。保留其重要性大于等于阈值的特征,而将其他特征丢弃。如果是“中位数”(resp. “平均数”),则阈值值为特征重要性的中位数(resp. 平均数)。也可以使用缩放因子(例如,“1.25*mean”)。如果为None,并且如果有,则使用对象属性threshold。否则,默认使用“mean”。
LR估计器上没有threshold对象属性,因此默认情况下仅保留具有高于平均值(在类别总和后)的绝对值的特征。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接