线性回归图解释

时间:2019-08-30 09:41:59

标签: matplotlib scikit-learn linear-regression

我有一个显示某些数据频率的直方图。 我有两种类型的文件:Pdbs和Uniprots。每个Uniprot文件都与一定数量的Pdb相关联。因此,此直方图显示了与0个Pdb文件,1个Pdb文件,2个Pdb文件... 80个Pdb文件关联的Uniprot文件数。 Y轴为对数刻度。

histogram

我对同一数据集进行了回归,这就是结果。 regression

这是我用于回归图的代码:

# Fitting Simple Linear Regression to the Training set
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
x = np.array(x).reshape((-1, 1))
y = np.array(y)
regressor.fit(x, y)

# Predicting the Test set results
y = regressor.predict(x)

# Visualizing the Training set results
plt.scatter(x, y, color = 'red')
plt.plot(x, regressor.predict(x), color = 'blue')
plt.title('Uniprot vs Pdb')
plt.xlabel('Pdbs')
plt.ylabel('Uniprot')
plt.savefig('regression_test.png')
plt.show()

您能帮我解释回归图吗? 我可以理解,随着Pdb数量的增加,与它们关联的Uniprots将会减少。 但是,为什么它在y轴上变为负数?这正常吗?

2 个答案:

答案 0 :(得分:1)

解释此线性回归的正确方法是“此线性回归90%无意义”。实际上,正如您所指出的y值为负,这90%中的一些比无意义更糟,这是彻头彻尾的误导性。 OTOH,我们可以解释其中的10%达到良好效果,但是您必须知道要寻找的内容。

原因:在其他通常不太明显的事物中,线性回归模型的假设之一是数据或多或少是线性的。如果您的数据不是线性的,并且添加了一些非常常规的“噪声”,那么所有选择都将关闭。您的数据不是线性的。他们甚至都没有。所以所有的赌注都没了。

由于所有下注都不可行,因此检查一下线性回归模型可能需要做的事情会很有帮助。最难的事情是extrapolation,它预测y在原始x范围之外。模型在外推时的能力很好地说明了其在端点处的行为。在这里,您注意到“嘿,我的图全都是负数!”。从非常简单的意义上讲,这是因为您采用了线性模型,将其拟合到不满足“线性”假设的数据,然后试图使其对模型执行最困难的工作。模型要做的第二件事是interpolation,它使预测内部在原始x范围内。这种线性回归也不是很擅长。如果仅查看线性回归线的斜率,就可以大致了解我们的数据在增加还是减少。请注意,如果您的数据不是线性的,则即使下注也是。但是,对于大类甚至是非线性的现实世界数据,它通常都以一种并非完全没有用的方式解决。因此,这一件事,您的线性回归模型很正确。您的数据在减少,线性模型也在减少。那是我之前所说的10%。

做什么::尝试拟合更好的模型。您说您已对原始数据进行了日志转换,但看起来并没有太大帮助。通常,“转换”数据的全部目的是使其看起来线性。日志转换有助于处理exponential数据。如果您的起始数据看起来不像指数,那么对数转换可能会无济于事。由于您尝试进行density estimation,因此几乎可以肯定要使这种分布适合概率分布,对此甚至不需要进行变换就可以使数据线性化。 Here是另一个Stack Overflow答案,其中包含有关如何使Beta分布适合数据的详细信息。但是,有很多选择。

答案 1 :(得分:0)

  

您能帮我解释回归图吗?

线性回归试图在x变量和目标y变量之间建立一条线,该线以最接近可能的方式模拟“真实”值(在此处也找到图片:https://en.wikipedia.org/wiki/Linear_regression):

Can you help me interpret the regression graph?

这里的线是蓝线,原始点是黑线。目的是使所有黑点的误差(黑点到蓝线)最小化。

回归线是蓝线。这意味着您可以描述一个线性等式y = m * x + b的uniprot,其常数值为m = 0.1(示例),b = 0.2(示例)和x = Pdbs。

  

我可以理解,随着Pdb数量的增加,与它们关联的Uniprots将会减少。但是为什么它在y轴上变为负数?

这是正常现象,您可以绘制这条线直到-10000000 Pdbs或其他任何东西,这只是一个等式。不是真实的路线。

但是您的绘图中有一个错误,您是否还需要绘制原始的黑点?

y = regressor.predict(x)
plt.scatter(x, y, color = 'red')

这是错误的,您应该向其添加原始值,以从我的图形中获取绘图,例如:

y = df['Uniprot']
plt.scatter(x, y, color = 'red')

应该有助于理解它。