scikitlearn支持向量机
fromsklearnimportsvmX=[[0,0],[1,1]]y=[0,1]clf=svm.SVC()clf.fit(X,y)SVC()模型进行拟合后,就可用于预测新数据:
clf.predict([[2.,2.]])array([1])支持向量机决策函数取决于训练数据的子集,称为支持向量。这些支持向量的某些属性可以在成员support_vectors_,support_andn_support中找到:
#获得支持向量clf.support_vectors_array([[0.,0.],[1.,1.]])#获得支持向量的索引clf.support_array([0,1]...)#为每个类别获得支持向量的数量clf.n_support_array([1,1]...)1.1.多元分类SVC和NuSVC实现了多元分类的“one-against-one”(Knerretal.,)方法.如果n_class是类别数量,那么需要构造n_class*(n_class-1)/2个分类器,每个分类器的训练数据来自两个类别。为了保持与其他分类器的接口一致,decision_function_shape选项允许将“one-against-one”分类结果转成形状为(n_samplesn_classes))的决策函数。
X=[[0],[1],[2],[3]]Y=[0,1,2,3]clf=svm.SVC(decision_function_shape=ovo)clf.fit(X,Y)SVC(decision_function_shape=ovo)dec=clf.decision_function([[1]])dec.shape[1]#4classes:4*3/2=66clf.decision_function_shape="ovr"dec=clf.decision_function([[1]])dec.shape[1]#4classes4另一方面,LinearSVC实现了“one-vs-the-rest”的多类别策略,因此能够训练n_class模型。如果只有两个类,则需只训练一个模型:
lin_clf=svm.LinearSVC()lin_clf.fit(X,Y)LinearSVC()dec=lin_clf.decision_function([[1]])dec.shape[1]4有关决策函数的完整说明,请参见数学公式。注意,LinearSVC还通过选项multi_class=crammer_singer来实现了另一种多类别策略,即由Crammer和Singer构造的多元SVM。实际上,通常首选"one-vs-rest"分类,因为其结果基本相似,但运行时间明显较少。对于"onevsrest"LinearSVC,属性coef_和intercept_形状分别为[n_class,n_features]和[n_class]。系数的每一行对应于n_class分类器“onevsrest”中的一个,并且这一类的顺序类似于拦截器(intercepts)。对于"one-vs-one"SVC,属性的尺寸要复杂得多。在具有线性核函数的情况下,属性coef_和intercept_形状分别为[n_class*(n_class-1)/2,n_features]和[n_class*(n_class-1)/2]。这类似于上述LinearSVC的属性尺寸,每一行都对应一个二分类器。0到n的类别顺序是“0vs1”,“0vs2”,…“0vsn”,“1vs2”,“1vs3”,“1vsn”,...“n-1vsn”。dual_coef_的形状是[n_class-1,n_SV],这个尺寸有点难以理解。这些列对应于任何n_class*(n_class-1)/2个“one-vs-one”分类器中涉及的支持向量。每个支持向量都在n_class-1个分类器中使用。每行中的n_class-1个条目对应于这些分类器的对偶系数。举个例子可以更清楚地说明这一点:1.2.分数和概率SVC和NuSVC的decision_function方法给出每个样本的每个类别的预测分数(或者在二分类情况下,一个样本一个分数)。当构造函数的probability选项设置为True时,将启用类成员概率估计(来自predict_proba和predict_log_proba方法)。在二分类中,概率使用Plattscaling进行标准化:在支持向量机的分数上进行逻辑回归,在训练数据上用交叉验证进行拟合。在多类情况下,可以扩展为Wuetal.().对于大型数据集而言,Plattscaling所涉及的交叉验证是一项高代价操作。另外,分数的"argmax"可能不是概率的"argmax",所以概率估计可能与分数不一致(例如,在二分类中,使用predict_proba方法,样本可能会被predict值标记为概率小于1/2的类别。)。Platt的方法也存在理论问题,如果需要置信度得分(confidencescores),但不一定非要是概率,那么建议设置probability=False,并使用decision_function代替predict_proba。请注意,当decision_function_shape=ovr且n_classes2时,与decision_function是不同的,predict方法在默认情况下不会断开连接,您可以设置break_ties=True,使得predict的输出与np.argmax(clf.decision_function(...),axis=1)相同,否则将始终返回类中的第一个类,但是这种方法会带来计算开销。参考文献:Wu,LinandWeng,“Probabilityestimatesformulti-classclassificationbypairwisecoupling”,JMLR5:-,.Platt“ProbabilisticoutputsforSVMsand
转载请注明:http://www.shijichaoguyj.com/wxnr/7243.html