问题 使用scikit-learn进行特征选择


我是机器学习的新手。我正在使用Scikit Learn SVM准备我的数据进行分类。为了选择最好的功能,我使用了以下方法:

SelectKBest(chi2, k=10).fit_transform(A1, A2)

由于我的数据集由负值组成,因此出现以下错误:

ValueError                                Traceback (most recent call last)

/media/5804B87404B856AA/TFM_UC3M/test2_v.py in <module>()
----> 1 
      2 
      3 
      4 
      5 

/usr/local/lib/python2.6/dist-packages/sklearn/base.pyc in fit_transform(self, X, y,     **fit_params)
    427         else:
    428             # fit method of arity 2 (supervised transformation)

--> 429             return self.fit(X, y, **fit_params).transform(X)
    430 
    431 

/usr/local/lib/python2.6/dist-packages/sklearn/feature_selection/univariate_selection.pyc in fit(self, X, y)
    300         self._check_params(X, y)
    301 
--> 302         self.scores_, self.pvalues_ = self.score_func(X, y)
    303         self.scores_ = np.asarray(self.scores_)
    304         self.pvalues_ = np.asarray(self.pvalues_)

/usr/local/lib/python2.6/dist-  packages/sklearn/feature_selection/univariate_selection.pyc in chi2(X, y)
    190     X = atleast2d_or_csr(X)
    191     if np.any((X.data if issparse(X) else X) < 0):
--> 192         raise ValueError("Input X must be non-negative.")
    193 
    194     Y = LabelBinarizer().fit_transform(y)

ValueError: Input X must be non-negative.

有人能告诉我如何转换我的数据?


5531
2017-09-11 15:53


起源

您可以将值标准化为介于0和1之间,也可以采用绝对值 - EdChum
如果您的数据不是非负数,那么chi2可能不是一个好方法。你可以使用f_score。您的数据的性质是什么? - Andreas Mueller
谢谢EdChum和Andreas。我的数据包括加速度计信号的最小值,最大值,平均值,中值和FFT - sara


答案:


错误消息 Input X must be non-negative 说的一切: 皮尔逊的卡方检验(拟合度) 不适用于负值。这是合乎逻辑的,因为卡方检验假定频率分布,频率不能是负数。所以, sklearn.feature_selection.chi2 断言输入是非负的。

你的意思是你的功能是“加速度计信号的最小值,最大值,平均值,中值和FFT”。在许多情况下,简单地移动每个特征以使其全部为正,甚至标准化为可能是非常安全的 [0, 1] EdChum建议的间隔。

如果由于某种原因数据转换不可能(例如,负值是一个重要因素),您应该选择另一个统计信息来评分您的功能:

由于这个过程的重点是为另一个方法准备功能,所以选择任何人并不是什么大事,最终结果通常是相同或非常接近。


9
2017-10-06 14:37