当前位置: 代码网 > it编程>前端脚本>Python > 机器学习-支持向量机(SVM) -回归-python scikit-learn

机器学习-支持向量机(SVM) -回归-python scikit-learn

2024年08月04日 Python 我要评论
支持向量机是一种用于回归、分类和检测异常值的监督学习算法。支持向量机是经典机器学习中非常强大的模型之一,适用于处理复杂的高维数据集。支持向量机支持不同的核(线性、多项式、径向基函数(rbf)和sigmoid),支持向量机可以处理不同类型的数据集,包括线性和非线性。支持向量机的工作方式可以比作有边界线的间隔。在SVM训练过程中,SMV根据每个训练数据点的重要程度绘制类之间的较大裕度或决策边界。在决策边界内的训练数据点称为支持向量。这是一个使用支持向量机进行回归的实验介绍。

前言

支持向量机是一种用于回归、分类和检测异常值的监督学习算法。支持向量机是经典机器学习中非常强大的模型之一,适用于处理复杂的高维数据集。

支持向量机支持不同的核(线性、多项式、径向基函数(rbf)和sigmoid),支持向量机可以处理不同类型的数据集,包括线性和非线性。

支持向量机的工作方式可以比作有边界线的间隔。在svm训练过程中,smv根据每个训练数据点的重要程度绘制类之间的较大裕度或决策边界。在决策边界内的训练数据点称为支持向量。

实验数据可在文章中下载。

1.导入模块

import numpy as np
import pandas as pd
import seaborn as sns
import urllib.request
import sklearn
import matplotlib.pyplot as plt
%matplotlib inline

2.导入数据

cal_data = pd.read_csv('housing.csv')
#把数据分成训练集和测试集。
from sklearn.model_selection import train_test_split
train_data, test_data = train_test_split(cal_data, test_size=0.1,random_state=20)

3.数据预处理

# 获取训练输入数据和标签
training_input_data = train_data.drop('median_house_value', axis=1)
training_labels = train_data['median_house_value']

# 数值特征
num_feats = training_input_data.drop('ocean_proximity', axis=1)
# 分类特征
cat_feats = training_input_data[['ocean_proximity']]

# 处理缺失值
from sklearn.pipeline import pipeline 
from sklearn.impute import simpleimputer
from sklearn.preprocessing import standardscaler
num_pipe = pipeline([
      ('imputer', simpleimputer(strategy='mean')),
      ('scaler', standardscaler())])
num_preprocessed = num_pipe.fit_transform(num_feats)
# pipeline结合了数值pipeline和分类特征编码
from sklearn.compose import columntransformer
from sklearn.preprocessing import onehotencoder
num_list = list(num_feats)
cat_list = list(cat_feats)
final_pipe = columntransformer([
    ('num', num_pipe, num_list),
    ('cat', onehotencoder(), cat_list)
])
training_data_preprocessed = final_pipe.fit_transform(training_input_data)

4.训练支持向量回归器

在回归中,svr不像在分类中那样用决策边界分离类,而是在边界边缘上拟合训练数据点,但保持它们不相交。

from sklearn.svm import linearsvr, svr
#使用线性支持向量机。
lin_svr = linearsvr()
lin_svr.fit(training_data_preprocessed, training_labels)
#还可以使用具有多项式核函数的非线性支持向量机。
poly_svr = svr(kernel='poly')
poly_svr.fit(training_data_preprocessed, training_labels)

5.评价支持向量回归

在对测试集进行评估之前,先对训练集上创建的两个模型进行评估。因为找到一个好的模型需要许多改进的迭代,所以不建议在模型足够好之前触摸测试集。否则,它将无法根据新数据做出预测。
通常用均方误差来评价回归模型,但最常用的是均方根误差。

from sklearn.metrics import mean_squared_error
#先看看线性支持向量机看看效果
predictions = lin_svr.predict(training_data_preprocessed)
mse = mean_squared_error(training_labels, predictions)
rmse = np.sqrt(mse)
rmse  #215682.86713461558

线性支持向量机效果不佳,再看看多项式核函数非线性支持向量机的效果。

predictions = poly_svr.predict(training_data_preprocessed)
mse = mean_squared_error(training_labels, predictions)
rmse = np.sqrt(mse)
rmse  #117513.38828582528

它比前者做得好。这里还可以尝试用随机搜索来改进这一点,以找到最好的参数。

6.改进支持向量回归模型

使用随机搜索来改进svr模型。关于参数的一些注意事项:

  • gamma(y): 这是一个正则化超参数。当gamma很小时,模型可能欠拟合。它太高,模型会过拟合。
  • c: 和gamma一样。它是一个正则化超参数。当c较低时,有很多正则化。当c较高时,正则化程度较低。
  • epsilon:用来控制间隔的宽度。
from sklearn.model_selection import randomizedsearchcv
params = {'gamma':[0.0001, 0.1],'c':[1,1000], 'epsilon':[0,0.5], 'degree':[2,5]}
rnd_search = randomizedsearchcv(svr(), params, n_iter=10, verbose=2, cv=3, random_state=42)
rnd_search.fit(training_data_preprocessed, training_labels)

predictions = svr_rnd.predict(training_data_preprocessed)
mse = mean_squared_error(training_labels, predictions)
rmse = np.sqrt(mse)
rmse  #68684.15262765526
#测试集上进行评估
test_input_data = test_data.drop('median_house_value', axis=1)
test_labels = test_data['median_house_value']
test_preprocessed = final_pipe.transform(test_input_data)

test_pred = svr_rnd.predict(test_preprocessed)
test_mse = mean_squared_error(test_labels,test_pred)
test_rmse = np.sqrt(test_mse)
test_rmse  #68478.07737338323

总结

这是一个使用支持向量机进行回归的实验介绍。在下一个实验中,将使用svm进行分类。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com