SVM训练报错求助:类别数需大于1,仅检测到1类
问题原因与解决方案
错误根源
你遇到的ValueError是因为训练数据里只有单一类别(所有样本的Y都是0)。问题出在:
- 你创建了两类数据
df1(Y=0)和df2(Y=1),但df1.merge(df2)是做内连接,两个圆的点没有重叠,结果是空DataFrame,完全没用到df2的数据。 - 后续所有特征工程和模型训练只基于
df1,导致标签y全为0,SVM无法进行分类训练。
解决步骤
- 正确合并两类数据:使用
pd.concat纵向拼接df1和df2,而不是merge。 - 在合并后的数据集上做特征工程:之前只给
df1加了多项式特征,现在要给整个合并后的数据集处理。 - 重新划分数据集并训练模型:此时标签包含0和1两类,满足SVM的分类要求。
修正后的完整代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt # 生成两类环形数据 x = np.linspace(-5.0, 5.0, 100) y = np.sqrt(10**2 - x**2) y = np.hstack([y, -y]) x = np.hstack([x, -x]) x1 = np.linspace(-5.0, 5.0, 100) y1 = np.sqrt(5**2 - x1**2) y1 = np.hstack([y1, -y1]) x1 = np.hstack([x1, -x1]) plt.scatter(y, x) plt.scatter(y1, x1) # plt.show() # 创建两类数据的DataFrame df1 = pd.DataFrame(np.vstack([y, x]).T, columns=['X1', 'X2']) df1['Y'] = 0 df2 = pd.DataFrame(np.vstack([y1, x1]).T, columns=['X1', 'X2']) df2['Y'] = 1 # 关键修正:纵向拼接两类数据,而不是merge df = pd.concat([df1, df2], ignore_index=True) # 为合并后的数据集添加多项式核特征 df['X1_Square'] = df['X1']**2 df['X2_Square'] = df['X2']**2 df['X1*X2'] = df['X1'] * df['X2'] # 划分特征与标签 X = df[['X1', 'X2', 'X1_Square', 'X2_Square', 'X1*X2']] y = df['Y'] # 划分训练集和测试集 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0) # 训练SVM模型并评估 from sklearn.svm import SVC from sklearn.metrics import accuracy_score classifier = SVC(kernel="linear") classifier.fit(X_train, y_train) y_pred = classifier.predict(X_test) print("准确率:", accuracy_score(y_test, y_pred))
补充说明
pd.concat是pandas中用于纵向/横向拼接数据集的标准方法,ignore_index=True会重置合并后的索引,避免索引重复。- 你之前尝试的
append在新版本pandas中已被弃用,推荐用pd.concat替代。
内容的提问来源于stack exchange,提问作者Saqib
相关产品推荐
相关产品推荐

