【问题标题】:Binary classfication SVM giving one class value error despite two classes尽管有两个类别,但二进制分类 SVM 给出一个类别值错误
【发布时间】:2016-07-18 11:46:29
【问题描述】:

我在一些数据上使用 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]

然而,当我运行此代码来绘制学习曲线时,我得到一个值错误,声称只有一个类 更新:错误有所改变,请检查 cmets:

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()

编辑:对代码进行一些更改后,在一些 cmets 之后,我更新了此处看到的代码

更新:现在这是错误的当前状态:

ValueError: The number of classes has to be greater than one; got 1

【问题讨论】:

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


    【解决方案1】:

    您正在执行learning_curve 并将cv(交叉验证)设置为None,这将回退到默认的3 折交叉验证(请参阅docs)。您的代码崩溃的原因很可能源于只有一个类的折叠。

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

    【讨论】:

    • 我认为这是解决方案,因为它解决了我遇到的另一个问题。但是在切换到分层 k 折叠以及在函数定义中设置 cv = cv 后,我仍然遇到同样的错误
    • CV = cross_validation.StratifiedKFold(y, n_folds=10, shuffle = True)
    • 您是否尝试过迭代 StratifiedKFold 对象并检查每个折叠是否包含 2 个类(只是为了确保)?
    • 我在 enumerate(CV) 中使用:for i, (train, test): y_pred = clf.fit(val[train], y[train]).predict(val[test]) print y_pred,"predicted" print y[test], "actual" 每一折都有一些..
    • 有些 y_pred 只包含一个类,但是应该不会影响它吗?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-12-08
      • 2012-04-21
      • 2020-03-12
      • 2020-01-19
      • 2013-07-04
      • 2014-08-14
      • 2017-12-09
      • 2020-05-22
      • 2018-01-23
      相关资源
      最近更新 更多