我相信这个问题以前已经被问过了,但我找不到答案。
在Python中使用sklearn运行逻辑回归时,我可以使用Transform方法将我的数据集转换为最重要的特征。
classf = linear_model.LogisticRegression()
func = classf.fit(Xtrain, ytrain)
reduced_train = func.transform(Xtrain)
我怎样才能知道哪些特征被选为最重要的?更普遍地说,我怎样才能计算数据集中每个特征的p值?
我相信这个问题以前已经被问过了,但我找不到答案。
在Python中使用sklearn运行逻辑回归时,我可以使用Transform方法将我的数据集转换为最重要的特征。
classf = linear_model.LogisticRegression()
func = classf.fit(Xtrain, ytrain)
reduced_train = func.transform(Xtrain)
我怎样才能知道哪些特征被选为最重要的?更普遍地说,我怎样才能计算数据集中每个特征的p值?
如上面的评论所建议,您可以(而且应该)在拟合之前对数据进行缩放,从而使系数可比较。下面是一些代码,以展示如何实现这一点。我采用此格式进行比较。
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()
coef_
属性中的系数,以查看哪些特征最重要。(对于LogisticRegression而言,所有transform
所做的就是查看绝对值最高的系数。)LogisticRegression.transform
确实使用coef_
来评估特征的重要性。它只是认为绝对值更高的系数更重要。相关代码在这里。如果你想要其他定义的“重要性”,你需要解释一下是什么。 - BrenBarnnp.abs(coef_)
是一种糟糕的尝试来量化特征重要性 - 在多变量设置中这个概念其实并没有太多意义(即变量共同作用来进行预测),除非你的模型通过稀疏性对变量进行选择。如果模型促进稀疏性,那么你可以丢弃权重为零的变量,但从技术上讲,这是你真正能做的全部,如果你想要做到严谨。一些其他的模型会暴露出feature_importance
,具体取决于模型,这是一个更或者更少关于如何解释数据特征的单变量度量。 - eickenbergLogisticRegression.transform
接受一个threshold
值,用于确定要保留哪些特征。直接引用文档字符串:threshold
。否则,默认使用“mean”。threshold
对象属性,因此默认情况下仅保留具有高于平均值(在类别总和后)的绝对值的特征。
scale
代替StandardScaler
:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.scale.html - istewart