SVM支持向量机,算是统计学习模型中综合性能较好的这么一种,是一种非线性模型,其实底层还是线性模型,其思想为构建超平面最大化不同类别数据的间隔,但是在实际问题中很多数据是无法完全准确无误的被这个超平面分隔开,于是我们定义软间隔允许存在一定微小的误差,其次在实际运用中,非线性数据更多,SVM是通过将数据维度映射到更高维的空间中,SVM认为的是任何非线性数据通过隐射到某个高维空间中一定可以变得线性可分。
这里简单介绍下使用sklearn中现成的svm框架进行svm做分类和回归问题的演示。
SVM在不同任务中需要设置的参数不同,详细参数可以点击这里查看。
完整项目点击这里,希望对你的学习有所帮助,欢迎点star。
一、SVM分类
数据集仍旧采用手写数字识别,点击这里。
内容为
先运行data_process.py加载mnist.npz生成对应的数据,再点击train.py运行。
代码为
import numpy as np
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
train_data=np.load('train_data.npz',allow_pickle=True)#加载数据
test_data=np.load('test_data.npz',allow_pickle=True)
train_x=train_data['arr_0'][:,:-1]#训练集
train_y=train_data['arr_0'][:,-1]#训练集标签
test_x=test_data['arr_0'][:,:-1]
test_y=test_data['arr_0'][:,-1]
model = SVC()
print('start training .....')
model.fit(train_x,train_y)
predict = model.predict(test_x)
print("SVM accuracy_score: %.4lf" % accuracy_score(predict,test_y))
分类效果为
这个精度很高了,,,
二、SVM回归
数据集点击这里下载。
内容为
其中天气数据集weather_data.txt是我写了个爬虫在天气公共网站爬取的上海近6年的气温数据,用来做回归。
代码为
import pandas as pd
import numpy as np
from sklearn.metrics import mean_absolute_error
from sklearn.svm import SVR
data=pd.read_csv('weather_data.txt',header=None).values#加载数据
data=data.reshape([1,len(data)])[0]
train_x = []
train_y = []
test_x = []
test_y = []
for i in range(int(len(data)*0.8)):
train_x.append(list(data[i:i+5]))
train_y.append(data[i+5])
for i in range(int(len(data)*0.8),len(data)-5):
test_x.append(list(data[i:i+5]))
test_y.append(data[i+5])
train_x=np.array(train_x)#将列表转换为数组
train_y=np.array(train_y)
test_x=np.array(test_x)
test_y=np.array(test_y)
print('train shape=',train_x.shape)
print('test shape=',test_x.shape)
model = SVR()#加载SVM回归模型
model.fit(train_x,train_y)
predict = model.predict(test_x)
print('SVM回归 mean_absolute_error: %.4lf' % mean_absolute_error(predict,test_y))
运行结果为
平均误差不算很高,主要变量比较单一,数据量少,可分析内容教少。