【问题标题】:How to get SVMs to play nicely with missing data in scikit-learn?如何让 SVM 很好地处理 scikit-learn 中的缺失数据?
【发布时间】:2012-07-11 14:35:38
【问题描述】:

我正在使用 scikit-learn 进行一些数据分析,我的数据集有一些缺失值(由 NA 表示)。我用genfromtxt 和dtype='f8' 加载数据,然后开始训练我的分类器。

在RandomForestClassifier 和GradientBoostingClassifier 对象上分类正常,但使用sklearn.svm 中的SVC 会导致以下错误:

    probas = classifiers[i].fit(train[traincv], target[traincv]).predict_proba(train[testcv])
  File "C:\Python27\lib\site-packages\sklearn\svm\base.py", line 409, in predict_proba
    X = self._validate_for_predict(X)
  File "C:\Python27\lib\site-packages\sklearn\svm\base.py", line 534, in _validate_for_predict
    X = atleast2d_or_csr(X, dtype=np.float64, order="C")
  File "C:\Python27\lib\site-packages\sklearn\utils\validation.py", line 84, in atleast2d_or_csr
    assert_all_finite(X)
  File "C:\Python27\lib\site-packages\sklearn\utils\validation.py", line 20, in assert_all_finite
    raise ValueError("array contains NaN or infinity")
ValueError: array contains NaN or infinity

什么给了?我怎样才能让 SVM 很好地处理丢失的数据?请记住,丢失的数据适用于随机森林和其他分类器。

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    您可以在使用 SVM 之前进行数据插补以处理缺失值。

    编辑:在 scikit-learn 中,有一种非常简单的方法可以做到这一点,如 this page 所示。

    (从页面复制并修改)

    >>> import numpy as np
    >>> from sklearn.preprocessing import Imputer
    >>> # missing_values is the value of your placeholder, strategy is if you'd like mean, median or mode, and axis=0 means it calculates the imputation based on the other feature values for that sample
    >>> imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
    >>> imp.fit(train)
    Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)
    >>> train_imp = imp.transform(train)
    

    【讨论】:

    • 无限值呢?这表明只有 NaN 的策略(即除以零)
    • 我这样做了,但转换将数据更改为非整数数组。如果我不估算 svm 分类工作正常,但是当我估算数据时,我得到错误 IndexError: only integers, slices (:), ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices。有什么建议吗?
    • 这个答案似乎已经过时了。我总是以:“ImportError: cannot import name 'Imputer' from 'sklearn.preprocessing'”结束。
    【解决方案2】:

    您可以删除具有缺失特征的样本,也可以将缺失特征替换为其按列的中位数或均值。

    【讨论】:

      【解决方案3】:

      这里最受欢迎的答案已经过时了。 “Imputer”现在是“SimpleImputer”。目前解决这个问题的方法是here。估算训练和测试数据对我的作用如下:

      from sklearn import svm
      import numpy as np
      from sklearn.impute import SimpleImputer
      
      imp = SimpleImputer(missing_values=np.nan, strategy='mean')
      imp = imp.fit(x_train)
      
      X_train_imp = imp.transform(x_train)
      X_test_imp = imp.transform(x_test)
          
      clf = svm.SVC()
      clf = clf.fit(X_train_imp, y_train)
      predictions = clf.predict(X_test_imp)
      

      【讨论】:

        猜你喜欢
        • 2016-01-11
        • 2020-10-06
        • 2012-10-30
        • 2015-06-26
        • 2021-01-15
        • 1970-01-01
        • 2017-03-10
        • 1970-01-01
        • 2017-04-03
        相关资源
        最近更新 更多