You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SVM训练报错求助:类别数需大于1,仅检测到1类

问题原因与解决方案

错误根源

你遇到的ValueError是因为训练数据里只有单一类别(所有样本的Y都是0)。问题出在:

  • 你创建了两类数据df1(Y=0)和df2(Y=1),但df1.merge(df2)是做内连接,两个圆的点没有重叠,结果是空DataFrame,完全没用到df2的数据。
  • 后续所有特征工程和模型训练只基于df1,导致标签y全为0,SVM无法进行分类训练。

解决步骤

  1. 正确合并两类数据:使用pd.concat纵向拼接df1和df2,而不是merge。
  2. 在合并后的数据集上做特征工程:之前只给df1加了多项式特征,现在要给整个合并后的数据集处理。
  3. 重新划分数据集并训练模型:此时标签包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:45:40