使用线性回归求解两个变量方程
Posted
技术标签:
【中文标题】使用线性回归求解两个变量方程【英文标题】:Solving for Two Variable Equations using Linear Regression 【发布时间】:2020-10-06 14:23:59 【问题描述】:我有一个使用多个方程求解x
和y
的问题。我有不同的数据点(在 # 帧中),如下所示:
第 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
等等。
我想找到x
和y
的最佳值,使所有方程尽可能接近真实。
我尝试在 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.3007
和 1.2314
。在计算了平均绝对误差和均方误差后,结果似乎得出结论,这些数字不准确且无法使用。
有没有办法更准确地计算所需的x
和y
值?
我对错误的看法:
-
我的方法(我对 python 和这样的数据分析非常陌生,所以我在这个方面下注很大)
缺少数据点(我可以收集更多)
x
和 y
与 Total 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.974346
和 759.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
和:
...除了第一个和第三个数据样本之外,这还不错。根据您的预测要求,这可能不够好,也可能不够好。也许您的某些数据需要一些“按摩”?
【讨论】:
以上是关于使用线性回归求解两个变量方程的主要内容,如果未能解决你的问题,请参考以下文章