在python sklearn使用 SVM做分类

sklearn 之 SVM

SVC(C-Support Vector Classification)实现基于libsvm,台湾大学林智仁教授团队开发的一个库。支持多分类。

1. SVM二分类

>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
>>> y = np.array([1, 1, 2, 2])
>>> from sklearn.svm import SVC
>>> clf = SVC()
>>> clf.fit(X, y) 
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)
>>> print(clf.predict([[-0.8, -1]]))
[1]


2. SVM多分类

SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。目前,构造SVM多类分类器的方法主要有两类:一类是直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类。这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中;另一类是间接法,主要是通过组合多个二分类器来实现多分类器的构造,常见的方法有one-against-one和one-against-all两种。


a.一对多法(one-versus-rest,简称1-v-r SVMs)。训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。

b.一对一法(one-versus-one,简称1-v-1 SVMs)。其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。Libsvm中的多类分类就是根据这个方法实现的。

c.层次支持向量机(H-SVMs)。层次分类法首先将所有类别分成两个子类,再将子类进一步划分成两个次级子类,如此循环,直到得到一个单独的类别为止。

d.其他多类分类方法。除了以上几种方法外,还有有向无环图SVM(Directed Acyclic Graph SVMs,简称DAG-SVMs)和对类别进行二进制编码的纠错编码SVMs。

对c和d两种方法的详细说明可以参考论文《支持向量机在多类分类问题中的推广》(计算机工程与应用。2004)

>>> X = [[0], [1], [2], [3]]
>>> Y = [0, 1, 2, 3]
>>> clf = svm.SVC(decision_function_shape='ovo')
>>> clf.fit(X, Y) 
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovo', degree=3, gamma='auto', kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes: 4*3/2 = 6
6
>>> clf.decision_function_shape = "ovr"
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes
4


3. sklearn SVM中decision_function、predict与predict_proba的关系和区别

decision_function: 返回的是样本距离超平面的距离。二分类没什么好说的,对于多分类ovo,得到每对分类器的输出,n_class *(n_class - 1)/ 2个值。举个列子,

>>> clf.decision_function(predict_this)
[[ 96.42193513 -11.13296606 111.47424538 -88.5356536 44.29272494 141.0069203 ]]

对应的分类器是 [AB, AC, AD, BC, BD, CD]
所以我们得到每对分类器的结果[A, C, A, C, B, C]
例如,96.42193513 是正的,所以AB分离器得到的label是A
因为[A, C, A, C, B, C]中有3个C,得票最多,所以C就是整个多分类模型的预测label,这个就是使用predict得到的结果

而ovr,直接选择绝对值最大那个作为预测label

predict_proba: predict_proba涉及到Platt scaling,SVM中Platt scaling涉及到某些理论问题,如果一定要使用一个得分去表示,可以使用decision_function 去代替predict_proba

参考文章:
1. https://xacecask2.gitbooks.io/scikit-learn-user-guide-chinese-version/content/sec1.4.html
2. https://blog.csdn.net/gamer_gyt/article/details/51265347
3. https://datascience.stackexchange.com/questions/18374/predicting-probability-from-scikit-learn-svc-decision-function-with-decision-fun
4. https://stackoverflow.com/questions/15015710/how-can-i-know-probability-of-class-predicted-by-predict-function-in-support-v

  • 17
    点赞
  • 164
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: SVM投票法需要先训练多个SVM分类器,然后对这些分类器进行投票。下面是一个简单的Python实现示例: ```python from sklearn import svm from sklearn.ensemble import VotingClassifier # 创建三个SVM分类器,使用不同的kernel和C值 clf1 = svm.SVC(kernel='linear', C=1) clf2 = svm.SVC(kernel='poly', degree=2, C=1) clf3 = svm.SVC(kernel='rbf', gamma=0.7, C=1) # 使用投票法组合三个分类器 eclf = VotingClassifier(estimators=[('linear', clf1), ('poly', clf2), ('rbf', clf3)], voting='hard') # 训练分类器 eclf.fit(X_train, y_train) # 测试分类器 accuracy = eclf.score(X_test, y_test) print("Accuracy: %.2f%%" % (accuracy * 100.0)) ``` 在上面的代码中,首先创建了三个不同的SVM分类器,然后使用`VotingClassifier()`函数将它们组合成一个投票分类器。其中,`estimators`参数是一个包含元组的列表,每个元组中包括了一个分类器的名字和对应的分类器对象。`voting`参数指定了投票方式,可以是`hard`(硬投票)或`soft`(软投票),这里选择了硬投票。 最后,使用`fit()`函数训练投票分类器并使用`score()`函数测试分类器的准确率。 ### 回答2: 支持向量机投票法(SVM Voting)是一种基于支持向量机(Support Vector Machine,简称SVM)的集成学习方法。在Python中,我们可以使用scikit-learn库中的SVC类来实现SVM投票法。 SVM投票法是通过结合多个单独的SVM模型的预测结果来进行最终的预测。这些单独的SVM模型可以是不同的SVM内核(如线性核、多项式核、高斯核等),也可以是使用不同的超参数训练得到的SVM模型。 在Python中,我们可以使用SVC类创建单独的SVM模型,并使用fit()方法对训练数据进行训练。然后,我们可以使用predict()方法对测试数据进行预测。 要使用SVM投票法,我们首先需要创建多个单独的SVM模型,并对每个模型进行训练。然后,我们可以使用scikit-learn库中的VotingClassifier类来创建一个SVM投票法模型,将这些单独的SVM模型作为参数传递给VotingClassifier类的构造函数。 接下来,我们可以使用fit()方法对训练数据进行训练,并使用predict()方法对测试数据进行预测。VotingClassifier类会根据每个单独的SVM模型的预测结果进行投票,并选择得票最多的类别作为最终的预测结果。 在使用SVM投票法时,我们需要注意选择合适的超参数和内核类型,并进行交叉验证来评估模型的性能。此外,还可以使用特征选择方法来选择对于分类任务最重要的特征,以提升模型的性能。 总之,SVM投票法是一种使用多个支持向量机模型进行集成学习的方法,可以通过结合多个SVM模型的预测结果来提高分类的准确性。在Python中,我们可以使用scikit-learn库中的SVC类和VotingClassifier类来实现SVM投票法。 ### 回答3: SVM投票法是一种基于支持向量机(Support Vector Machine)的分类算法集成方法。在Python中,我们可以使用sklearn库中的SVC模块来实现SVM投票法。 首先,我们需要导入sklearn库和相应的模块: ``` from sklearn.svm import SVC from sklearn.ensemble import VotingClassifier ``` 接下来,我们可以定义一组支持向量机分类器: ``` svm_clf1 = SVC(kernel='linear', probability=True) svm_clf2 = SVC(kernel='rbf', probability=True) svm_clf3 = SVC(kernel='poly', degree=3, probability=True) ``` 在这个例子中,我们定义了三个支持向量机分类器,分别使用了不同的核函数(线性、高斯径向基、多项式)。 然后,我们可以使用这些分类器创建一个投票分类器: ``` voting_clf = VotingClassifier(estimators=[('svm1', svm_clf1), ('svm2', svm_clf2), ('svm3', svm_clf3)], voting='soft') ``` 在这个例子中,我们使用'soft'方式进行投票,即采用概率加权的方式进行分类决策。 最后,我们可以使用训练集对投票分类器进行训练,并使用测试集进行预测: ``` voting_clf.fit(X_train, y_train) y_pred = voting_clf.predict(X_test) ``` 这样,我们就可以完成SVM投票法的分类任务。 需要注意的是,SVM投票法是一种集成学习方法,通过将多个分类器的结果进行投票或加权平均来得到最终的分类结果。在实际应用中,选择合适的分类器和投票策略对最终分类性能至关重要。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值