【发布时间】:2023-04-03 13:45:01
【问题描述】:
我正在尝试在 python 中从头开始创建一个多元线性回归模型。使用的数据集:Boston Housing Dataset
来自Sklearn
。由于我的重点是模型构建,因此我没有对数据执行任何预处理步骤。但是,我使用 OLS 模型来计算 p 值并从数据中删除了 3 个特征。之后,我使用线性回归模型找出每个特征的权重。
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
X=load_boston()
data=pd.DataFrame(X.data,columns=X.feature_names)
y=X.target
data.head()
#dropping three features
data=data.drop(['INDUS','NOX','AGE'],axis=1)
#new shape of the data (506,10) not including the target variable
#Passed the whole dataset to Linear Regression Model
model_lr=LinearRegression()
model_lr.fit(data,y)
model_lr.score(data,y)
0.7278959820021539
model_lr.intercept_
22.60536462807957 #----- intercept value
model_lr.coef_
array([-0.09649731, 0.05281081, 2.3802989 , 3.94059598, -1.05476566,
0.28259531, -0.01572265, -0.75651996, 0.01023922, -0.57069861]) #--- coefficients
现在我想在用 python 创建模型之前在 excel 中手动计算系数。为了计算每个特征的权重,我使用了这个公式:
Calculating the Weights of the Features
为了计算截距,我使用了公式
b0 = 均值(y)-b1*均值(x1)-b2*(均值(x2)....-bn*均值(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))
感谢您阅读这篇长文,不胜感激。
【问题讨论】:
-
我们需要看看你是如何计算系数的(代码)
-
我认为 scikit-learn 会以不同的方式引入额外的偏见,如果
fit_intercept=True
.可以阅读代码here
标签:
python
machine-learning
scikit-learn
linear-regression
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python:从零开始开发多元线性回归模型 - Python技术站