SVM训练报错类别数需大于1,但训练标签含两类问题排查
问题原因及解决方案
出现这个矛盾的核心原因是你将训练标签转换成了二维数组((n_samples, 1)),而ART的SklearnClassifier在传递标签给底层SVM模型时,对二维标签的处理不符合预期。
尽管np.unique(train_labels)显示存在[0,1]两类,但二维格式的标签会干扰模型的类别检测逻辑:
- Sklearn原生
SVC虽理论上支持二维标签作为单输出分类,但ART封装后的SklearnClassifier在处理时,可能误将二维结构识别为多输出任务,或是在内部转换过程中丢失了类别多样性的判断依据。
修复步骤
- 直接移除标签维度转换代码:删掉
train_labels = train_labels.reshape(-1,1)这一行。 - 若后续有保留维度转换的需求,可将二维数组转回一维:
train_labels = train_labels.ravel() # 替代reshape(-1,1)操作
修改后的训练段代码示例:
# split data train_features, test_features, train_labels, test_labels = train_test_split(features, enclabels, test_size=0.2) train_labels = train_labels.ravel() # train model model = SVC(C=1.0, kernel="rbf") classifier = SklearnClassifier(model=model) classifier.fit(train_features, train_labels)
调整后标签回到(n_samples,)的一维格式,ART分类器就能正确识别两类标签,解决训练时的报错问题。
内容的提问来源于stack exchange,提问作者josh2291
相关产品推荐
相关产品推荐

