4

我打算通过在 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()

现在我的问题是:你们中是否有人成功地使用了这个数据集和支持向量回归模型,或者知道我做错了什么?我非常感谢您的建议!

下面是上面脚本这个结果的结果: 在 load_boston 数据集上运行的结果

4

1 回答 1

8

将内核从 更改rbflinear将解决问题。如果您想使用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)

结果如下所示:

在此处输入图像描述

于 2013-01-29T21:30:38.630 回答