【问题标题】:Sorted data not plotted in correct datapoints [duplicate]排序数据未绘制在正确的数据点中[重复]
【发布时间】:2019-05-22 13:43:15
【问题描述】:

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

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

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

为了进行回归(又名插值),作为方法的一部分,我使用命令 train_test_split 从域 X 中随机选取向量/点(此处为矩阵形式,它们是行),我将跳过细节,但结果数组是空间的随机子集(空间是(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()

【问题讨论】:

  • 哇。我在解释后看到了一个概念问题,对图像空间进行排序会完全混淆来自 senoidal 数据的振荡信息。因此可能是问题所在。所以我需要以某种方式同时对X_test[:,0]y_pred_test_sine 进行排序,并使用第一个作为指导。我认为这会解决。关于如何做到这一点的任何想法。?
  • 我认为np.argsort() 会以某种方式帮助我。
  • 嗨@ImportanceOfBeingErnest,这与您标记为重复的问题不同,标记为重复的问题是关于按顺序绘制的绘图(这不是问题,我知道已经),这里的问题是错误的排序假设,因此给出了错误的数据点。虽然两者都是相关的(因为都基于 matplotlib),但它们并不相同。但是,是的。既然我发现了问题,我认为应该把标题改成更有意义的东西。
  • 副本向您展示了解决问题的准确方法,即根据排序后的 x 值对 y 值进行排序。

标签: python matplotlib scikit-learn


【解决方案1】:

正如您在 cmets 中提到的,通过对 y 进行排序,您会按位置破坏 Xy 之间的连接。而是使用 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]

这将为您提供所需的图表

【讨论】:

  • 是的。已经在这里了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2021-12-04
  • 2020-06-12
  • 1970-01-01
相关资源
最近更新 更多