Python 2.7 二元分类支持向量机给出一类值错误,尽管有两类

Python 2.7 二元分类支持向量机给出一类值错误,尽管有两类,python-2.7,machine-learning,scikit-learn,svm,Python 2.7,Machine Learning,Scikit Learn,Svm,我在一些数据上使用了RBF支持向量机。我的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

我在一些数据上使用了RBF支持向量机。我的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]
然而,当我运行此代码绘制学习曲线时,我得到一个值错误,声称只有一个类更新:错误有所改变,请检查注释:

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:类的数量必须大于一个;获得1

您正在执行的
学习曲线
,其中
cv
(交叉验证)设置为
None
,返回默认的3倍交叉有效期(请参阅)。代码崩溃的原因很可能源于这样一个事实,即只有一个类


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

成功地让它工作了,不能说我知道错误的确切原因。但它似乎可以归结为train_的大小,尽管使用了StratifiedKFold,但我认为最终的测试集仍然只包含一个类。修正的方法就是简单地改变列车大小中的数值范围,直到错误不再出现


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

我认为这就是解决方案,因为它解决了我遇到的另一个问题。但是在切换到分层k fold,以及在函数定义cv=cross_validation中设置cv=cv之后,我仍然会遇到同样的错误。顺便问一下,StratifiedKFold(y,n_fold=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只包含一个类,这应该不会影响它,对吗?