sklearn RFECV缺失值

时间:2016-12-15 18:25:16

标签: python numpy scikit-learn

我稍微修改了sklearn

中的教程

因此X缺少值。这不适用于原始的svc,因此我尝试创建一个clf作为管道 - 一个imputer,然后是一个svc。但是,我仍然得到一个缺失值错误。在使用管道中的分类器链接像RFECV这样的特征选择方法时,如何判断?

print(__doc__)

import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.model_selection import StratifiedKFold
from sklearn.feature_selection import RFECV
from sklearn.datasets import make_classification
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import Imputer

# Build a classification task using 3 informative features
X, y = make_classification(n_samples=20, n_features=25, n_informative=3,
                           n_redundant=2, n_repeated=0, n_classes=8,
                           n_clusters_per_class=1, random_state=0)

X[1][8]=np.NAN#plant missing value

# Create the RFE object and compute a cross-validated score.
svc = SVC(kernel="linear")
clf=make_pipeline(Imputer(),svc)
# The "accuracy" scoring is proportional to the number of correct
# classifications
rfecv = RFECV(estimator=clf, step=1, cv=StratifiedKFold(2),
              scoring='accuracy')
rfecv.fit(X, y)

print("Optimal number of features : %d" % rfecv.n_features_)

# Plot number of features VS. cross-validation scores
plt.figure()
plt.xlabel("Number of features selected")
plt.ylabel("Cross validation score (nb of correct classifications)")
plt.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_)
plt.show()

1 个答案:

答案 0 :(得分:0)

您在这里尝试做的事情有两个问题:

  1. RFECV在开始时检查X的拟合函数是否为 致电check_X_y(X, y, "csr")。这导致ValueError你 正在看,因为X甚至没有到达Imputer。

  2. 即使不是这种情况,您似乎也无法使用管道 在RFECV中,因为这个分类器不暴露“coef_”或 “feature_importances_”属性,这是使用的先决条件 RFECV。

  3. 我建议在整个X上使用Imputer,即使这可能会导致您的列车和测试数据之间的间接泄漏。然后,您可以直接在SVC分类器上运行RFECV。

    X = Imputer().fit_transform(X)
    rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(2),
                  scoring='accuracy')
    rfecv.fit(X, y)