如何在 SVM 中为多类分类构建数据和模型?

数据挖掘 分类 scikit-学习 支持向量机 多类分类
2022-02-19 08:17:04

我试图在给定一组输入变量的情况下预测一个分类变量,这些输入变量也是分类的。目标和特征变量都只取类值[低于均值、均值、高于均值]。

我在目标和特征向量上都使用了 one-hot 编码,但我不确定这是否正确。

如果我有 2 个特征向量,我会在一次热编码后得到 2x3 列。例如,第一个实例可能是:

X[0] = [0,1,0,    1,0,0]

表示第一个特征具有平均值([0,1,0]),第二个特征低于平均值([1,0,0]),具有相应的目标

y[0] = [1,0,0]

表示目标低于平均值。

使用编码的 X 和 y,我尝试这样做:

svm_clf = SVC()
svm_clf.fit(X_train, y_train)
y_pred = svm_clf.predict(X_test)

但它给了我 'ValueError("bad input shape {0}".format(shape))'

我在下面给出了真实情况的输入和输出,其中输入有 9 个特征(编码后是 9x3 列)。错误消息表明“y”向量存在问题。

我应该对目标进行一次性编码吗?

我如何告诉分类器输出只能采用“单个值”,即目标中的 3 列不是独立的,因为它们都属于一个变量。例如,给定实例的输出不能是 [1,1,0],因为这表明它既是“低于平均值”又是“平均值”,这是不可能的。

我还尝试了一个运行正常的随机森林分类器,但结果并不合理,所以我认为我做错了什么,

输入功能:

X_train 类型:和形状:(872, 27) 和 head(5):

[[ 0.  1.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.]
 [ 0.  1.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.]
 [ 0.  1.  0.  0.  1.  0.  0.  1.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.]
 [ 1.  0.  0.  0.  0.  1.  1.  0.  0.  0.  0.  1.  1.  0.  0.  0.  0.  1.  0.  0.  1.  0.  0.  1.  1.  0.  0.]
 [ 1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  1.  0.  0.  0.  0.  1.  0.  1.  0.  1.  0.  0.]]

目标:

y_train 类型:和形状:(872, 3) 和 head(5):

[[ 0.  0.  1.]
 [ 0.  0.  1.]
 [ 1.  0.  0.]
 [ 0.  0.  1.]
 [ 0.  1.  0.]]

错误信息:

  File "analyse.py", line 287, in dummy_test
    svm_clf.fit(X_train, y_train)
  File "/usr/lib64/python3.6/site-packages/sklearn/svm/base.py", line 149, in fit
    X, y = check_X_y(X, y, dtype=np.float64, order='C', accept_sparse='csr')
  File "/usr/lib64/python3.6/site-packages/sklearn/utils/validation.py", line 578, in check_X_y
    y = column_or_1d(y, warn=True)
  File "/usr/lib64/python3.6/site-packages/sklearn/utils/validation.py", line 614, in column_or_1d
    raise ValueError("bad input shape {0}".format(shape))
  ValueError: bad input shape (872, 3)
1个回答

请参阅此处的 svm 文档它确实支持多类问题。唯一的问题是你的y应该是这样的[0, 1, 2, 3]如果您不使用 one-hot 编码并按原样使用 y 标签,它可能会起作用。