我打算通过在sklearn(sklearn.datasets.load_boston)附带的波士顿住房价格数据集上运行来测试我的sklearn支持向量回归包的实现。
在玩了一段时间后(尝试不同的正则化和管参数,案例的随机化和交叉验证)并始终如一地预测扁平线,我现在对于失败的地方感到茫然。更引人注目的是,当我使用sklearn.datasets软件包(load_diabetes)附带的糖尿病数据集时,我得到了更好的预测。
以下是复制代码:
import numpy as np
from sklearn.svm import SVR
from matplotlib import pyplot as plt
from sklearn.datasets import load_boston
from sklearn.datasets import load_diabetes
from sklearn.linear_model import LinearRegression
# data = load_diabetes()
data = load_boston()
X = data.data
y = data.target
# prepare the training and testing data for the model
nCases = len(y)
nTrain = np.floor(nCases / 2)
trainX = X[:nTrain]
trainY = y[:nTrain]
testX = X[nTrain:]
testY = y[nTrain:]
svr = SVR(kernel='rbf', C=1000)
log = LinearRegression()
# train both models
svr.fit(trainX, trainY)
log.fit(trainX, trainY)
# predict test labels from both models
predLog = log.predict(testX)
predSvr = svr.predict(testX)
# show it on the plot
plt.plot(testY, testY, label='true data')
plt.plot(testY, predSvr, 'co', label='SVR')
plt.plot(testY, predLog, 'mo', label='LogReg')
plt.legend()
plt.show()
现在我的问题是:您是否有人成功地将此数据集与支持向量回归模型一起使用或了解我做错了什么?我非常感谢您的建议!
以下是上述脚本的结果:
答案 0 :(得分:8)
将内核从rbf
更改为linear
将解决问题。如果您想使用rbf
,请尝试使用其他参数,尤其是gamma
。默认gamma
(1/# features
)对您的案例来说太大了。
这是我用于线性内核SVR
的参数:
svr = SVR(kernel='linear', C=1.0, epsilon=0.2)
我绘制了训练数据标签和测试数据标签。您可能会注意到训练数据的分布不均匀。这使得该模型缺少5 < y < 15
时的培训数据。所以我做了一些数据的洗牌,并将训练数据设置为使用66%的数据。
nTrain = np.floor(nCases *2.0 / 3.0)
import random
ids = range(nCases)
random.shuffle(ids)
trainX,trainY,testX,testY = [],[],[],[]
for i, idx in enumerate(ids):
if i < nTrain:
trainX.append(X[idx])
trainY.append(y[idx])
else:
testX.append(X[idx])
testY.append(y[idx])
这就是我得到的:
从预测错误的角度来看,两个回归量看起来都比较好。
以下是rbf
内核SVR
的一个工作示例:
svr = SVR(kernel='rbf', C=1.0, epsilon=0.2, gamma=.0001)
结果如下: