传统机器学习–SVM
- SVM的原理
- SVM应用场景
- SVM优缺点
- SVM sklearn 参数学习
- 利用SVM模型结合 Tf-idf 算法进行文本分类
一、SVM原理
SVM(支持向量机)就是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机。SVM的的学习算法就是求解凸二次规划的最优化算法。
SVM的核心思想就是找到不同类别之间的分界面,使得两类样本尽量落在面的两边,而且离分界面尽量远。
SVM学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。
推导过程见 https://zhuanlan.zhihu.com/p/31886934
二、SVM应用场景
目前支持向量机主要应用在模式识别领域中的文本识别,中文分类,人脸识别等;同时也应用到许多的工程技术和信息过滤等方面.
当前研究的热点主要是对支持向量机中算法的优化,包括解决SVM中二次规划求解问题,对大规模SVM的求解问题,对SVM中QP问题的求解问题等.另外就是如何更好的构造基于SVM的多类分类器,如何提高SVM的归纳能力和分类速度等.如何根据实际问题确定核函数也是一个重要的研究热点.
三、SVM优缺点
优点:
(1)非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射;
(2)对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心;
(3)支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量。
(4)SVM 是一种有坚实理论基础的新颖的小样本学习方法。它基本上不涉及概率测度及大数定律等,因此不同于现有的统计方法。从本质上看,它避开了从归纳到演绎的传统过程,实现了高效的从训练样本到预报样本的“转导推理”,大大简化了通常的分类和回归等问题。
(5)SVM 的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。
(6)少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。这种“鲁棒”性主要体现在:
①增、删非支持向量样本对模型没有影响;
②支持向量样本集具有一定的鲁棒性;
③有些成功的应用中,SVM 方法对核的选取不敏感
缺点:
(1) SVM算法对大规模训练样本难以实施
由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间。针对以上问题的主要改进有有J.Platt的SMO算法、T.Joachims的SVM、C.J.C.Burges等的PCGC、张学工的CSVM以及O.L.Mangasarian等的SOR算法
(2) 用SVM解决多分类问题存在困难
经典的支持向量机算法只给出了二类分类的算法,而在数据挖掘的实际应用中,一般要解决多类的分类问题。可以通过多个二类支持向量机的组合来解决。主要有一对多组合模式、一对一组合模式和SVM决策树;再就是通过构造多个分类器的组合来解决。主要原理是克服SVM固有的缺点,结合其他算法的优势,解决多类问题的分类精度。如:与粗集理论结合,形成一种优势互补的多类问题的组合分类器。
四、SVM sklearn 参数学习(转)
Sklearn中SVM主要有LinearSVC、NuSVC和SVC三种方法:
- LinearSVC
class sklearn.svm.LinearSVC(penalty='l2', loss='squared_hinge', dual=True, tol=0.0001, C=1.0, multi_class='ovr', fit_intercept=True, intercept_scaling=1, class_weight=None, verbose=0, random_state=None, max_iter=1000)
penalty:正则化参数,L1和L2两种参数可选,仅LinearSVC有。
loss:损失函数,有‘hinge’和‘squared_hinge’两种可选,前者又称L1损失,后者称为L2损失,默认是是’squared_hinge’,其中hinge是SVM的标准损失,squared_hinge是hinge的平方。dual:是否转化为对偶问题求解,默认是True。
tol:残差收敛条件,默认是0.0001,与LR中的一致。
C:惩罚系数,用来控制损失函数的惩罚系数,类似于LR中的正则化系数。
multi_class:负责多分类问题中分类策略制定,有‘ovr’和‘crammer_singer’ 两种参数值可选,默认值是’ovr’,'ovr’的分类原则是将待分类中的某一类当作正类,其他全部归为负类,通过这样求取得到每个类别作为正类时的正确率,取正确率最高的那个类别为正类;
‘crammer_singer’ 是直接针对目标函数设置多个参数值,最后进行优化,得到不同类别的参数值大小。
fit_intercept:是否计算截距,与LR模型中的意思一致。
class_weight:与其他模型中参数含义一样,也是用来处理不平衡样本数据的,可以直接以字典的形式指定不同类别的权重,也可以使用balanced参数值。
verbose:是否冗余,默认是False。
random_state:随机种子的大小。
max_iter:最大迭代次数,默认是1000。
对象
coef_:各特征的系数(重要性)。
intercept_:截距的大小(常数值)。
2. NuSVC
class sklearn.svm.NuSVC(nu=0.5, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape='ovr', random_state=None))
nu:训练误差部分的上限和支持向量部分的下限,取值在(0,1)之间,默认是0.5kernel:核函数,核函数是用来将非线性问题转化为线性问题的一种方法,默认是“rbf”核函数,常用的核函数有以下几种:
表示解释linear线性核函数poly多项式核函数rbf高斯核函数sigmodsigmod核函数precomputed自定义核函数
关于不同核函数之间的区别,可以参考这篇文章:https://blog.csdn.net/batuwuhanpei/article/details/52354822
degree:当核函数是多项式核函数的时候,用来控制函数的最高次数。(多项式核函数是将低维的输入空间映射到高维的特征空间)
gamma:核函数系数,默认是“auto”,即特征维度的倒数。
coef0:核函数常数值(y=kx+b中的b值),只有‘poly’和‘sigmoid’核函数有,默认值是0。
max_iter:最大迭代次数,默认值是-1,即没有限制。
probability:是否使用概率估计,默认是False。
decision_function_shape:与’multi_class’参数含义类似。
cache_size:缓冲大小,用来限制计算量大小,默认是200M。
对象
support_:以数组的形式返回支持向量的索引。
support_vectors_:返回支持向量。
n_support_:每个类别支持向量的个数。
dual_coef_:支持向量系数。
coef_:每个特征系数(重要性),只有核函数是LinearSVC的时候可用。
intercept_:截距值(常数值)。
- SVC
class sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape='ovr', random_state=None)
C:惩罚系数
SVC和NuSVC方法基本一致,唯一区别就是损失函数的度量方式不同(NuSVC中的nu参数和SVC中的C参数)。
方法
三种分类方法的方法基本一致,所以就一起来说啦。
decision_function(X):获取数据集X到分离超平面的距离。
fit(X, y):在数据集(X,y)上使用SVM模型。
get_params([deep]):获取模型的参数。
predict(X):预测数据值X的标签。
score(X,y):返回给定测试集和对应标签的平均准确率
五、利用SVM模型结合 Tf-idf 算法进行文本分类
01分类
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import MultinomialNB
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score , roc_auc_score , roc_curve
import matplotlib.pyplot as plt
def create_model(d_train , d_test):
print("训练样本 = %d" % len(d_train))
print("测试样本 = %d" %len(d_test))
vectorizer = TfidfVectorizer(ngram_range=(1,2),min_df=2 ) #tf-idf特征抽取ngram_range=(1,2)
features = vectorizer.fit_transform(d_train.title)
print("训练样本特征表长度为 " + str(features.shape))
# print(vectorizer.get_feature_names()[3000:3050]) #特征名展示
test_features = vectorizer.transform(d_test.title)
print("测试样本特征长度为:"+str(test_features.shape))
#支持向量机
#C: 目标函数的惩罚系数C,用来平衡分类间隔margin和错分样本的,default C = 1.0
svmmodel = SVC(C = 1.0 , kernel= "linear") #kernel:参数选择有rbf, linear, poly, Sigmoid, 默认的是"RBF";
nn = svmmodel.fit(features , d_train.two_category)
print(nn)
# predict = svmmodel.score(test_features ,d_test.two_category)
# print(predict)
pre_test = svmmodel.predict(test_features)
d_test["01category"] = pre_test
d_test.to_excel("wr01_pre_1025.xlsx", index=False)
# d_train , d_test = data_prepare()
print("对新样本进行01预测")
df = pd.read_excel("wr01_new_train1012.xlsx") #训练
d_train = df
d_test = pd.read_excel("wr_100样本1023.xlsx") #测试
create_model(d_train, d_test)
参考资料
知乎 支持向量机(SVM)——原理篇 余帅 https://zhuanlan.zhihu.com/p/31886934
CSDN SVM 的推导、特点、优缺点、多分类问题及应用 keepreder
https://blog.csdn.net/keepreder/article/details/47146939
CSDN 支持向量机(SVM)的优缺点 https://blog.csdn.net/qq_38734403/article/details/80442535
知乎 sklearn参数详解—SVM https://zhuanlan.zhihu.com/p/39780508
CSDN tf-idf + svm 文本分类 https://blog.csdn.net/zn505119020/article/details/78740334