我是scikit-learn库的新手。我正在使用SVM二分类器进行模式分类。我的数据集包含1000个样本(每类500个),但特征数量非常高(3000个)。
我将数据集分为三部分:训练集800个样本,验证集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_
这是我的数据 class1和class2的数据。我注意到即使我改变了gamma或C的值,支持向量的数量也没有变化。支持向量始终是[270 268]。这有什么意义吗?这是维度灾难的问题吗?我读到SVM即使在高维度数据上也能工作?
回答:
看起来在这一行:
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
分类器设置参数。然而,这实际上是创建了一个新的SVC
实例,而没有绑定到任何变量名。因此,这行代码对clf
的行为没有任何影响。
第二个问题是,你试图在已经对训练数据调用.fit
之后更改参数,这实际上没有任何意义。
你应该做的 instead是在首次实例化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) # 等等