如何在scikit-learn中处理缺失数据,使支持向量机(SVM)能够正常工作?

27

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

RandomForestClassifierGradientBoostingClassifier对象上的分类正常,但是在使用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适应缺失数据?请记住,缺失数据对于随机森林和其他分类器来说都可以正常工作。

3个回答

26

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

编辑:在scikit-learn中,有一种非常简单的方法来做到这一点,可以在此页面上了解。

(从页面复制并修改)

>>> 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)

1
无穷大的值怎么办?这意味着只有NaN(即除以零)的策略。 - lefterav
我已经做了这个,但是转换后的数据变成了非整数数组。如果我不填补数据,svm分类器可以正常工作,但是当我填补数据时,就会得到错误信息“IndexError: only integers, slices (:), ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices”。有什么建议吗? - Dhanush Gopinath
这个答案似乎已经过时了。我总是遇到以下错误:"ImportError: cannot import name 'Imputer' from 'sklearn.preprocessing'"。 - Hagbard

6

您可以选择删除具有缺失特征的样本,或者使用它们列向中位数或均值替换缺失特征。


2

这里最受欢迎的答案已经过时了。现在的"Imputer"已经变成了"SimpleImputer"。目前解决这个问题的方法可以参考这里。以下是我实践中可行的方法:对训练和测试数据进行填充。

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接