我正在使用GridSearchCV调整SVM分类器,然后绘制学习曲线。但是,除非我在绘制学习曲线之前设置了新的分类器,否则我将遇到IndexError,并且不确定为什么。

我的简历/分类器设置如下:

# Set up classifier
clf_untuned = OneVsRestClassifier(SVC(kernel='rbf', random_state=0, max_iter=1000))
cv = cross_validation.ShuffleSplit(data_image.shape[1], n_iter=10,
                                       test_size=0.1, random_state=0)

# Use cross validation / grid search to find optimal hyperparameters
if TRAINING_CROSS_VALIDATION == 1:
    params = {
        ...
    }
    clf_tuned = GridSearchCV(clf_untuned, cv=cv, param_grid=params)
    clf_tuned.fit(x_train, y_train)
    print('Best parameters: %s' % clf_tuned.best_params_)
else:
    clf_tuned = OneVsRestClassifier(SVC(kernel='rbf',
                                        C=100, gamma=0.00001, random_state=0, verbose=0))
    clf_tuned.fit(x_train, y_train)


然后,我继续绘制学习曲线,其中plot_learning_curve复制了sklearn示例(http://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html)。如果使用以下代码,则在plot_learning_curve的“ learning_curve”行会出现以下错误:

# Plot learning curve for best params -- yields IndexError
plot_learning_curve(clf_tuned, title, x_train, y_train, ylim=(0.6, 1.05), cv=cv)



  IndexError:索引663超出大小70的范围


但是,如果我改为启动新的分类器,则一切正常:

# Plot learning curve for best params -- functions correctly
estimator = OneVsRestClassifier(SVC(kernel='rbf',
                                        C=100, gamma=0.00001, random_state=0, verbose=0))
plot_learning_curve(estimator, title, x_train, y_train, ylim=(0.6, 1.05), cv=cv)


为什么是这样?在此先感谢您,也欢迎对我的执行情况提出其他意见。

最佳答案

通过将通过网格搜索获得的最佳估计器作为clf_tuned.best_estimator_传递,解决了该问题。

关于python - Python sklearn:为什么我必须设置一个新的估算器来绘制学习曲线?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37149979/

10-12 15:42