二进制分类SVM给出一个类值错误,尽管有两个类



我在一些数据上使用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_curvecv(交叉验证)设置为None,这将回退到默认的3倍交叉验证(请参阅文档)。代码崩溃的原因很可能源于这样一个事实,即只有一个类存在折叠。

您可以将自己的交叉验证对象传递给learning_curve函数(例如StratifiedKFold;请参阅此处)以避免该错误。

相关内容

  • 没有找到相关文章

最新更新