机器学习-支持向量机-回归
前言
支持向量机是一种用于回归、分类和检测异常值的监督学习算法。支持向量机是经典机器学习中非常强大的模型之一,适用于处理复杂的高维数据集。
支持向量机支持不同的核(线性、多项式、径向基函数(rbf)和sigmoid),支持向量机可以处理不同类型的数据集,包括线性和非线性。
支持向量机的工作方式可以比作有边界线的间隔。在SVM训练过程中,SMV根据每个训练数据点的重要程度绘制类之间的较大裕度或决策边界。在决策边界内的训练数据点称为支持向量。
实验数据可在机器学习-线性回归-python scikit-learn 房价预测文章中下载。
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进行分类。