scikitlearn支持向量机

福州白癜风医院 http://pf.39.net/bdfyy/bjzkbdfyy/140721/4429412.html
支持向量机(SVMs)是一套监督学习的方法,可用于分类,回归和离群值检测。支持向量机的优点:在高维空间中非常有效。在维度数大于样本数的情况下仍然有效。在决策函数(称为支持向量)中使用训练集的子集,因此它能提高内存利用率。多用途:可以为决策函数指定不同的内核函数。提供了通用内核,但也可以指定自定义内核。支持向量机的缺点:如果特征数远大于样本数,则在选择核函数时要避免过拟合,正则化项至关重要。支持向量机不直接提供概率估计,而是使用高代价的五重交叉验证来计算(请参阅下面的评估和概率)。scikit-learn中的支持向量机支持密集(numpy.ndarray,可以通过numpy.asarray进行转换)和稀疏(任何scipy.sparse)样本向量作为输入。但是,要使用SVM对稀疏数据进行预测,它需要先拟合此类数据。为了获得最佳性能,请使用行优先存储(C-order)的numpy.ndarray(密集)或带有数据类型为float64的scipy.sparse.csr_matrix(稀疏)。1.分类SVC,NuSVCandLinearSVC是能够对数据集进行多元分类。SVCandNuSVC是相似的方法,但接受的参数集略有不同,并且有不同的数学公式(请参见数学公式)。另一方面,LinearSVC是线性核函数的支持向量分类的另一个实现。注意,LinearSVC不接受关键字kernel,因为这是被假定为线性化了的,同时它还缺少一些SVC和NuSVC的成员,如support_。与其他分类器一样,SVC,NuSVCandLinearSVC采用两个数组作为输入:一个是大小为[n_samples,n_features]的数组X作为训练样本,一个是大小为[n_samples]的数组y作为类标签(字符串或整数):

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

  • 上一篇文章:
  • 下一篇文章: 没有了
  • 网站简介| 发布优势| 服务条款| 隐私保护| 广告合作| 网站地图| 版权申明

    当前时间: