sklearn.feature_selection.SelectKBest 特征评分模块中的负数问题

Posted

技术标签:

【中文标题】sklearn.feature_selection.SelectKBest 特征评分模块中的负数问题【英文标题】:Problem with negative numbers in sklearn.feature_selection.SelectKBest feautre scoring module 【发布时间】:2021-02-12 05:12:01 【问题描述】:

我正在尝试自动特征工程和选择,为此,我使用了 sklearn 中提供的波士顿房价数据集。

from sklearn.datasets import load_boston
import pandas as pd
data = load_boston()
x = data.data
y= data.target
y = pd.DataFrame(y)

然后我在数据集上实现了特征转换库。

import autofeat as af
clf = af.AutoFeatRegressor()
df = clf.fit_transform(x,y)
df = pd.DataFrame(df)

在此之后,我实现了另一个函数来查找每个特征相对于标签的得分。

from sklearn.feature_selection import SelectKBest, chi2
X_new = SelectKBest(chi2, k=20)
X_new_done = X_new.fit_transform(df,y)
dfscores = pd.DataFrame(X_new.scores_)
dfcolumns = pd.DataFrame(X_new_done.columns)
featureScores = pd.concat([dfcolumns,dfscores],axis=1)
featureScores.columns = ['Specs','Score']
print(featureScores.nlargest(10,'Score'))

这给出了如下错误。

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-16-b0fa1556bdef> in <module>()
      1 from sklearn.feature_selection import SelectKBest, chi2
      2 X_new = SelectKBest(chi2, k=20)
----> 3 X_new_done = X_new.fit_transform(df,y)
      4 dfscores = pd.DataFrame(X_new.scores_)
      5 dfcolumns = pd.DataFrame(X_new_done.columns)

ValueError: Input X must be non-negative.

我的数据集中有一些负数。那么我该如何克服这个问题呢?

注意:- df 现在有y 的转换,它只有x 的转换。

【问题讨论】:

【参考方案1】:

你有一个全为负值的特征:

df['exp(x005)*log(x000)']

返回

0     -3630.638503
1     -2212.931477
2     -4751.790753
3     -3754.508972
4     -3395.387438
          ...
501   -2022.382877
502   -1407.856591
503   -2998.638158
504   -1973.273347
505   -1267.482741
Name: exp(x005)*log(x000), Length: 506, dtype: float64

引用另一个答案(https://***.com/a/46608239/5025009):

错误消息Input X must be non-negative 说明了一切:Pearson's chi square test (goodness of fit) 不适用于负值。这是合乎逻辑的,因为卡方检验假设频率分布并且频率不能是负数。因此,sklearn.feature_selection.chi2 断言输入为非负数。

在许多情况下,简单地移动每个特征以使其全部为正,甚至按照 EdChum 的建议标准化为 [0, 1] 区间可能是非常安全的。

如果由于某种原因无法进行数据转换(例如,负值是一个重要因素),您应该选择另一个统计数据来对您的特征进行评分:

sklearn.feature_selection.f_regression 计算方差分析 f 值 sklearn.feature_selection.mutual_info_classif 计算互信息

由于此过程的重点是为另一种方法准备特征,因此选择任何人都不是什么大问题,最终结果通常相同或非常接近。

【讨论】:

非常感谢您的帮助和指导。 不客气。如果有帮助,请考虑接受我的回答 我接受你的回答,只要时间限制结束

以上是关于sklearn.feature_selection.SelectKBest 特征评分模块中的负数问题的主要内容,如果未能解决你的问题,请参考以下文章

sklearn.feature_selection.SelectKBest 特征评分模块中的负数问题

F_Regression 来自 sklearn.feature_selection

如何解释 sklearn.feature_selection 中多类的 _coeffs 输出的特征的重要性?

模型优化

Python scikit-learn机器学习工具包学习笔记:feature_selection模块

知识碎片