我想结合使用sklearn的CalibratedClassifierCV和SVC来对一个多类别(9个类别)的预测问题进行预测。然而,当我运行代码时,出现了以下错误。使用其他模型(例如RandomForestClassifier)时,这段代码可以正常运行。
kf = StratifiedShuffleSplit(y, n_iter=1, test_size=0.2)clf = svm.SVC(C=1,probability=True) sig_clf = CalibratedClassifierCV(clf, method="isotonic", cv=kf)sig_clf.fit(X, y)Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/g/anaconda/lib/python2.7/site-packages/sklearn/calibration.py", line 166, in fit calibrated_classifier.fit(X[test], y[test]) File "/home/g/anaconda/lib/python2.7/site-packages/sklearn/calibration.py", line 309, in fit calibrator.fit(this_df, Y[:, k], sample_weight)IndexError: index 9 is out of bounds for axis 1 with size 9
回答:
这个问题是由于SVC使用了One-vs-One策略,导致决策函数的形状为(n_samples, n_classes * (n_classes - 1) / 2)
。一个可能的解决方法是使用CalibratedClassifierCV(OneVsRestClassifier(SVC()))
。如果你想使用S形校准,也可以使用SVC(probability=True)
,而不使用CalibratedClassifierCV
。
我认为我们应该修复SVC的决策函数。