【问题标题】:Feature selection using LinearRegression()使用 LinearRegression() 进行特征选择
【发布时间】:2016-03-16 04:19:27
【问题描述】:

我正在尝试使用 scikit-learn 库进行特征选择。 我的数据很简单。行是样本,列是特征。虽然原始的类标签是 X 和 Y,但我将它们更改为用于线性回归的数字,X 为 0,Y 为 1。

G1  G2  G3  ... Gn Class
1.0 4.0 5.0 ... 1.0 0
4.0 5.0 9.0 ... 1.0 0
9.0 6.0 3.0 ... 2.0 1
...

我使用了库 sklearn.linear_model.LinearRegression(),效果很好。现在我使用 coef_ 值进行特征选择。在这种情况下,我有 2 个问题。

使用特征的coef_值对吗?或者LinearRegression()中还有其他更好的特征选择参数吗?

另外,是否有某种规则来决定合适的阈值(例如,特征选择的 coef_ 的最小值)?

【问题讨论】:

  • 你可能想谷歌lasso :)
  • @cel 据我所知,lasso 是使用 L1 惩罚的模型。但是,虽然我使用了 lasso,但在确定合适的阈值时也会出现同样的问题。我可能会选择 Top-N 排名特征,但我想找到一些边界线(某个值)进行决策。
  • L1 惩罚的优点是,它更喜欢 0 值系数。它通过将不重要特征的系数设置为 0 来为您执行特征选择。您只需将正则化参数设置得足够高,直到您对特征数量与准确性的权衡感到满意。那么你将不需要任何阈值,因为系数已经是 0。
  • @Robin Spiess 谢谢你的建议。事实上,我之前使用过 LassoRegression()。但是,由于数据集中的特征数量很大(约50,000),仍然有很多特征coef_>0,有时甚至会出现“收敛警告”,所以我想找到一个更严格的阈值。
  • 我不知道任何正式的阈值规则。我要做的是尝试多个阈值并使用生成的功能集进行交叉验证。基本上:将所有 feature_coeffs thresh 设置为 0,然后仅使用在数据子集上仍然具有非零系数的特征重新训练模型并测试结果对其余数据进行建模。调整阈值,直到您对结果满意为止。

标签: python machine-learning scikit-learn regression


【解决方案1】:

仅仅根据系数值来决定显然是不合逻辑的。这是因为除非您的数据是标准化的系数值,否则不表示任何内容。

例如:假设其中一个特征的范围为 (0,1),其系数为 0.5,而另一个特征的范围为 (0,10000),其系数为 0.5。显然,由于生成最终输出的范围更大,后期特征的权重要大得多。

因此,通常建议对特征进行标准化。即 $ x' = \frac{x-mean(x)}{std(x)} $。然后根据系数的值来决定。

注意:要进行预测,请记住转换特征。

这可能并不总是有效,因为规范化可能会扭曲特征。还有其他启发式方法。你可以在别处阅读它们。

另一种方法是消除,一个一个消除特征,看看它们有多重要。这可以通过检查回归情况下的 p 值或仅检查拟合误差(平方和)来完成。

一个建议:似乎您正在使用线性回归来解决分类问题,这再次主要是错误的,因为线性回归假设输出 y 是连续的,而这里 y 是 0 或 1。您可能希望使用逻辑回归。

【讨论】:

  • 非常感谢!因为我没有想到正常化,所以我在挣扎。你的建议非常有帮助,我可以从你身上学到很多东西。如果您不介意,我想再问 1 个问题。尽管标签是 0 和 1,我可以使用 Lasso 或 Ridge 回归进行特征选择吗?我虽然可能会像二进制值一样处理,但它似乎是错误的。
  • 这取决于你想要什么。套索不会惩罚大的权重值。因此,您可能会得到一些零和一些非常大的值。岭回归惩罚大权重,因此你会得到许多接近零的权重。因此,这有点取决于反复试验以及您拥有的数据。如果您期望的非零权重很少,请尝试套索。
  • 再次感谢您的解释。
猜你喜欢
  • 2017-09-29
  • 2018-05-23
  • 2013-08-15
  • 1970-01-01
  • 2022-07-27
  • 2014-11-05
  • 2014-02-05
  • 1970-01-01
相关资源
最近更新 更多