线性回归
线性回归概述
回归与分类
- 回归:Y变量为连续数值型,如: 房价,人数,降雨量
- 分类:Y变量为类别型【离散型】,如: 颜色类别,电脑品牌,有无信誉
监督学习八大类算法,只有线性回归的y是连续类型的,逻辑回归的y也是离散类型的
线性回归概述
-
线性回归是利用线性的方法,模拟因变量与一个或多个自变量之间的关系;
-
对于模型而言,自变量是输入值,因变量是模型基于自变量的输出值,适用于x和y满足线性关系的数据类型的应用场景。
-
监督学习问题
- 无y 非监督
- 有y 监督,非监督
- y如果是连续类型的,线性回归,[分类算法]
- y如果是离散类型的,只能用分类算法
思考点: 为什么y是连续类型的,可以用分类算法?
可以在准备模型之前,将y离散化,将数据划分为等级或阶段,离散化会损失信息,但可以提高性能
线性回归案例
- 我们希望根据房子的居住尺寸来预测房价并得到房价与尺寸之间的线性关系。
- 我们希望获得居住尺寸和房价两个变量之间的关系,这是个回归问题。由于求取的线性模型,所以得到的是个线性回归问题
案例分析
- m – 数据集中的样本数量
- x – 输入数据
- y – 目标数据
- (𝑥𝑖, 𝑦𝑖) – 数据集中第𝑖个样本
- 散点图体现了数据对之间的相关性
- 由于散点图上的点几乎呈直线分布,则相关性为线性
- 两个变量之间的相关性的几种常见类型:正相关、负相关、不相关
- 最佳拟合线公式:y = a + bx
- 在散点图上画一条穿过这些点的直线,如果不能,那这条线能最好能接近所有数据点
- 实际值y与对应的y’的估值的差距最小的线
(y-y')
的绝对值之和最小 或(y-y')
的平方之和 最小
构建模型
- 开始的时候只有
xi , yi
- 训练过程
xi , yi
是知道的, 希望找到ki
和b
,得出yi=ki*xi+b
- 测试过程
ki,b
已经找到了,映射关系yi=ki*xi+b
也已经有了.虽然已经知道了yi'
,但是假装不知道,用ki*xi+b
求出y'
,yi'
与yi
的差距就是误差(也就是R方,这个值越大越好), 只是我们要用的差距是误差的平方之和
对之前的线性模型做如下处理:
令 𝑤 = 𝜃1, 𝑏 = 𝜃2
其中,𝑤为权重(weight),𝑏为偏差(bias),在线性回归模型中𝑤和𝑏分别形象的表示为直线的斜率和截距。
w也是斜率,b也叫截距
针对这个数据集我们需要选择合适的𝑤和𝑏参数使得对于训练样本𝑥, 𝑦 我们的预测结果ℎ(𝑥)可以与𝑦接近。即对于单个样本:𝑚𝑖𝑛𝑖𝑚𝑖𝑧𝑒 (ℎ 𝑥𝑖 − 𝑦𝑖)2 (y’与y之间的差的平方之和最小)
对于所有样本:
其中m为样本数
在求偏导
(就是斜率)的时候,需要误差的平方之和/2
- 为什么要/2,因为2次方求偏导后有个常向量2, /2之后就可以与常向量2相抵消
- 这么记着就可以了,数学太差了,理解不了
- 为什么要求偏导,因为后面有梯度下降
【均方误差】其实计算的是预测点到实际点之间的距离均值:
实际上没有开根号,是除以2m
线性回归的要点总结:
- 模型 h(x) = wx + b
- 优化参数 w,b
- Cost function
- 目标 𝑚𝑖𝑛𝑖𝑚𝑖𝑧𝑒 𝐽(𝑤, 𝑏)
线性回归算法原理
最小二乘法
y=a+bx
梯度下降法
在山上,想以最快的速度下山,在步长不变的情况下,选择坡度最陡(即路程最短)的路线可以最快速下山
每走一步,都要计算哪个是下一步要走的最陡的方向,求最陡的方向其实就是在求斜率,求偏导
梯度是函数变化增加最快的地方,沿着梯度向量相反的方向,函数减小最快。
-α是指学习率,类似于步长,-α大,很容易错过最优值,-α小,求的步数就会很多
w = w - w这一步的偏导 得到的w就是下一步
相关系数
相关系数r是介于-1和1之间的一个数,描述了各个数据点与直线的偏离程度,通过它可以度量回归线与数
据的拟合度
相关系数 : dataframe.corr()
数据在入模之前可以先算相关性,可以根据实际选相关性大一点的
线性回归–过拟合
过拟合问题:如果我们有特别多的特征, 我们的假设函数曲线可以对原始数据拟合得非常好, 但丧失了一
般性,从而导致对新给的待预测样本,预测效果差。
解决线 性回归过拟合的方法
-
分析数据,重新做数据清冼,将征工程
-
扩充数据集,收集更多数据
-
减少特征数量
-
采用正则化方法
-
L1正则化(Lasso回归):稀疏化模型参数
-
L2正则化(Rideg/岭回归):缩小模型参数
-
L1+L2正则化(弹性网络/ElasticNet):
-
当计算梯度下降的过程中,误差值会越来越小,但小尾巴会越来越大,最终想要的是误差值+小尾巴值的最小和,而非单纯的误差值最小
L1 -Lasso回归:将𝜆惩罚项添加到系数大小的绝对值𝑚。𝜆是一个超参数,这意味着它的值是自由定义的
L2 -岭回归:将𝜆惩罚项添加到系数大小的平方𝑚。𝜆是一个超参数,这意味着它的值是自由定义的
1.分析数据,增加特征淮度
2.增加多项式特征阶数
3.减小正则项的超参系数值
求导函数
一元线性回归&多元线性回归
一元线性回归: 𝑦: ℎ(𝑥) = 𝑤𝑥 + 𝑏
多元线性回归:𝑦: ℎ (𝑥) = 𝑤1𝑥1 + 𝑤2𝑥2 + 𝑤3𝑥3 + 𝑤4𝑥4 + 𝑏
对于更多自变量类型的线性回归,增加𝑥𝑖的同时也需要对应增加权重𝑤𝑖
一元线性回归是一条直线,多元线性回归是一个面,希望尽可能多的点落在这个面上
n元线性回归:
线性回归模型分为一元线性回归与多元线性回归:区别在于自变量的个数
单变量线性回归:输入变量只有一维属性。
多变量线性回归:输入变量为多维特征属性
线性回归优缺点
优点:
回归分析法在分析多因素模型时,更加简单和方便
运用回归模型,只要采用的模型和数据相同,通过标准的统计方法可以计算出唯一的结果
回归分析可以准确地计量各个因素之间的相关程度与回归拟合程度的高低,提高预测方程式的效果
可解释性强
缺点:
在回归分析中,有时候选用何种因子和该因子采用何种表达式只是一种推测,这影响了因子的多样性和某些因子的不可测性,使得回归分析在某些 情况下受到限制
需要严格的假设
需处理异常值,对异常值很敏感,对输入数据差异也很敏感
线性回归代码实现
-
导包
不要将LinearRegression 取别名 为lr(大小写都不要)
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import pandas as pd
- 准备数据
# 波士顿房价数据集
boston = datasets.load_boston()
查看数据
boston.keys()
dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename', 'data_module'])
x = boston['data'] #固定写法,['data']就赋值给x
y = boston['target'] #固定写法,['target']就赋值给x
col = boston['feature_names']
data = pd.DataFrame(x, columns=col) # 将x,y组合成一个DataFrame数据集
data['y'] = y
==重点关注 corr() ===
data.corr() # corr算相关性
dataframe.corr()
y_corr = data.corr()['y'] # 算y这列的相关性
y_corr # 得到y的相关性 值
- 进行训练集和测试集划分
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42) #random_state在不同的阶段数值是不一样,具体的百度,这里的42就是默认值
- 构建训练模型
linear = LinearRegression()
linear.fit(X_train, y_train)
- 预测
y_p = linear.predict(X_test)
- 准确度
linear.score(X_test, y_test)
模型参数
LinearRegression(
# 是否计算intercept项,即β0
fit_intercept=True,
# 是否进行中心化【(x-x均值)/ ||x|| 】 ||x||:二范数 对应差的平方值和开根号
normalize=False,
# 下边参数不用管
copy_X=True,
n_jobs=None,
positive=False)
经验 : 数据范围波动特别大的数据,建议去中心化
常用属性和方法
coef_:回归系数(Wi)
intercept_:截距(b)
fit(X, y):进行训练
predict(X):进行预测
score(X, y):计算R 2 R^2R
扩展小知识
当数据的单位问题造成数据差异特别大的时候,可以针对列进行01归化(数据归一化): (xi-x_min)/(x_max-x_min),所有值都会被映射到0-1的范围
alize=False,
下边参数不用管
copy_X=True,
n_jobs=None,
positive=False)
<font color='blue'>经验 : 数据范围波动特别大的数据,建议去中心化</font>
#### 常用属性和方法
```python
coef_:回归系数(Wi)
intercept_:截距(b)
fit(X, y):进行训练
predict(X):进行预测
score(X, y):计算R 2 R^2R
扩展小知识
当数据的单位问题造成数据差异特别大的时候,可以针对列进行01归化(数据归一化): (xi-x_min)/(x_max-x_min),所有值都会被映射到0-1的范围