使用支持向量机回归估计房价
让我们看看如何使用支持向量机(SVM)的概念构建一个回归器来估计房价。我们将使用sklearn中提供的数据集,其中每个数据点由13个属性定义。我们的目标是根据这些属性估计房价。
引言
支持向量回归(SVR)是一种用于回归任务的机器学习算法。它的目标是找到一个函数,使得数据点偏离该函数的距离在某个阈值内的情况下,该函数尽可能平滑。数学上,SVR 通过解决以下优化问题来实现:
min 1 2 ∥ w ∥ 2 + C ∑ i = 1 n max ( 0 , ∣ y i − ( w ⋅ x i + b ) ∣ − ϵ ) \min \frac{1}{2} \|w\|^2 + C \sum_{i=1}^n \max(0, |y_i - (w \cdot x_i + b)| - \epsilon) min21∥w∥2+Ci=1∑nmax(0,∣yi−(w⋅xi+b)∣−ϵ)
其中, w w w 是权重向量, b b b 是偏差, C C C 是惩罚参数, ϵ \epsilon ϵ 是不敏感阈值。
案例代码
# 导入所需的包
import numpy as np
from sklearn import datasets
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error, explained_variance_score
from sklearn.utils import shuffle# 加载房价数据集
data = datasets.load_boston()# 打乱数据以避免分析偏差
X, y = shuffle(data.data, data.target, random_state=7)# 将数据集按照80/20的比例分割为训练集和测试集
num_training = int(0.8 * len(X))
X_train, y_train = X[:num_training], y[:num_training]
X_test, y_test = X[num_training:], y[num_training:]# 创建支持向量回归模型并使用线性核
# C 参数表示训练误差的惩罚,如果增大 C 的值,模型将更精细地拟合训练数据
# 这可能会导致过拟合并使其失去泛化能力
# epsilon 参数指定一个阈值,如果预测值与实际值的距离在此阈值内,则不会有训练误差的惩罚
sv_regressor = SVR(kernel='linear', C=1.0, epsilon=0.1)# 训练支持向量回归模型
sv_regressor.fit(X_train, y_train)# 评估回归器的性能并打印指标
y_test_pred = sv_regressor.predict(X_test)
mse = mean_squared_error(y_test, y_test_pred)
evs = explained_variance_score(y_test, y_test_pred)
print("\n#### 性能 ####")
print("均方误差 =", round(mse, 2))
print("解释方差分数 =", round(evs, 2))# 对测试数据点进行预测
test_data = [3.7, 0, 18.4, 1, 0.87, 5.95, 91, 2.5052, 26, 666, 20.2, 351.34, 15.27]
print("\n预测价格:", sv_regressor.predict([test_data])[0])
为了方便读者理解,这里我们对datasets.load_boston()
房价数据部分展示:
CRIM | ZN | INDUS | CHAS | NOX | RM | AGE | DIS | RAD | TAX | PTRATIO | B | LSTAT | PRICE |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0.00632 | 18.0 | 2.31 | 0.0 | 0.538 | 6.575 | 65.2 | 4.0900 | 1 | 296 | 15.3 | 396.90 | 4.98 | 24.0 |
0.02731 | 0.0 | 7.07 | 0.0 | 0.469 | 6.421 | 78.9 | 4.9671 | 2 | 242 | 17.8 | 396.90 | 9.14 | 21.6 |
0.02729 | 0.0 | 7.07 | 0.0 | 0.469 | 7.185 | 61.1 | 4.9671 | 2 | 242 | 17.8 | 392.83 | 4.03 | 34.7 |
0.03237 | 0.0 | 2.18 | 0.0 | 0.458 | 6.998 | 45.8 | 6.0622 | 3 | 222 | 18.7 | 394.63 | 2.94 | 33.4 |
0.06905 | 0.0 | 2.18 | 0.0 | 0.458 | 7.147 | 54.2 | 6.0622 | 3 | 222 | 18.7 | 396.90 | 5.33 | 36.2 |
运行代码应该得到以测试数据对应的房价预测结果:
#### 性能 ####
均方误差 = 15.41
解释方差分数 = 0.82
预测价格: 18.5217801073