svm_分类_linearSVC线性分类支持向量机——鸢尾花 (一名大学生的机器学习之路)

支持向量机分类器(Support Vector Classifier)是根据训练样本的分布,搜索所以可能的线性分类器中最佳的那个,
决定分类边界位置的样本并不是所有训练数据,是其中的两个类别空间的间隔最小的两个不同类别的数据点,即“支持向量”。
从而可以在海量甚至高维度的数据中,筛选对预测任务最为有效的少数训练样本。

(LogisticRegression模型在训练过程中考虑了所有训练样本对参数的影响)

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets,linear_model,cross_validation,svm
%matplotlib inline
iris=datasets.load_iris()
iris=datasets.load_iris()
X_train = iris.data #data 表示数据
y_train = iris.target
这里采用分层采样
stratify:array-like或者None,默认是None.如果不是None,将会利用数据的标签将数据分层划分
若为None时,划分出来的测试集或训练集中,其类标签的比例也是随机的
若不为None时,划分出来的测试集或训练集中,其标签的比例同输入的数组中类标签的比例相同,可以用于处理不均衡的数据集
X_train,X_test,y_train,y_test=cross_validation.train_test_split(X_train,y_train,test_size=0.25,random_state=0,stratify=y_train)
print(X_train[0:1])
print(y_train[0:1])
测试结果为:
[[ 5.   2.   3.5  1. ]]
[1]
cls=svm.LinearSVC()
cls.fit(X_train,y_train)
print('各特征权重:%s,截距:%s'%(cls.coef_,cls.intercept_))
print("算法评分:%.2f" % cls.score(X_test,y_test))
运行结果:
各特征权重:[[ 0.20959286  0.39923917 -0.8173906  -0.44231852]
 [-0.12834361 -0.78761976  0.52065888 -1.02288195]
 [-0.80306777 -0.87608965  1.21359445  1.81016988]],截距:[ 0.11973591  2.04247594 -1.44408633]
算法评分:0.97
#预测值
predict=cls.predict(X_test)
print(predict[0:10])
print(y_test[0:10])
运行结果:
[0 0 0 0 1 1 1 0 1 1]
[0 0 0 0 1 1 1 0 1 2]
from sklearn.metrics import *
print('混淆矩阵列',confusion_matrix(y_test,predict))
print('准确率',accuracy_score(y_test,predict))
print(classification_report(y_test,predict))
运行结果:
混淆矩阵列 [[13  0  0]
 [ 0 13  0]
 [ 0  1 11]]
准确率 0.973684210526
             precision    recall  f1-score   support

          0       1.00      1.00      1.00        13
          1       0.93      1.00      0.96        13
          2       1.00      0.92      0.96        12

avg / total       0.98      0.97      0.97        38

考察损失函数对预测的影响

Hinge损失函数

  Hinge loss用于最大间隔(maximum-margin)分类,其中最有代表性的就是支持向量机SVM。

  Hinge函数的标准形式:

 

  

(与上面统一的形式:

  其中,t为目标值(-1或+1),y是分类器输出的预测值,并不直接是类标签。其含义为,当t和y的符号相同时(表示y预测正确)并且|y|≥1时,hinge loss为0;当t和y的符号相反时,hinge loss随着y的增大线性增大。

losses=['hinge','squared_hinge']
for loss in losses:
    cls=svm.LinearSVC(loss=loss)
    cls.fit(X_train,y_train)
    print('损失函数为%s' %loss)
    print('个特征权重:%s,截距:%s' %(cls.coef_,cls.intercept_))
    print("算法评分:%.2f" % cls.score(X_test,y_test))
    print('\n\n\n')
运行结果:
损失函数为hinge
个特征权重:[[ 0.36635627  0.32164739 -1.07532841 -0.57004277]
 [ 0.47371332 -1.5596351   0.39464807 -1.34130072]
 [-1.21073321 -1.15219335  1.84567424  1.98849976]],截距:[ 0.1804968   1.34113194 -1.42835244]
算法评分:0.97

损失函数为squared_hinge
个特征权重:[[ 0.20959432  0.3992355  -0.81739149 -0.44231675]
 [-0.12888308 -0.78389372  0.52105507 -1.02458047]
 [-0.80308369 -0.87600462  1.21358279  1.81026741]],截距:[ 0.11973893  2.03764804 -1.44400323]
算法评分:0.97
#小结:在鸢尾花的问题上,虽然损失函数不同,但对测试集的预测准确率是一样的

考察罚项形式对预测的影响

机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作1ℓ1-norm2ℓ2-norm,中文称作L1正则化L2正则化,或者L1范数L2范数

L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。对于线性回归模型,使用L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)

  • L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择
  • L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合

