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

时间:2016-03-30 12:50:08

标签: python-2.7 machine-learning scikit-learn svm

我在某些数据上使用RBF SVM。我的数据(类)如下:

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:错误有所改变,请检查注释:

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

2 个答案:

答案 0 :(得分:1)

管理让它工作,不能说我知道错误的确切问题。但它似乎归结为train_sizes,尽管使用了StratifiedKFold,我认为它仍然以仅包含1类的测试集结束。它的修复方式只是改变列车大小的值范围,直到错误不再出现为止!

我认为这取决于样本大小和折叠数量,因为即使你低于错误代码给出的范围,(通过有目的地放入大于你的样本大小的训练大小),它仍然可以给出上面那个错误。我猜这样的事实是样本大小不能总是完美地分开吗?

答案 1 :(得分:0)

您正在执行set srcdir=C:\rootpath\src for /r "%srcdir%" %%f in (*.txt) do ( set subdir=%%f set subdir=%subdir:src=des% echo %subdir% ) learning_curve(交叉验证)设置为cv,这会回退到默认的3倍交叉验证(请参阅docs)。您的代码崩溃的原因很可能源于只有一个类的折叠。

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