回归模型

145 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

回归模型

回归问题与scikt—learn 回归模型介绍

父母的身高与子女身高的回归。遗传的身高向平均数反向的回归

不讨论因果关系,只讨论内部数据的联系,由这个现象推出那个现象。

告诉我自变量的值,我可以预测因变量的值。

  • 因变量:需要关注或预测的变量
  • 自变量:用来解释因变量变化的变量

广告投入与销量之间的关系

说明
linear_model.LinearRegression线性回归
linear_model.Ridge岭回归
linear_model.LassoLASSO
linear_model.ElasticNet弹性网络
linear_model.RANSACRegressionRANSA随机采样
linear_model.BayesianRidge贝叶斯回归

回归种类汇总

岭回归:

岭回归的思路:在最小二乘法的目标函数上加上一个对w的惩罚函数

λ||w||22

线性回归的目标函数:image.png

岭回归的目标函数变为:

image.png

直接对w求导并令梯度等于0:

image.png

岭迹分析(logic)

当不断增大正则化参数λ,估计参数

from sklearn.linear_model import Ridge
rid = Ridge(alpha=20)
rid.fit(x_train,y_train)
print("训练集的决定系数为:%s"%round(rid.score(x_train,y_train),4))
print("测试集的决定系数为:%s"%round(rid.score(x_test,y_test),4))

LASSO 回归

from sklearn.linear_model import Lasso
las = Lasso(alpha=0.1)
las.fit(x_train,y_train)
print("训练集的决定系数为:%s"%round(lar.score(x_train,y_train),4))
print("测试集的决定系数为:%s"%round(lar.score(x_test,y_test),4))

弹性网络回归

from sklearn.linear_model import ElasticNet
EN = ElasticNet(alpha=1,lr_ratio = 0.5)
EN.fit(X_train,y_train)
print("训练集的决定系数为:%s"%round(EN.score(x_train,y_train),4))
print("测试集的决定系数为:%s"%round(EN.score(x_test,y_test),4))

通用方法及属性

方法功能
fit(X,y)拟合模型
predict(x)使用美学预测
score(X,y)返回预测的决定系数
#对数据进行编码
data['sex']=data['sex'].map({'male':1,'female':0}).astype(int)
data['smoker']=data['smoker'].map({'yes':1,'no':0}).astype(int)
new_data = pd.get_dummies(data=data,columns = ['region'],prefix='region')

将数据划分为训练集(80%)和测试集(20%)两部分

#这里是随机的取,但是计算机没有完美的随机,random_state=1 让随机变成伪随机,每次取出来的值一样
# 顺序要记住,先x的训练集,测试集,再到y的训练集,测试集
x_train,x_test,y_train,y_test = train_test_split(X,Y,test_size=0.2,random_state=1)
print('训练集大小:%s'%len(x_train))
print('测试集大小:%s'%len(x_test))

训练模型

# 一元线性回归建立训练模型

线性回归

基本假设 y = w0 + w1x + ɛ

ɛ:损失函数

构建线性回归模型

from sklearn.line_model import LinearRegression
lr = LinesrRegression()
lr.fit(x_train,y_train)
pd.Series(data=np.round(lr.cofe_,2),index=X.columns)

评估模型的性能

pred_train = lr.predict(x_train)
pred_test = lr.predict(x_test)
print("训练集的决定系数为:%s"%round(lr.score(x_train,y_train),4))
print("测试集的决定系数为:%s"%round(lr.score(x_test,y_test),4))

实际数据可能不是线性的

使用 R2 等指标进行模型诊断

SStot = ∑(yi - y一把)2 总平方和

SSres = ∑ (yi -yi一把)2 残差平方和

R2 (y,y一把) = 1 -SSres/SStot

其中yi 为真实值,y一把为真实值的平均值,y尖尖为模型估计值