使用线性回归求解两个变量方程

Posted

技术标签:

【中文标题】使用线性回归求解两个变量方程【英文标题】:Solving for Two Variable Equations using Linear Regression 【发布时间】:2020-10-06 14:23:59 【问题描述】:

我有一个使用多个方程求解xy 的问题。我有不同的数据点(在 # 帧中),如下所示:

第 1 组:1003, 145, 1344, 66, 171, 962

第 2 组:602, 140, 390, 1955, 289, 90

我的总小时数如下:

总小时数:1999, 341, 1151, 2605, 568, 864

我已经在不同的方程式中设置了这些,如下所示:

1003x + 602y = 1999 145x + 140y = 341 等等。

我想找到xy 的最佳值,使所有方程尽可能接近真实。


我尝试在 Python 中进行线性回归来提取数据,但我不确定我是否走在正确的道路上。

这是我的 Python 代码:

dataset = pd.read_csv(r"C:\Users\path\to\.csv")

X = dataset[['Group 1 Frames', 'Group 2 Frames']]
y = dataset['Total Hours']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.25, random_state=0)

regressor = LinearRegression()
regressor.fit(X_train, y_train)

coeff_df = pd.DataFrame(regressor.coef_, X.columns, columns=['Coefficient'])
coeff_df

现在这给了我两个不同的值,1.30071.2314。在计算了平均绝对误差和均方误差后,结果似乎得出结论,这些数字不准确且无法使用。

有没有办法更准确地计算所需的xy 值?


我对错误的看法:

    我的方法(我对 python 和这样的数据分析非常陌生,所以我在这个方面下注很大) 缺少数据点(我可以收集更多) xyTotal Hours 关系不大,因此错误率很高

【问题讨论】:

您的方程式中允许有一个常数,是吗?即g1*x + g2*y + C = h_t. 我是否可以通过添加一列 0 或类似的东西来解释一个常数? LinearRegression() 将计算截距。我在my answer 中包含了计算出的截距(常数)。 【参考方案1】:

我已经尝试过您的示例。以下是我的观察和建议。

1) 您没有根据足够的数据训练模型。 => 我尝试向您的 DF 插入几个随机数据点,分数从 -27.xx 变为 -0.10。这表明您需要更多的训练数据。

2) 在实际使用 .fit 以适应 regressor 中的数据之前,使用缩放器(如 StandardScaler)缩放数据点。这将缩放您的数据点,使它们的平均值为 0,标准差为 1。

在完成上述 1 和 2 之后,我得到了 -0.10xx 的分数(比最初的 -27.xx 好)和 282.974346759.690447 的系数分别为 group1 和 group 2

这是我尝试过的代码供您参考:

(这包含我随机插入的虚拟数据(每组中的最后 4 个数据点))

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import matplotlib.pyplot as plt

g1=np.array([1003, 145, 1344, 66, 171, 962,100,200,300,400])
g2=np.array([602, 140, 390, 1955, 289, 90,80,170,245,380])

th=np.array([1999, 341, 1151, 2605, 568, 864,1000,300,184,411])

dataset = pd.DataFrame('Group 1 Frames':g1,'Group 2 Frames':g2,'Total Hours':th)

X = dataset[['Group 1 Frames', 'Group 2 Frames']]
# print(X)
y = dataset['Total Hours']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.25, random_state=0)

pipeline=Pipeline([('norm', StandardScaler()), ('linreg', LinearRegression())])

pipeline.fit(X_train, y_train)

print(pipeline.score(X_test,y_test))

y_pred=pipeline.predict(X_test)

fig,ax=plt.subplots()
ax.plot(X_test,y_test,label='Actual')
ax.plot(X_test,y_pred,label='Predicted')

ax.legend()
plt.show()

coeff_df = pd.DataFrame(pipeline['linreg'].coef_, X.columns, columns=['Coefficient'])
print(coeff_df)

在这里,我还绘制了预测数据与实际测试数据

【讨论】:

我花了一些时间研究 Scalers 并运行您的代码。我有一个问题问你。 1. pipeline的linear regression coeff_regressor.coeff_有什么不同?我来自regressor.coeff_ 的系数可用并且接近预期结果(1.3xx 和 1.2xx,而来自管道的系数要大得多。我认为这些数字因您所做的缩放而不同? 两个回归系数相同,不同之处在于缩放。流水线只是将所有步骤捆绑在一起,因此您不必单独安装每个步骤。缩放只是缩放所有数据,使它们都具有“0”的平均值和“1”的标准。这是一个解释 StandardScaler 的 SO 问题。 ***.com/questions/40758562/… 我周末没有太多时间阅读这篇文章,但我想走的这条路似乎是正确的。感谢您的帮助@Zeek。我理解缩放的概念,但我将不得不更多地阅读它并获得更多的实践,以了解系数如何缩放以及如何将它们应用到我的示例中。【参考方案2】:

向the answer by @Zeek大举借用,

import pandas as pd
import numpy as np

g1=np.array([1003, 145, 1344, 66, 171, 962])
g2=np.array([602, 140, 390, 1955, 289, 90])
th=np.array([1999, 341, 1151, 2605, 568, 864])
dataset = pd.DataFrame('Group 1 Frames':g1,'Group 2 Frames':g2,'Total Hours':th)
X = dataset[['Group 1 Frames', 'Group 2 Frames']]
y = dataset['Total Hours']

from sklearn import linear_model

reg = linear_model.LinearRegression()
reg.fit(X,y)

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig=plt.figure()
ax=fig.add_subplot(111,projection='3d')
ax.scatter3D(X['Group 1 Frames'],X['Group 2 Frames'],y,c='blue')
ax.scatter3D(X['Group 1 Frames'],X['Group 2 Frames'],reg.predict(X),c='red')

ax.set_xlabel('Group 1 Frames')
ax.set_ylabel('Group 2 Frames')
ax.set_zlabel('Total Hours')

plt.show()

给予:

In [2]: reg.coef_                                                                                                                                         
Out[2]: array([0.65638179, 1.29127836])

In [3]: reg.intercept_                                                                                                                                    
Out[3]: 104.95400059973235

和:

...除了第一个和第三个数据样本之外,这还不错。根据您的预测要求,这可能不够好,也可能不够好。也许您的某些数据需要一些“按摩”?

【讨论】:

以上是关于使用线性回归求解两个变量方程的主要内容,如果未能解决你的问题,请参考以下文章

线性回归-API

一元线性回归模型和一元线性回归方程之间的区别

线性回归算法

机器学习之回归模型-梯度下降法求解线性回归

多元线性回归

矩阵法求解线性回归