【问题标题】:Feature selection using scikit-learn使用 scikit-learn 进行特征选择
【发布时间】:2014-11-05 16:07:49
【问题描述】:

我是机器学习的新手。我正在准备使用 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.

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

【问题讨论】:

  • 您可以将值标准化为 0 到 1 之间,或者可能采用绝对值
  • 如果你的数据不是非负数,也许 chi2 不是一个好方法。您可以使用 f_score。您的数据的性质是什么?
  • 谢谢 EdChum 和 Andreas。我的数据由加速度计信号的最小值、最大值、平均值、中值和 FFT 组成

标签: python machine-learning scikit-learn feature-selection chi-squared


【解决方案1】:

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

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

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

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

【讨论】:

  • 只需使用 sklearn.preprocessing.MinMaxScaler().fit_transform(YOUR_TRAINING_FEATURES_HERE) 和默认值即可将您的训练特征从 0 扩展到 1
  • “选择任何人都没什么大不了的”,只是想检查一下我在这里是否正确地阅读了您-您的意思是选择f_classif,@中的任何一个都不是什么大不了的事987654332@ 或 SelectKBest
  • @DonieM 我现在正在使用它,但我有同样的错误: ...scaler = MinMaxScaler() df1[self.num_features] = scaler.fit_transform(df1[self.num_features])返回 df1
猜你喜欢
  • 2021-03-26
  • 2018-02-24
  • 2018-09-25
  • 2015-11-13
  • 2018-06-01
  • 2019-10-22
  • 2021-02-11
  • 2015-09-08
相关资源
最近更新 更多