我稍微修改了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()
答案 0 :(得分:0)
您在这里尝试做的事情有两个问题:
RFECV在开始时检查X的拟合函数是否为
致电check_X_y(X, y, "csr")
。这导致ValueError
你
正在看,因为X甚至没有到达Imputer。
即使不是这种情况,您似乎也无法使用管道 在RFECV中,因为这个分类器不暴露“coef_”或 “feature_importances_”属性,这是使用的先决条件 RFECV。
我建议在整个X上使用Imputer,即使这可能会导致您的列车和测试数据之间的间接泄漏。然后,您可以直接在SVC分类器上运行RFECV。
X = Imputer().fit_transform(X)
rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(2),
scoring='accuracy')
rfecv.fit(X, y)