l12=['l1','l2']
for p in l12:
    cls=svm.LinearSVC(penalty=p,dual=False)
    cls.fit(X_train,y_train)
    print('惩罚项为%s' %p)
    print('个特征权重:%s,截距:%s' %(cls.coef_,cls.intercept_))
    print("算法评分:%.2f" % cls.score(X_test,y_test))
    print('\n\n\n')
运行结果:
惩罚项为l1
个特征权重:[[ 0.16181504  0.52432151 -0.93196326  0.        ]
 [-0.15088218 -0.91022069  0.4799855  -0.93002568]
 [-0.56203425 -0.85258651  0.95828143  2.32145219]],截距:[ 0.          2.58284397 -2.60808209]
算法评分:0.95

惩罚项为l2
个特征权重:[[ 0.20966721  0.39922563 -0.81739423 -0.44237657]
 [-0.13079574 -0.7872181   0.52298032 -1.02445961]
 [-0.80308922 -0.87656106  1.21391169  1.81021937]],截距:[ 0.11945388  2.04805235 -1.44409296]
算法评分:0.97
#小结:这是dual=False是因为当dual=True时,penalty=12的情况不支持

再考虑罚项系数C的影响


引入正则化系数C,可以理解允许划分错误的权重(越大,越不允许出错),当C较小时,允许少量样例划分错误
cs=np.logspace(-2,1)
print(cs)
train_scores=[]
test_scores=[]
for c in cs :
    cls=svm.LinearSVC(C=c)
    cls.fit(X_train,y_train)
    train_scores.append(cls.score(X_train,y_train))
    test_scores.append(cls.score(X_test,y_test))

#绘图表示  
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.plot(cs,train_scores,label="Training score")
ax.plot(cs,test_scores,label="testing score")
ax.set_xlabel(r'c')
ax.set_ylabel(r'score')
ax.set_xscale('log')
ax.set_title("LinearSVC")
ax.legend(loc='best')
plt.show()
#小结:可以看到当c较小时,误分类点重要性较低,此时误分类点较多,分类器性能差

运行结果:

[  0.01         0.01151395   0.01325711   0.01526418   0.01757511
   0.0202359    0.02329952   0.02682696   0.03088844   0.0355648
   0.04094915   0.04714866   0.05428675   0.06250552   0.07196857
   0.08286428   0.09540955   0.10985411   0.12648552   0.14563485
   0.16768329   0.19306977   0.22229965   0.25595479   0.29470517
   0.33932218   0.39069399   0.44984327   0.51794747   0.59636233
   0.68664885   0.79060432   0.91029818   1.04811313   1.20679264
   1.38949549   1.59985872   1.84206997   2.12095089   2.44205309
   2.8117687    3.23745754   3.72759372   4.29193426   4.94171336
   5.68986603   6.55128557   7.54312006   8.68511374  10.        ]
 
   
注:图未必一样,每次刷新都会变,原因:支持向量机分类器是根据训练样本的分布,搜索所以可能的线性分类器中最佳的那个,决定分类边界位置的样本并不是所有训练数据,是其中的两个类别空间的间隔最小的两个不同类别的数据点,即“支持向量”。从而可以在海量甚至高维度的数据中,筛选对预测任务最为有效的少数训练样本。

 
  

你可能感兴趣的:(机器学习)