监督学习---支持向量机SVM

  机器学习中监督学习模型的任务重点在于根据已有经验知识对未知样本的目标/标记进行预测。根据目标预测变量的类型不同,把监督学习任务大体分为分类学习和回归预测两类。分类学习是最为常见的监督学习问题,其中,最基础的是二分类问题,除此之外还有多分类问题。
在这里插入图片描述

一、线性分类器–支持向量机

1.1 模型介绍

  支持向量机是一种二分类模型,它的目的就是构造一个“超平面”,并利用“超平面”将不同类别的样本做划分。同时使得样本集中的点到这个分类超平面的最小距离(即分类间隔)最大化。即搜索所有可能的线性分类器中最佳的那个,最终转化为一个凸二次规划问题求解。
  非线性问题:SVM的处理方法是选择一个核函数,通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。
在这里插入图片描述

1.2 损失函数

  SVM的损失函数就是合页损失函数加上正则化项:
在这里插入图片描述

1.3 模型参数

LinearSVC(
   penalty='l2',#字符串。可取值为'l1'和'l2'分别对应1范数和2范数
    loss='squared_hinge',#表示损失函数。可取值为'hinge':合页损失函数;'squared_hinge':合页损失函数的平方。
    dual=True,#布尔值。如果为true,则求解对偶问题。如果为false,解决原始问题。
    tol=0.0001,#SVM停止训练的误差精度
    C=1.0, #错误项的惩罚系数。c越大,即对分错样本的惩罚程度越大,减小c的话,允许训练样本中有一些误分类错误样本,泛化能力强。
    multi_class='ovr',#字符串,指定多分类问题的策略,'ovr': 采用one-vs-rest分类策略;'crammer_singer': 多类联合分类,很少用。
    fit_intercept=True,#布尔值。如果为true,则计算截距,即决策函数中的常数项;否则忽略截距
    intercept_scaling=1,#如果提供了,则实例X变成向量[X,intercept_scaling]。此时相当于添加了一个人工特征,该特征对所有实例都是常数值
    class_weight=None,#给每个类别分别设置不同的惩罚参数c,如果没有给,所有类别都是默认值。
    verbose=0,#是否启用详细输出。一般情况下设置为False。
    random_state=None,#伪随机数发生器的种子,在混洗数据时用于概率估计
    max_iter=1000,#最大迭代次数,如果为-1表示不受限制。
    )

1.4 python代码实践案例

  本案例通过scikit-learn 内部集成的手写体数字图片数据集进行讲解分析。

from sklearn.datasets import load_digits  #加载手写体数字加载器
from sklearn.model_selection import train_test_split #用于分割数据集
from sklearn.preprocessing import StandardScaler     # 归一化
from sklearn.svm import LinearSVC  #线性分类支持向量机
digits=load_digits()
digits.data.shape
#输出:(1797, 64)

  该手写体数字的数码图像数据共有1797条,并且每幅图片是由8x8=64的像素矩阵表示。

x_train,x_test,y_train,y_test = train_test_split(digits.data,digits.target,test_size=0.3,random_state=33)
ss=StandardScaler()
X_train=ss.fit_transform(x_train)
X_test=ss.transform(x_test)
#初始化
lsvc=LinearSVC()
lsvc.fit(X_train,y_train)
lsvc_y_predict=lsvc.predict(X_test)
print('Accuracy of svc Classifier:',lsvc.score(X_test,y_test))
print(classification_report(y_test,lsvc_y_predict))

在这里插入图片描述
  支持向量机(分类)模型的确能够提供比较高的手写数字识别能力,平均各项指标都在95%上下。

二、线性回归器-支持向量机

  支持向量机回归也同样是从训练数据中选取一部分更加有效的支持向量,只是这少部分的训练样本所提供的并不是类别目标,而是更加具体的预测数值。

