【问题标题】:sklearn logistic regression - important featuressklearn 逻辑回归 - 重要特征
【发布时间】:2014-08-06 23:43:15
【问题描述】:

我很确定以前有人问过这个问题,但我找不到答案

在 python 上使用 sklearn 运行逻辑回归,我能够转换 使用 Transform 方法将我的数据集转换为最重要的特征

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

如何判断哪些功能被选为最重要? 更一般地,如何计算数据集中每个特征的 p 值?

【问题讨论】:

    标签: python scikit-learn feature-selection


    【解决方案1】:

    您可以查看拟合模型的coef_ 属性中的系数,以了解哪些特征最重要。 (对于 LogisticRegression,transform 所做的只是查看哪些系数的绝对值最高。)

    大多数 scikit-learn 模型不提供计算 p 值的方法。从广义上讲,这些模型旨在用于实际预测输出,而不是进行检查以了解预测是如何完成的。如果您对 p 值感兴趣,可以查看 statsmodels,尽管它不如 sklearn 成熟。

    【讨论】:

    • 据我了解,coefs_ 大小不是衡量特征重要性的标准。您能否详细说明我应该如何看待这些数字?谢谢
    • @mel:查看源代码,我可以看到LogisticRegression.transform确实是在使用coef_来评估特征重要性。它只是认为具有更高绝对值的系数更重要。相关代码为here。如果您想要“重要性”的其他定义,您需要解释它是什么。
    • 确实,np.abs(coef_) 在量化特征重要性方面是一次糟糕的尝试——这个概念在多变量设置中并没有多大意义(即变量共同作用以进行预测),除非你模型进行变量选择,例如通过稀疏。如果模型促进稀疏性,那么您可以丢弃权重为零的变量,但从技术上讲,如果您想要严格,这就是您真正可以做的所有事情。其他一些模型公开了feature_importance,并且根据模型,这或多或少是衡量此功能解释数据的程度的单变量
    • 您不能标准化您的数据以使系数具有可比性吗?
    【解决方案2】:

    LogisticRegression.transform 采用 threshold 值,该值确定要保留哪些功能。直接来自文档字符串:

    阈值:字符串,浮点数或无,可选(默认=无) 用于特征选择的阈值。特点 重要性大于或等于保留,而其他重要 丢弃。如果 "median" (resp. "mean"),那么阈值为 特征重要性的中位数(分别是平均值)。缩放 也可以使用因子(例如,“1.25*mean”)。如果没有,如果 可用时,使用对象属性threshold。否则, 默认使用“mean”。

    LR 估计器上没有对象属性threshold,因此默认情况下只保留绝对值高于平均值(在对类求和后)的那些特征。

    【讨论】:

      【解决方案3】:

      正如上面 cmets 中所建议的,您可以(并且应该)在拟合之前缩放您的数据,从而使系数具有可比性。下面是一个小代码来展示它是如何工作的。我按照this 格式进行比较。

      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()
      

      【讨论】:

      猜你喜欢
      • 2021-06-19
      • 2014-01-19
      • 2018-02-27
      • 2018-09-23
      • 2018-12-03
      • 2020-04-14
      • 1970-01-01
      • 2021-06-10
      • 2023-03-25
      相关资源
      最近更新 更多