首页 > 解决方案 > 排序数据未绘制在正确的数据点中

问题描述

这似乎是一个 sklearn 问题,但它不是(至少不是直接的)。我只是在这里使用 sklearn 来获取数据点,因为这将能够完全重现我的问题。一些背景

我用来sklearn在一个小区间内预测一些点。X首先,我用二维向量(矩阵中的行)构建了一个合成域。

y= x_1 + x_2 + noise然后我使用这些行和一些噪声计算一些图像点x=(x_1, x_2),以尝试复制一些真实数据。

X为了进行回归(也称为插值),作为方法的一部分,我使用命令从域中随机选择向量/点(这里以矩阵形式它们是行)train_test_split,我将跳过细节,但结果数组是随机子集空间(空间是(x_1, x_2, y)(x_1, x_2)紧凑的支持。

然后我使用 sklearn 进行回归,到目前为止一切顺利。一切都按预期工作。我参与y_pred_test_sine了预测,它们运行良好。但是由于该方法从域中选择随机点作为测试集,因此预测完全被打乱了。

问题来了……

由于我想将其绘制为连续函数(由 matplotlib 插值,这没关系,稍后我将使用自己的插值测试)。我做两件事:

  1. 使用来自测试的排序预测图像点创建一个新向量X_test_sort
  2. 使用来自测试的排序域点创建一个新向量。y_pred_test_sine_sort

这些(1)和(2)匹配(至少应该)预测模型中的每个数据点(这些仅排序以便使用plt.plot线条轻松绘制,而不是标记)

然后我绘制它们并且它们不匹配(完全)我的解决方案空间中的预期点。

在此处输入图像描述

在这里我们可以看到全黑线(排序后的预测线)不跟随橙色点(预测点)。这根本不是我所期望的。

这里按照代码重现问题。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

plt.close('all')

rng = np.random.RandomState(42)
regressor = LinearRegression()

# Synthetic dataset
x_1 = np.linspace(-3, 3, 300)
x_2 = np.sin(4*x_1)
noise = rng.uniform(size=len(x_1))
y = x_1 + x_2 + noise
X = np.vstack((x_1, x_2)).T

# Data splitting
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

# Regression 2 features data
fit_sine = regressor.fit(X_train, y_train)
y_pred_test_sine = regressor.predict(X_test)

# Here I have sorted the X values and its image points Y = f(x)
# Why those are not correctly placed over the 'prediction' points
X_test_sort = np.sort(X_test[:,0].ravel())
y_pred_test_sine_sort = np.sort(y_pred_test_sine.ravel())

# DO THE PLOTTING
plt.plot(X_test[:,0], y_test, 'o', alpha=.5, label='data')
plt.plot(X_test[:,0], y_pred_test_sine, 'o', alpha=.5, label='prediction')
plt.plot(X_test_sort, y_pred_test_sine_sort, 'k', label='prediction line')
plt.plot(x, np.sin(4*x)+x+.5, 'k:', alpha=0.3, label='trend')
plt.legend()

标签: pythonmatplotlibscikit-learn

解决方案


正如您在评论中提到的那样,通过 sort y,您破坏了按地点之间X的联系。y相反,使用 argsort 来获取 的排序顺序X,然后用它对 X_test 和 y 进行排序:

argsort_X_test = np.argsort((X_test[:,0].ravel()))
X_test_sort = X_test[argsort_X_test, 0]
y_pred_test_sine_sort = y_pred_test_sine[argsort_X_test]

这将为您提供所需的图表

在此处输入图像描述


推荐阅读