from sklearn.svm import SVR
import pandas as pd
from sklearn.metrics import r2_score,mean_absolute_error,mean_squared_error
boston = pd.read_excel('boston_house_price.xlsx')
#使用线性核函数配置的支持向量机进行回归训练,并对测试样本进行预测
x=np.array(boston.iloc[:,:-1])
y=np.array(boston.iloc[:,-1])
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25,random_state=33)

ss_x=StandardScaler()
X_train=ss_x.fit_transform(x_train) #x_train:(379, 13) X_train:(379, 13)
X_test=ss_x.transform(x_test)   #x_test:(127, 13)  X_test:(127, 13)
##说明一下:fit_transform与transform都要求操作2D数据,而此时的y_train与y_test都是1D的,因此需要调用reshape(-1,1),例如:[1,2,3]变成[[1],[2],[3]]
ss_y=StandardScaler()
Y_train=ss_y.fit_transform(y_train.reshape(-1,1))# y_train:(127,) Y_train:(127, 1)
Y_test=ss_y.transform(y_test.reshape(-1,1))   #y_test:(379,) Y_test:(379, 1)


#使用线性核函数配置的支持向量机进行回归训练,并且对测试样本进行预测
linear_svr = SVR(kernel='linear')
linear_svr.fit(X_train,Y_train)
linear_svr_y_predict =linear_svr.predict(X_test)

#使用多项式核函数配置的支持向量机进行回归训练,并且对测试样本进行预测
poly_svr = SVR(kernel='poly')
poly_svr.fit(X_train,Y_train)
poly_svr_y_predict =poly_svr.predict(X_test)

#使用径向基核函数配置的支持向量机进行回归训练,并且对测试样本进行预测
rbf_svr = SVR(kernel='rbf')
rbf_svr.fit(X_train,Y_train)
rbf_svr_y_predict =rbf_svr.predict(X_test)

print('The r2 value of linear SVR is :',linear_svr.score(X_test,Y_test))
print('The mean squared error of linear SVR is :',mean_squared_error(y_test.reshape(-1,1),ss_y.inverse_transform(linear_svr_y_predict.reshape(-1,1)))) #(127, 1),#ss_y.inverse_transform(linear_svr_y_predict.reshape(-1,1)))(127, 1)
print('The mean absoluate error of linear SVR is :',mean_absolute_error(y_test.reshape(-1,1),ss_y.inverse_transform(linear_svr_y_predict.reshape(-1,1))))

在这里插入图片描述

print('The r2 value of poly SVR is :',poly_svr.score(X_test,Y_test))
print('The mean squared error of poly SVR is :',mean_squared_error(y_test.reshape(-1,1),ss_y.inverse_transform(poly_svr_y_predict.reshape(-1,1)))) #(127, 1),#ss_y.inverse_transform(linear_svr_y_predict.reshape(-1,1)))(127, 1)
print('The mean absoluate error of poly SVR is :',mean_absolute_error(y_test.reshape(-1,1),ss_y.inverse_transform(poly_svr_y_predict.reshape(-1,1))))

在这里插入图片描述

print('The r2 value of rbf SVR is :',rbf_svr.score(X_test,Y_test))
print('The mean squared error of rbf SVR is :',mean_squared_error(y_test.reshape(-1,1),ss_y.inverse_transform(rbf_svr_y_predict.reshape(-1,1)))) #(127, 1),#ss_y.inverse_transform(linear_svr_y_predict.reshape(-1,1)))(127, 1)
print('The mean absoluate error of rbf SVR is :',mean_absolute_error(y_test.reshape(-1,1),ss_y.inverse_transform(rbf_svr_y_predict.reshape(-1,1))))

在这里插入图片描述
  综上三种不同核函数配置下的支持向量机回归模型在测试集上的回归性能评估发现,不同配置下的模型在相同测试集上,存在非常大的差异,并且使用径向基核函数对特征进行非线性映射后,支持向量机展现了最佳的回归性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值