【发布时间】: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 甚至可以处理高维数据?
【问题讨论】:
-
我无法使用您提供的数据重现这一点 - 更改
C或gamma会导致支持向量的数量按预期变化。您能否准确说明您是如何生成trainset和targettrain的? -
@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也会改变支持向量的数量。你试过C和gamma的什么值?也许你对它们的改变不够(尝试改变它们至少一个数量级)。 -
@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