sklearn.feature_selection.SelectKBest 特征评分模块中的负数问题
Problem with negative numbers in sklearn.feature_selection.SelectKBest feautre scoring module
我正在尝试自动特征工程和选择,为此,我使用了 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
.
的转换
你有一个全负值的特征:
df['exp(x005)*log(x000)']
returns
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
引用另一个答案():
错误消息 Input X must be non-negative
说明了一切:Pearson's chi square test (goodness of fit) does not apply to negative values. It's logical because the chi square test assumes frequencies distribution and a frequency can't be a negative number. Consequently, sklearn.feature_selection.chi2
断言输入是 non-negative。
在许多情况下,简单地移动每个特征以使其全部为正,甚至按照 EdChum 的建议标准化为 [0, 1]
间隔可能是非常安全的。
如果由于某种原因无法进行数据转换(例如,负值是一个重要因素),您应该选择另一个统计数据来对您的特征进行评分:
sklearn.feature_selection.f_regression
计算方差分析 f-value
sklearn.feature_selection.mutual_info_classif
计算互信息
由于整个过程的重点是为另一种方法准备特征,所以选择任何人都没什么大不了的,最终结果通常相同或非常接近。
我正在尝试自动特征工程和选择,为此,我使用了 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
.
你有一个全负值的特征:
df['exp(x005)*log(x000)']
returns
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
引用另一个答案():
错误消息 Input X must be non-negative
说明了一切:Pearson's chi square test (goodness of fit) does not apply to negative values. It's logical because the chi square test assumes frequencies distribution and a frequency can't be a negative number. Consequently, sklearn.feature_selection.chi2
断言输入是 non-negative。
在许多情况下,简单地移动每个特征以使其全部为正,甚至按照 EdChum 的建议标准化为 [0, 1]
间隔可能是非常安全的。
如果由于某种原因无法进行数据转换(例如,负值是一个重要因素),您应该选择另一个统计数据来对您的特征进行评分:
sklearn.feature_selection.f_regression
计算方差分析 f-valuesklearn.feature_selection.mutual_info_classif
计算互信息
由于整个过程的重点是为另一种方法准备特征,所以选择任何人都没什么大不了的,最终结果通常相同或非常接近。