【问题标题】:GridSearchCV fittingGridSearchCV 拟合
【发布时间】:2019-04-27 11:00:56
【问题描述】:

我在使用二值化标签拟合分类器时遇到问题。

clf_linear = GridSearchCV(SVC(kernel='linear', class_weight='balanced'),
                      param_grid, cv=5)

clf_linear = clf_linear.fit(X_train_pca, y_train)

y_train 通过以下方法二值化:

y_train = label_binarize(y_train, classes=[1, 2, 3])

我收到以下错误:

文件“C:\Python\lib\site-packages\sklearn\utils\validation.py”,第 788 行,在 column_or_1d 中 raise ValueError("bad input shape {0}".format(shape)) ValueError: bad input shape (545, 3)

输入的标签形状是 (682, 3) 而不是 (545, 3)。

我的教授告诉我在 gridSearchCV 中使用二值化标签,但阅读 scikit-learn 文档我认为我不能这样做。

【问题讨论】:

    标签: python scikit-learn gridsearchcv


    【解决方案1】:

    不管是 682,3 还是 545,3。为什么目标有 3 列?您的 y (目标)应该是 SVC 的一维数组。您不需要执行label_binarize 操作。保持 y_train 不变。

    这样做:

    y_train = label_binarize(y_train, classes=[1, 2, 3])
    

    将 y_train 转换为 label-indicator 矩阵。这用于多标签分类问题(样本一次可以有多个类)。它不用于多类问题。

    保持y_train 保持原样,将其保持为一维数组,SVC 将处理其余部分。

    【讨论】:

    • 谢谢@Vivek,我正在尝试这样做,因为我的 roc 曲线似乎很奇怪,并且与我的教授交谈时他建议我这样做。 roc 曲线并没有他想要的那么平滑。
    • @ArthurBernardo ROC 曲线是为二进制任务定义的。因此,您需要将您的多类问题转换为二进制类,因此在此处执行 label_binarize 是正确的。在内部,SVC 也是如此。但为此,您需要使用OneVsRestClassifier 来处理它。简单地使用 one-hot 编码标签打开多标签分类,SVC 不支持。你看过这个:scikit-learn.org/stable/auto_examples/model_selection/… 吗?
    • 是的,我看到了这个话题。我正在绘制这样的 ROC 曲线。结果就是这个图形link。你看到这些曲线有什么问题吗?我在这个数据集link 中用更多样本对三个人脸进行分类。我怀疑这条曲线是否应该更平滑。再次感谢您的帮助@VivekKumar。
    猜你喜欢
    • 2019-04-26
    • 2020-06-25
    • 2020-04-18
    • 2020-11-18
    • 2021-03-09
    • 2022-01-01
    • 2020-08-25
    • 2019-02-14
    • 2016-02-10
    相关资源
    最近更新 更多