开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
回归模型
回归问题与scikt—learn 回归模型介绍
父母的身高与子女身高的回归。遗传的身高向平均数反向的回归
不讨论因果关系,只讨论内部数据的联系,由这个现象推出那个现象。
告诉我自变量的值,我可以预测因变量的值。
- 因变量:需要关注或预测的变量
- 自变量:用来解释因变量变化的变量
广告投入与销量之间的关系
| 类 | 说明 |
|---|---|
| linear_model.LinearRegression | 线性回归 |
| linear_model.Ridge | 岭回归 |
| linear_model.Lasso | LASSO |
| linear_model.ElasticNet | 弹性网络 |
| linear_model.RANSACRegression | RANSA随机采样 |
| linear_model.BayesianRidge | 贝叶斯回归 |
回归种类汇总
岭回归:
岭回归的思路:在最小二乘法的目标函数上加上一个对w的惩罚函数
λ||w||22
线性回归的目标函数:
岭回归的目标函数变为:
直接对w求导并令梯度等于0:
岭迹分析(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尖尖为模型估计值