Pyplot无法绘制回归

时间:2016-11-16 15:20:50

标签: python numpy matplotlib scikit-learn

我试图模仿非常简单的例子

N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2  # 0 to 15 point radiuses

print(type(x),type(y))
print('training samples ',len(x),len(y))
plt.scatter(x, y, c=colors, alpha=0.5)
plt.show()

这显示

<class 'numpy.ndarray'> <class 'numpy.ndarray'>
training samples  50 50

如预期的那样,情节也出现了。现在我试图将GradientBoostingRegressor的结果绘制为

base_regressor = GradientBoostingRegressor()
base_regressor.fit(X_train, y_train)
y_pred_base = base_regressor.predict(X_test)

print(type(X_train),type(y_train))
print('training samples ',len(X_train),len(y_train))
print(type(X_test),type(y_pred_base))
print('base samples ',len(X_test),len(y_pred_base))

plt.figure()

plt.scatter(X_train, y_train, c="k", label="training samples")
plt.plot(X_test, y_pred_base, c="g", label="n_estimators=1", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Base Regression")
plt.legend()
plt.show()

请注意X_trainy_trainX_test都是numpy数组。对于上面的代码,我得到

<class 'numpy.ndarray'> <class 'numpy.ndarray'>
training samples  74067 74067
<class 'numpy.ndarray'> <class 'numpy.ndarray'>
base samples  166693 166693

但情节没有显示,我收到错误

ValueError: x and y must be the same size

plt.scatter(X_train, y_train, c="k", label="training samples")

但是如输出中所示,xy具有相同的大小和类型。我做错了什么?

1 个答案:

答案 0 :(得分:3)

您的X_train数组是二维的,每个样本有163列。您无法针对整个X_train数组绘制y_train数组,该数组仅为1维。类似地,针对X_test的y_pred_base图。

您必须选择X阵列中的一个列进行绘图,编辑代码如下:

plt.scatter(X_train[:, 17], y_train, c="k", label="training samples")
plt.plot(X_test[:, 17], y_pred_base, c="g", label="n_estimators=1", linewidth=2)

您的因变量(X)存在于163维空间中。每个y值取决于每个维度的相应x值。简单的二维散点图或线图不能一次显示所有信息。

您可以做的一件事是找出您的y值最依赖于哪个x变量。您可以使用base_regressor.feature_importances_属性访问此项。文档here中有一个示例。然后你可以制作一个针对最重要的情节。您可以使用3D散点图在多个维度中执行此操作,或者使用类似corner.py

的更高维度执行此操作