线性回归入门笔记

要求:
  • 1.模型建立:线性回归原理、线性回归模型
  • 2.学习策略:线性回归损失函数、代价函数、目标函数
  • 3.算法求解:梯度下降法、牛顿法、拟牛顿法等
  • 4.线性回归的评估指标
  • 5.sklearn参数详解
练习部分
  • 1.基于线性回归的房价预测问题
  • 2.利用sklearn解决回归问题
  • 3.sklearn.linear_model.LinearRegression
完成进度:
Day1Day3
学习写CSDN学习代码
阅读Task1 Linear_regression修改代码
进行理论性总结完成blog
理论总结:
  1. 线性回归的原理
    数据集为 (xi,yi),其中xi=[xi1,…,xid],其中d表示维度
    x与y的关系为: y = ∑ i = 0 d θ i ⋅ x i y=\sum_{i=0}^d \theta_i·x_i y=i=0dθixi
    均方误差度量性能: y = ∑ i = 1 n ( h θ ( x i ) − y ) 2 2 y=\frac{\sum_{i=1}^n (h_\theta(x_i)-y)^2}{2} y=2i=1n(hθ(xi)y)2(验证:极大似然估计)
  2. 线性回归损失函数、代价函数、目标函数
损失函数代价函数目标函数
度量单样本预测的错误程度,损失函数值越小,模型就越好度量全部样本集的平均误差代价函数和正则化函数,最终要优化的函数
0-1损失函数、平方损失函数、绝对损失函数、对数损失函数均方误差、均方根误差、平均绝对误差结构化风险最小化,防止过拟合
  1. 优化方法
    3.1. 梯度下降法 (缺点:非凸函数,有可能找到的局部最优值)
    3.1.1 批梯度下降法 θ = θ + α ∑ i = 1 n ( y i − f θ ( x ) i ) x i \theta=\theta+\alpha\sum_{i=1}^n(y^i-f_\theta(x)^i)x^i θ=θ+αi=1n(yifθ(x)i)xi
    3.1.2 随机梯度下降法 θ = θ + α ( y i − f θ ( x ) i ) x i \theta=\theta+\alpha(y^i-f_\theta(x)^i)x^i θ=θ+α(yifθ(x)i)xi
    – 优点:数据点很多时,运行效率更高。
    – 缺点:每次只针对一个样本更新参数,未必找到最快路径达到最优值,有时候会出现参数在最小值附近徘徊而不立即收敛的情况。
    – 数据量大的时候随机梯度下降法优于批量梯度下降法。
    3.2 最小二乘矩阵求解 θ = ( X T X ) − 1 X T Y \theta=(X^TX)^{-1}X^TY θ=(XTX)1XTY
    3.3 牛顿法 θ : = θ − l ′ ( θ ) l ′ ′ ( θ ) \theta:=\theta-\frac{l'(\theta)}{l''(\theta)} θ:=θl(θ)l(θ)
    –优点:收敛速度快
    –缺点:计算复杂,维度多的时候计算成本高
    3.4 拟牛顿法
  2. 线性回归的评估指标
均方误差MSE均方根RMSE平均绝对MAER2
y = ∑ i = 1 m ( y ′ ( i ) − y ( i ) ) 2 m y=\frac{\sum_{i=1}^m(y'^{(i)}-y^{(i)})^2}{m} y=mi=1m(y(i)y(i))2 M S E \sqrt{MSE} MSE ∑ i = 1 m ( y ′ ( i ) − y ( i ) ) m \frac{\sum_{i=1}^m(y'^{(i)}-y^{(i)})}{m} mi=1m(y(i)y(i)) 1 − M S E V A R 1-\frac{MSE}{VAR} 1VARMSE
  • 最常用的指标是 𝑅2 ,可以避免量纲不一致问题;𝑅2 越接近1,表示可解释力度越大,模型拟合的效果越好。
  1. sklearn参数详解
    链接:API详解:sklearn.linear_model.LinearRegression.
代码详解

环境:python2.7

#生成数据
import numpy as np
#生成随机数
np.random.seed(1234)
 #每次运行代码时设置相同的seed,每次生成的随机数相同,如果不设置seed,则每次生成的随机数会不一样
x = np.random.rand(500,3) 
#生成的x是500行3列的矩阵
#构建映射关系,模拟真实的数据待预测值,映射关系为y = 4.2 + 5.7*x1 + 10.8*x2,可自行设置值进行尝试
y = x.dot(np.array([4.2,5.7,10.8]))
print x
print y

结果:
x的值为:
x的值
y的值为:
y的值

#调用sklearn的线性回归模型训练数据
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
%matplotlib inline
# 调用模型
lr = LinearRegression(fit_intercept=True)
# 训练模型
lr.fit(x,y)
print("估计的参数值为:%s" %(lr.coef_))
# 计算R平方
print('R2:%s' %(lr.score(x,y)))
# 任意设定变量,预测目标值
x_test = np.array([2,4,5]).reshape(1,-1)#重塑x值的维度以便矩阵运算
y_hat = lr.predict(x_test)
print("预测值为: %s" %(y_hat))

结果为:

#最小二乘法的矩阵求解
class LR_LS():
    def __init__(self):
        self.w = None      
    def fit(self, X, y):
        # 最小二乘法矩阵求解
        self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
        #np.linalg.inv为矩阵求逆变换
        #np.dot返回的两个数组的点积
    def predict(self, X):
        # 用已经拟合的参数值预测新自变量
        y_pred = X.dot(self.w)
        return y_pred

if __name__ == "__main__":
    lr_ls = LR_LS()
    lr_ls.fit(x,y)
    print("估计的参数值:%s" %(lr_ls.w))
    x_test = np.array([2,4,5]).reshape(1,-1)
    print("预测值为: %s" %(lr_ls.predict(x_test)))
    print('R2:%s' %(lr.score(x,y)))

结果为:
在这里插入图片描述

#梯度下降法求解
class LR_GD():
    def __init__(self):
        self.w = None     
    def fit(self,X,y,alpha=0.002,loss = 1e-10): # 设定步长为0.002,判断是否收敛的条件为1e-10
        y = y.reshape(-1,1) #重塑y值的维度以便矩阵运算
        [m,d] = np.shape(X) #自变量的维度
        self.w = np.zeros((d)) #将参数的初始值定为0
        tol = 1e5
        while tol > loss:
            h_f = X.dot(self.w).reshape(-1,1) 
            theta = self.w + alpha*np.mean(X*(y - h_f),axis=0) #计算迭代的参数值
            tol = np.sum(np.abs(theta - self.w))
            self.w = theta
    def predict(self, X):
        # 用已经拟合的参数值预测新自变量
        y_pred = X.dot(self.w)
        return y_pred  

if __name__ == "__main__":
    lr_gd = LR_GD()
    lr_gd.fit(x,y)
    print("估计的参数值为:%s" %(lr_gd.w))
    x_test = np.array([2,4,5]).reshape(1,-1)
    print("预测值为:%s" %(lr_gd.predict(x_test)))

结果为:
在这里插入图片描述
源码来源:datawhale

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值