Python: 从零开始开发多元线性回归模型

我正在尝试用Python从零开始创建一个多元线性回归模型。使用的数据集是Boston Housing Dataset,来自Sklearn。由于我的重点是模型构建,因此我没有对数据进行任何预处理步骤。然而,我使用了一个OLS模型来计算p值,并从数据中删除了3个特征。之后,我使用了一个线性回归模型来找出每个特征的权重。

现在我想在用Python创建模型之前,先在Excel中手动计算系数。为了计算每个特征的权重,我使用了以下公式:

计算特征的权重

为了计算截距,我使用了公式b0 = mean(y)-b1*mean(x1)-b2*(mean(x2)….-bn*mean(xn)

我计算得到的截距值是22.63551387(与模型的非常接近)

问题是,我计算得到的特征权重与Sklearn线性模型的相差甚远。

-0.002528644 #-- CRIM-0.001028914 #-- Zn-0.038663314 #-- CHAS-0.035026972 #-- RM-0.014275311 #-- DIS-0.004058291 #-- RAD-0.000241103 #-- TAX-0.015035534 #-- PTRATIO-0.000318376 #-- B-0.006411897 #-- LSTAT

使用第一行为测试数据来检查我的计算,我得到的是22.73167044199992,而线性回归模型预测的是30.42657776。原始值是24。

但是一旦我检查其他行,Sklearn模型的预测值变化更大,而我计算得到的权重预测的值都接近22。

我认为我在计算权重时犯了错误,但我不知道问题出在哪里?我的计算是否有误?为什么我计算得到的所有系数都非常接近0?

这是我计算系数的代码(初学者):

 x_1=[] x_2=[] for i,j in zip(data['CRIM'],y):      mean_x=data['CRIM'].mean()      mean_y=np.mean(y)      c=i-mean_x*(j-mean_y)      d=(i-mean_x)**2      x_1.append(c)      x_2.append(d) print(sum(x_1)/sum(x_2))

感谢您阅读这篇长文,我很感激。


回答:

看起来问题出在系数计算上。你提供的计算系数的公式是标量形式,用于最简单的线性回归情况,即只有一个特征x。

enter image description here

EDIT

现在看到你计算系数的代码后,问题就更清楚了。你不能使用这个方程独立计算每个特征的系数,因为每个系数都依赖于所有特征。我建议你看看这个最小二乘优化问题解的推导,简单情况在这里这里,一般情况在这里这里。作为一般建议,只要有可能就坚持使用矩阵实现,因为这会大大提高效率。

然而,在这种情况下,我们有一个10维特征向量,所以在矩阵表示法中它变成了这样。enter image description here

查看推导这里

我怀疑你在这里犯了一些计算错误,因为使用标量公式在Python中实现比矩阵等价物更繁琐和不整洁。但由于你没有分享这段代码,所以很难知道具体问题。

这是一个你如何实现它的例子:

def calc_coefficients(X,Y):    X=np.mat(X)    Y = np.mat(Y)    return np.dot((np.dot(np.transpose(X),X))**(-1),np.transpose(np.dot(Y,X)))def score_r2(y_pred,y_true):    ss_tot=np.power(y_true-y_true.mean(),2).sum()    ss_res = np.power(y_true -y_pred,2).sum()    return 1 -ss_res/ss_totX = np.ones(shape=(506,11))X[:,1:] = data.valuesB=calc_coefficients(X,y)##### Coeffcients B[:]matrix([[ 2.26053646e+01],        [-9.64973063e-02],        [ 5.28108077e-02],        [ 2.38029890e+00],        [ 3.94059598e+00],        [-1.05476566e+00],        [ 2.82595310e-01],        [-1.57226536e-02],        [-7.56519964e-01],        [ 1.02392192e-02],        [-5.70698610e-01]])#### Intercept B[0]matrix([[22.60536463]])y_pred = np.dot(np.transpose(B),np.transpose(X))##### First 5 rows predictednp.array(y_pred)[0][:5]array([30.42657776, 24.80818347, 30.69339701, 29.35761397, 28.6004966 ])##### First 5 rows Ground Truthy[:5]array([24. , 21.6, 34.7, 33.4, 36.2])### R^2 scorescore_r2(y_pred,y)0.7278959820021539

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注