线性回归
【理解】举个栗子
倘使有了身高和体重数据,来了播仔的身高,你能预测播仔体重吗?
这是一个回归题目,该如何求解呢?
**思路**:先从已知身高X和体重Y中找规律,再预测
•数学题目:用一条线来拟称身高和体重之间的关系,再对新数据进行预测
方程 Y = kX + b
k160 + b = 56.3 -- (1)
k166 + b = 60.6 –- (2)
。。。。
k: 斜率 b:截距
若:y = 0.9 x + (-93)
0.9*176 +(-93)= ?
【理解】线性回归
线性回归(Linear regression)是使用 **回归方程(函数)** 对 **一个或多个自变量(特征值)和因变量(目标值)之间** 关系进行建模的一种分析方式。
注意事项:
1 为什么叫线性模型?因为求解的w,都是w的零次幂(常数项)所以叫成线性模型
2 在线性回归中,从数据中获取的规律实在就是学习权重系数w
3 某一个权重值w越大,说明这个权重的数据对房子价格影响越大
【知道】线性回归分类
- 一元线性回归
y = kx +b
目标值只与一个因变量有关系
- 多元线性回归
目标值只与多个因变量有关系
【知道】应用场景
【实操】线性回归API的应用
预测播仔身高
已知数据:
需求:播仔身高是176,请预测体重?
通过线性回归API可快速的找到一条红色直线,是怎么求解的呢?
【掌握】损失函数
必要设置一个评判标准
**偏差概念**:用预测值y – 真实值y就是偏差
**损失函数**:权衡每个样本预测值与真实值效果的函数
“红色直线能更好的拟合全部点”也就是偏差最小,偏差和最小
损失函数数学如何表达呢?又如何求损失函数的最小值呢?
当损失函数取最小值时,得到k就是最优解
想求一条直线更好的拟合全部点 y = kx + b
- 引入损失函数(权衡预测值和真实值效果) Loss(k, b)
- 通过一个优化方法,求损失函数最小值,得到K最优解
回归的损失函数:
- *均方偏差* *(*Mean-Square Error, MSE*)*
- *平均绝对偏差* *(**Mean Absolute Error* *,* *MAE**)*
导数和矩阵
常见的数据表述
- 为什么要学习标量、向量、矩阵、张量?
- 因机器学习、深度学习中经常用,不要因是数学就害怕
- 宗旨:用到就学什么,不要盲目的展开、大篇幅学数学
- 标量scalar :一个独立存在的数,只有大小没有方向
- 向量vector :向量指一列顺序排列的元素。默认是列向量
- 矩阵matrix :二维数组
- 张量Tensor :多维数组,张量是基于向量和矩阵的推广
导数
当函数y=f(x)的自变量x在一点$x_0$上产生一个增量Δx时,函数输出值的增量Δy与自变量增量Δx的比值在Δx趋于0时的极限a如果存在,a即为在$x_0$处的导数,记作$f^\prime(x_0)$或df($x_0$)/dx。
导数是函数的局部性子。一个函数在某一点的导数形貌了这个函数在这一点附近的变化率。
函数在某一点的导数就是该函数所代表的曲线在这一点上的切线斜率
常见函数的导数:
复合函数求导:g(h)是外函数 h(x)是内函数。先对外函数求导,再对内函数求导
导数求极值:
导数为0的位置是函数的极值点
偏导
向量
向量运算:
矩阵
一元线性回归的解析解
多元线性回归的解析解-正规方程法
梯度下降算法
梯度下降算法头脑
什么是梯度下降法
• 求解函数极值还有更通用的方法就是梯度下降法。顾名思义:沿着梯度下降的方向求解极小值 • 举个例子:坡度最陡下山法
- 输入:初始化位置S;每步间隔为a 。输出:从位置S到达山底
- 步骤1:令初始化位置为山的恣意位置S
- 步骤2:在当前位置环视四周,如果四周都比S高返回S;否则执行步骤3
- 步骤3: 在当前位置环视四周,探求坡度最陡的方向,令其为x方向
- 步骤4:沿着x方向往下走,长度为a,到达新的位置S‘
- 步骤5:在S‘位置环视四周,如果四周都比S‘高,则返回S‘。否则转到步骤3
小结:通过循环迭代的方法不断更新位置S (相称于不断更新权重参数w)
终极找到最优解 这个方法可用来求损失函数最优解, 比正规方程更通用
```
梯度下降过程就和下山场景类似
可微分的损失函数,代表着一座山
探求的函数的最小值,也就是山底
```
银行信贷案例
梯度下降算法分类
正规方程和梯度下降算法的对比
回归评估方法
**为什么要进行线性回归模型的评估**
我们希望权衡预测值和真实值之间的差距,
会用到MAE、MSE、RMSE多种测评函数进行评价
平均绝对偏差
**Mean Absolute Error (MAE)**
- 上面的公式中:n 为样本数量, y 为现实值, $\hat{y}$ 为预测值
- MAE 越小模型预测约正确
Sklearn 中MAE的API
```python
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_test,y_predict)
```
均方偏差
**Mean Squared Error (MSE)**
- 上面的公式中:n 为样本数量, y 为现实值, $\hat{y}$ 为预测值
- MSE 越小模型预测约正确
Sklearn 中MSE的API
```python
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test,y_predict)
```
均方根偏差
**Root Mean Squared Error (RMSE)**
- 上面的公式中:n 为样本数量, y 为现实值, $\hat{y}$ 为预测值
- RMSE 越小模型预测约正确
三种指标的比力
我们绘制了一条直线 **y = 2x +5** 用来拟合 **y = 2x + 5 + e.** 这些数据点,其中e为噪声
从上图中我们发现 MAE 和 RMSE 非常接近,都表明模型的偏差很低(MAE 或 RMSE 越小,偏差越小!)。 但是MAE 和 RMSE 有什么区别?为什么MAE较低?
- 对比MAE 和 RMSE的公式,RMSE的盘算公式中有一个平方项,因此:大的偏差将被平方,因此会增加 RMSE 的值
- 可以得出结论,RMSE 会放大预测偏差较大的样本对结果的影响,而 MAE 只是给出了平均偏差
- 由于 RMSE 对偏差的 **平方和求平均** 再开根号,大多数情况下RMSE>MAE
举例 (1+3)/2 = 2 $\sqrt{(1^2+3^2)/2 }= \sqrt{10/2} = \sqrt{5} = 2.236$
我们再看下一个例子
橙色线与第一张图中的直线一样:**y = 2x +5**
蓝色的点为: **y = y + sin(x)\*exp(x/20) + e** 其中 exp() 表现指数函数
我们看到对比第一张图,全部的指标都变大了,RMSE 几乎是 MAE 值的两倍,因为它对预测偏差较大的点比力敏感
我们是否可以得出结论: RMSE是更好的指标? 某些情况下MAE更有优势,比方:
- 假设数据中有少数异常点偏差很大,如果此时根据 RMSE 选择线性回归模型,可能会选出过拟合的模型来
- 在这种情况下,由于数据中的异常点极少,选择具有最低 MAE 的回归模型可能更合适
- 除此之外,当两个模型盘算RMSE时数据量差别等,也不适合在一起比力
波士顿房价预测案例
线性回归API
sklearn.linear_model.LinearRegression(fit_intercept=True)
- 通过正规方程优化
- 参数:fit_intercept,是否盘算偏置
- 属性:LinearRegression.coef_ (回归系数) LinearRegression.intercept_(偏置)
sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='constant', eta0=0.01)
- 参数:loss(损失函数类型),fit_intercept(是否盘算偏置)learning_rate (学习率)
- 属性:SGDRegressor.coef_ (回归系数)SGDRegressor.intercept_ (偏置)
波士顿房价预测
案例背景介绍
数据介绍
> 给定的这些特征,是专家们得出的影响房价的结果属性。我们此阶段不必要自己去探究特征是否有用,只必要使用这些特征。到后面量化许多特征必要我们自己去探求
案例分析
回归当中的数据大小差别等,是否会导致结果影响较大。所以必要做标准化处置惩罚。
- 数据分割与标准化处置惩罚
- 回归预测
- 线性回归的算法效果评估
回归性能评估
均方偏差(Mean Squared Error, MSE)评价机制:
$\Large MSE = \frac{1}{m}\sum_{i=1}^{m}(y^i-\hat{y})^2$
sklearn中的API:sklearn.metrics.mean_squared_error(y_true, y_pred)
- 均方偏差回归损失
- y_true:真实值
- y_pred:预测值
- return:浮点数结果
代码实现
```python
# 0.导包
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.metrics import mean_squared_error
# 1.加载数据
boston = load_boston()
# print(boston)
# 2.数据集分别
x_train,x_test,y_train,y_test =train_test_split(boston.data,boston.target,test_size=0.2,random_state=22)
# 3.标准化
process=StandardScaler()
x_train=process.fit_transform(x_train)
x_test=process.transform(x_test)
# 4.模型训练
# 4.1 实例化(正规方程)
# model =LinearRegression(fit_intercept=True)
model = SGDRegressor(learning_rate='constant',eta0=0.01)
# 4.2 fit
model.fit(x_train,y_train)
# print(model.coef_)
# print(model.intercept_)
# 5.预测
y_predict=model.predict(x_test)
print(y_predict)
# 6.模型评估
print(mean_squared_error(y_test,y_predict))
```
1.2.0 以上版本实现
```python
# 0.导包
# from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.metrics import mean_squared_error
# 1.加载数据
# boston = load_boston()
# print(boston)
import pandas as pd
import numpy as np
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]
# 2.数据集分别
# x_train,x_test,y_train,y_test =train_test_split(boston.data,boston.target,test_size=0.2,random_state=22)
x_train,x_test,y_train,y_test =train_test_split(data,target,test_size=0.2,random_state=22)
# 3.标准化
process=StandardScaler()
x_train=process.fit_transform(x_train)
x_test=process.transform(x_test)
# 4.模型训练
# 4.1 实例化(正规方程)
# model =LinearRegression(fit_intercept=True)
model = SGDRegressor(learning_rate='constant',eta0=0.01)
# 4.2 fit
model.fit(x_train,y_train)
# print(model.coef_)
# print(model.intercept_)
# 5.预测
y_predict=model.predict(x_test)
print(y_predict)
# 6.模型评估
print(mean_squared_error(y_test,y_predict))
```
正则化
欠拟合与过拟合
过拟合:一个假设 **在训练数据上可以或许得到比其他假设更好的拟合, 但是在测试数据集上却不能很好地拟合数据** (体现在正确率下降),此时认为这个假设出现了过拟合的现象。(模型过于复杂)
欠拟合:一个假设 **在训练数据上不能得到更好的拟合,并且在测试数据集上也不能很好地拟合数据** ,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
过拟合和欠拟合的区别:
欠拟合在训练集和测试集上的偏差都较大
过拟合在训练集上偏差较小,而测试集上偏差较大
通过代码熟悉过拟合和欠拟合
绘制数据
```python
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(666)
x = np.random.uniform(-3,3,size = 100)
# 线性回归模型必要二维数组
X = x.reshape(-1,1)
y = 0.5* x**2 + x+2 +np.random.normal(0,1,size = 100)
from sklearn.linear_model import LinearRegression
estimator = LinearRegression()
estimator.fit(X,y)
y_predict = estimator.predict(X)
plt.scatter(x,y)
plt.plot(x,y_predict,color = 'r')
plt.show()
```
```python
#盘算均方偏差
from sklearn.metrics import mean_squared_error
mean_squared_error(y,y_predict)
#3.0750025765636577
```
添加二次项,绘制图像
```python
X2 = np.hstack([X,X**2])
estimator2 = LinearRegression()
estimator2.fit(X2,y)
y_predict2 = estimator2.predict(X2)
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict2[np.argsort(x)],color = 'r')
plt.show()
```
```python
#盘算均方偏差和正确率
from sklearn.metrics import mean_squared_error
mean_squared_error(y,y_predict2)
#1.0987392142417858
```
再次参加高次项,绘制图像,观察均方偏差结果
```python
X5 = np.hstack([X2,X**3,X**4,X**5,X**6,X**7,X**8,X**9,X**10])
estimator3 = LinearRegression()
estimator3.fit(X5,y)
y_predict5 = estimator3.predict(X5)
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict5[np.argsort(x)],color = 'r')
plt.show()
error = mean_squared_error(y, y_predict5)
error
#1.0508466763764157
```
通过上述观察发现,随着参加的高次项越来越多,拟合程度越来越高,均方偏差也随着参加越来越小。说明已经不再欠拟合了。
题目:如何判断出现过拟合呢?
将数据集进行分别:对比X、X2、X5的测试集的均方偏差
X的测试集均方偏差
```python
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state = 5)
estimator = LinearRegression()
estimator.fit(X_train,y_train)
y_predict = estimator.predict(X_test)
mean_squared_error(y_test,y_predict)
#3.153139806483088
```
X2的测试集均方偏差
```python
X_train,X_test,y_train,y_test = train_test_split(X2,y,random_state = 5)
estimator = LinearRegression()
estimator.fit(X_train,y_train)
y_predict = estimator.predict(X_test)
mean_squared_error(y_test,y_predict)
#1.111873885731967
```
X5的测试集的均方偏差
```python
X_train,X_test,y_train,y_test = train_test_split(X5,y,random_state = 5)
estimator = LinearRegression()
estimator.fit(X_train,y_train)
y_predict = estimator.predict(X_test)
mean_squared_error(y_test,y_predict)
#1.4145580542309835
```
原因以及解决办法
**欠拟合产生原因:** 学习到数据的特征过少
解决办法:
**1)添加其他特征项**,有时出现欠拟合是因为特征项不够导致的,可以添加其他特征项来解决
**2)添加多项式特征**,模型过于简单时的常用套路,比方将线性模型通过添加二次项或三次项使模型泛化能力更强
**过拟合产生原因:** 原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去分身全部测试样本
解决办法:
1)重新清洗数据,导致过拟合的一个原因有可能是数据不纯,如果出现了过拟合就必要重新清洗数据。
2)增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。
**3)正则化**
4)镌汰特征维度
正则化
在解决回归过拟合中,我们选择正则化。但是对于其他机器学习算法如分类算法来说也会出现这样的题目,除了一些算法本身作用之外(决议树、神经网络),我们更多的也是去自己做特征选择,包括之前说的删除、合并一些特征
**如何解决?**
**在学习的时间,数据提供的特征有些影响模型复杂度或者这个特征的数据点异常较多,所以算法在学习的时间只管镌汰这个特征的影响(甚至删除某个特征的影响),这就是正则化**
注:调解时间,算法并不知道某个特征影响,而是去调解参数得出优化的结
**L1正则化**
- 假设 |