目录
回归问题的判定
线性回归
线性模型
线性回归
损失函数(误差大小)
最小二乘法之正规方程(不做要求)
最小二乘法之梯度下降(理解过程)
sklearn线性回归方程、梯度下降API
正规方程
梯度下降
案例
回归性能评估
过拟合与欠拟合
欠拟合原因及解决办法
过拟合原因及解决方法
L2正则化
岭回归(Ridge)——带有正则化的线性回归
目标值连续——迭代算法
寻找一种能预测的趋势
线性关系:二维——直线当中
三维——特征、目标值,平面当中
试图学得一个通过属性的线性组合来进行预测的函数:
w为权重,b称为偏置项,可以理解为:
属性和权重一种组合来预测模型
定义:线性回归通过一个或者多个自变量与因变量之间进行模型的回归分析。其中特点为一个或多个称为回归系数的模型参数的线性组合
一元线性回归:涉及到的变量只有一个
多元线性回归:涉及到的变量两个或两个以上
通用公式:
其中 w,x为矩阵:
数组 | 矩阵 | |
0维 | 5 | |
1维 | [1,2,3,4] | |
2维 | [[1,2,3,4]] | 必须是2维 |
3维 | [ [[1,2]] [[3,4]] ] |
数组的运算:加法、乘法
矩阵的运算:矩阵乘法
import numpy as np
a = [[1,2,3,4],[5,6,7,8],[2,3,7,9]]
b = [2,3,4,2]
c = np.multiply(a,b) # 每一行对应数相乘,权重相乘
print(c)
d = [[2],[2],[2],[2]]
e = np.dot(a,d) #(3,4)*(4,1)=(3,1)矩阵乘法
print(e)
预测结果与真实值是有一定是有误差的
为第i个训练样本的真实值
为第i个训练样本特征值组合预测函数
总损失定义:
又称最小二乘法
如何去求模型当中的W,使得损失最小?(目的是找到最小损失对应的W值)
求解:
X为特征值矩阵,y为目标值矩阵
缺点:当特征过于复杂,求解速度太慢
对于复杂的算法,不能使用正规方程求解(逻辑回归等)
我们以单变量中的w0,w1为例子:
理解:沿着这个函数下降的方向找,最后就能找到山谷的最低点,然后更新W值
使用:面对训练数据规模十分庞大的任务
算法的自我学习过程:
算法 | 策略(损失函数) | 优化 |
线性回归 | 最小二乘法(误差平方和) | 正规方程(不常用) |
梯度下降(常用)_学习率 |
scikit-learn
优点:封装好,建立模型简单,预测简单
缺点:算法的过程,有些参数都在算法API内部优化
tensorflow:封装高低,自己实现线性回归,学习率等参数可以自己手动修改
sklearn.linear_model.LinearRegression
普通最小二乘线性回归
coef_:回归系数——w值
线性回归需要做标准化处理
sklearn.linear_model.SGDRegressor
通过使用SGD最小化线性模型
coef_:回归系数——w
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
def mylinear():
"""
线性回归预测房子价格
:return:
"""
# 获取数据集
lb = load_boston()
# 分割数据集训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(lb.data,lb.target,test_size=0.25)
y_train = y_train.reshape(-1,1) #在新版本的线性回归中,传入的数组必须为二维数组
y_test = y_test.reshape(-1,1)
# 进行标准化处理,特征值和目标值都需要,分开处理
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)
std_y = StandardScaler()
y_train = std_y.fit_transform(y_train)
y_test = std_y.fit_transform(y_test)
# estimator预测
#正规方程预测
lr = LinearRegression()
lr.fit(x_train,y_train)
print(lr.coef_)
# 预测测试集的房子价格
y_predict = std_y.inverse_transform(lr.predict(x_test))
print('测试集里每个房子的预测价格:',y_predict)
# 梯度下降去进行房价预测
sgd = SGDRegressor()
sgd.fit(x_train, y_train)
print(sgd.coef_)
# 预测测试集的房子价格
y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
print('测试集里每个房子的预测价格:', y_sgd_predict)
if __name__ == '__main__':
mylinear()
(均方误差(Mean Squared Error)MSE) 评价机制:
sklearn.metrics.mean_squared_error(y_true,y_pred)——均方误差回归损失
注:真实值,预测值为标准化之前的值
from sklearn.metrics import mean_squared_error
print('梯度下降的均方误差',mean_squared_error(std_y.inverse_transform(y_test),y_sgd_predict))
特点:线性回归器是最为简单、易用的回归模型。从某种程度上限制了使用,尽管如此,在不知道特征之间关系的前提下,我们仍然使用线性回归器作为大多数系统的首要选择。
小规模数据:LinearRegression(不能解决拟合问题)以及其它
大规模数据:SGDRegressor
问题:训练数据训练的很好啊,误差也不大,为什么在测试集上面有问题呢?
过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
欠拟合:一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
模型复杂的原因:特征值与目标值之间的关系不仅仅是线性关系
原因:
解决办法:
原因:
解决办法:
根据交叉验证判断欠拟合和过拟合:
作用:可以使得W的每个元素都很小,都接近于0
优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象
sklearn.linear_model.Ridge(alpha=1.0)——具有l2正则化的线性最小二乘法
from sklearn.datasets import load_boston
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
def mylinear():
"""
线性回归预测房子价格
:return:
"""
# 获取数据集
lb = load_boston()
# 分割数据集训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(lb.data,lb.target,test_size=0.25)
y_train = y_train.reshape(-1,1) #在新版本的线性回归中,传入的数组必须为二维数组
y_test = y_test.reshape(-1,1)
# 进行标准化处理,特征值和目标值都需要,分开处理
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)
std_y = StandardScaler()
y_train = std_y.fit_transform(y_train)
y_test = std_y.fit_transform(y_test)
# estimator预测
rg = Ridge(alpha=1.0)
rg.fit(x_train,y_train)
# print(rg.coef_)
y_predict = std_y.inverse_transform(rg.predict(x_test))
mse = mean_squared_error(std_y.inverse_transform(y_test),y_predict)
print(mse)
if __name__ == '__main__':
mylinear()
线性回归 LinearRegression与Ridge对比
岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研究中有较大的实用价值。