我在一些数据上使用RBF SVM。我的y数据(类)如下:
print len(y),y
退货:
120 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1]
然而,当我运行这段代码绘制学习曲线时,我得到了一个值错误,声称只有一个类UPDATE:error有点变化,请检查注释:
from sklearn.learning_curve import learning_curve
CV = cross_validation.StratifiedKFold(y, n_folds=10, shuffle = True)
def plot_learning_curve(estimator, title, X, y, ylim=None, cv=CV,
n_jobs=1, train_sizes=np.linspace(.1, 1.0, 5)):
plt.figure()
train_sizes, train_scores, test_scores = learning_curve(
estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes)
plt.grid()
return plt
title = "Learning Curves (SVM, RBF kernel)"
plot_learning_curve(clf, title, val, y, cv=CV, n_jobs=1)
plt.show()
编辑:在对代码进行了一些更改后,在发表了一些评论后,我更新了这里看到的代码
更新:现在这是错误的当前状态:
ValueError: The number of classes has to be greater than one; got 1
设法让它工作起来,不能说我知道错误的确切问题。但它似乎归结为train_size,尽管使用了StratifiedKFold,我认为它最终仍然只包含一个类的测试集。修复它的方法只是简单地改变列车大小中的值范围,直到错误不再出现!
我认为这取决于样本大小和折叠次数,因为即使你低于错误代码给出的范围,(通过故意输入大于样本大小的训练大小)它仍然可以给出上面的错误。我想这是因为样本量不可能总是完美地分开?
您正在执行learning_curve
,cv
(交叉验证)设置为None
,这将回退到默认的3倍交叉验证(请参阅文档)。代码崩溃的原因很可能源于这样一个事实,即只有一个类存在折叠。
您可以将自己的交叉验证对象传递给learning_curve
函数(例如StratifiedKFold
;请参阅此处)以避免该错误。