【问题标题】:Why number of Support vector does not change in SVM?为什么支持向量的数量在 SVM 中没有变化?
【发布时间】:2016-05-25 08:03:29
【问题描述】:

我是 scikitlearn lib 的新手。我正在使用 SVM 双类进行模式分类。 我的数据集包含 1000 个样本(按类别划分为 500 个),但特征数量非常高(3000 个)。

我将数据集分为 3 个部分:trainset 800 个样本,validset 100 个样本和测试集 100 个样本。

我正在使用此代码:

class1=numpy.genfromtxt("class1.csv",delimiter=',');
class2=numpy.genfromtxt("class2.csv",delimiter=',');

trainset=numpy.concatenate((class1[0:400,:],class2[0:400,:]));
validset=numpy.concatenate((class1[400:450,:],class2[400:450,:]))
testset=numpy.concatenate((class1[450:500,:],class2[450:500,:]))

targettrain=numpy.reshape(numpy.concatenate((numpy.ones((1,400)),numpy.ones((1,400))*2)),(800,));
targetvalid=numpy.reshape(numpy.concatenate((numpy.ones((1,50)),numpy.ones((1,50))*2)),(100,));
targettest=numpy.reshape(numpy.concatenate((numpy.ones((1,50)),numpy.ones((1,50))*2)),(100,));

clf=SVC();
clf.fit(trainset,targettrain);

SVC(C=1,cache_size=200, class_weight=None,coef0=0.0,decision_function_shape=None,degree=3,gamma=.1,kernel='rbf',
            max_iter=-1,probability=False,random_state=None,shrinking=True,tol=0.001,verbose=False);

print clf.score(validset,targetvalid)

print clf.n_support_

这是我的数据data class1 and class2 我注意到,即使我更改 gamma 或 C,向量支持的数量也不会改变。 支持向量始终为 [270 268]。 有什么意义?这是诅咒维度的问题吗?我读到 SVM 甚至可以处理高维数据?

【问题讨论】:

  • 我无法使用您提供的数据重现这一点 - 更改 Cgamma 会导致支持向量的数量按预期变化。您能否准确说明您是如何生成trainsettargettrain 的?
  • @ali_m,我编辑了我的代码。
  • 我仍然无法使用上面的确切代码重现您所看到的内容。例如,如果我使用clf = SVC(C=1)(默认)进行初始化,我会在调用clf.fit(trainset,targettrain) 后看到clf.n_support_ == array([270, 268], dtype=int32)。如果我用clf = SVC(C=0.1) 初始化,我会看到clf.n_support_ == array([371, 367], dtype=int32)。同样,改变gamma 也会改变支持向量的数量。你试过Cgamma的什么值?也许你对它们的改变不够(尝试改变它们至少一个数量级)。
  • @ali_m,我的代码设计不正确。我必须在SVC(C=1,cache_size=200, class_weight=None,coef0=0.0,decision_function_shape=None,degree=3,gamma=.1,kernel='rbf',max_iter=-1,probability=False,random_state=None,shrinking=True,tol=0.001,verbose=False); 之后打电话给clf.fit(trainset, targettrain)
  • 我怀疑问题在于您正在尝试设置已使用 SVC(C=1,cache_size=200, ...,‌​verbose=False); 实例化的分类器的参数,但这会创建一个 new 分类器实例不绑定到任何变量名。你应该做的是用你想要的参数初始化clf,例如clf = SVC(C=1,cache_size=200, ...,‌​verbose=False);。此外,尝试更改参数您已经将分类器安装到您的训练集之后没有任何意义。

标签: numpy machine-learning scikit-learn svm


【解决方案1】:

看起来好像在这一行:

SVC(C=1,cache_size=200, class_weight=None,coef0=0.0,decision_function_shape=None,
    degree=3,gamma=.1,kernel='rbf',max_iter=-1,probability=False,random_state=None,
    shrinking=True,tol=0.001,verbose=False);

您正在尝试为已实例化的clf 分类器设置参数。然而,这实际上是创建一个 new SVC 实例,它没有绑定到任何变量名。因此,该行对clf 的行为没有影响。

第二个问题是您尝试更改参数之后您已经在训练数据上调用了.fit,这实际上没有任何意义。

你应该做的是在你第一次实例化clf时传递你想要的参数集:

clf = SVC(C=1,cache_size=200, class_weight=None,coef0=0.0,
          decision_function_shape=None,degree=3,gamma=.1,kernel='rbf',max_iter=-1,
          probability=False,random_state=None,shrinking=True,tol=0.001,
          verbose=False);

clf.fit(trainset,targettrain)   # etc.

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 2011-11-09
    • 2018-10-26
    • 2015-02-08
    • 1970-01-01
    • 2016-06-21
    • 2023-03-15
    • 2019-06-27
    相关资源
    最近更新 更多