我一直在尝试使用scikit-learn库执行普通最小二乘回归,但又遇到了另一个问题。
我已经使用了OneHotEncoder来二进制化我的(独立)虚拟/分类特征,我有一个像这样的数组:
x = [[ 1. 0. 0. ..., 0. 0. 0.]
[ 1. 0. 0. ..., 0. 0. 0.]
[ 0. 1. 0. ..., 0. 0. 0.]
...,
[ 0. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 1. ..., 0. 0. 0.]
[ 1. 0. 0. ..., 0. 0. 0.]]
因变量(Y)存储在一维数组中。一切都很好,除了现在当我要绘制这些值时,我得到了一个错误:
# Plot outputs
pl.scatter(x_test, y_test, color='black')
ValueError: x and y must be the same size
当我使用numpy。
>>> print np.size(x)
5096
>>> print np.size(y)
98
有趣的是,这两组数据都被拟合方法所接受。
我的问题是如何将OneHotEncoder的输出转换为在我的回归中使用?
如果我理解正确的话,你有你的X矩阵作为一个[m X n]矩阵的输入和一些[n X 1]的输出Y,其中m =特征数,n =数据点数。
首先,线性回归拟合函数并不关心X的维数是[m X n], Y的维数是[n X 1],因为它只使用一个维数为[1 X m]的参数,即
Y = theta * X
不幸的是,正如eickenberg所指出的那样,您不能像使用matplotlib分散调用那样根据Y值绘制所有X特征,因此您会得到大小不兼容的错误消息,它希望绘制n X n而不是(n X m) X n。
要解决这个问题,试着一次只看一个特性:
pl.scatter(x_test[:,0], y_test, color='black')
假设你已经标准化了你的数据(减去平均值并除以平均值),一种快速而肮脏的方法来查看趋势将是在单个轴上绘制所有它们:
fig = plt.figure(0)
ax = fig.add_subplot(111)
n, m = x_test.size
for i in range(m):
ax.scatter(x_test[:,m], y_test)
plt.show()
要在独立的图形(取决于特征的数量)上同时可视化,然后查看,例如,subplot2grid例程或另一个python模块,如pandas。