39.线性回归的定义以及矩阵的运算
回归——目标值连续
线性模型
试图学得一个通过属性的线性组合来进行预测的函数:
f(x)=w1x1+w2x2+…+wdxd+b
w为权重,b称为偏置项,可以理解为:w0×1
线性回归
import numpy as np
a = [[1,2,3,4],[5,6,7,8],[2,3,7,9]]
b = [2,2,2,2]
print(np.multiply(a,b))
[[ 2 4 6 8]
[10 12 14 16]
[ 4 6 14 18]]
import numpy as np
a = [[1,2,3,4],[5,6,7,8],[2,3,7,9]]
b = [[2],[2],[2],[2]]
print(np.dot(a,b))
[[20]
[52]
[42]]
40.线性回归策略,优化,案例
损失函数
如何去求模型当中的W,使得损失最小? (目的是找到最小损失对应的W值)
正规方程
梯度下降
sklearn线性回归正规方程、梯度下降API
- sklearn.linear_model.LinearRegression 正规方程
- sklearn.linear_model.SGDRegressor 梯度下降=
波士顿房价数据案例分析流程
- 波士顿地区房价数据获取
- 波士顿地区房价数据分割
- 训练与测试数据标准化处理
- 使用最简单的线性回归模型LinearRegression和 梯度下降估计SGDRegressor对房价进行预测
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 myliner():
#获取数据
lb = load_boston()
#分割数据
x_train,x_test,y_train,y_test = train_test_split(lb.data, lb.target, test_size=0.25)
#进行标准化处理
#特征值目标值都要进行标准化处理
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.reshape(-1, 1))
y_test = std_y.transform(y_test.reshape(-1, 1))
#estimator预测
#正规方程求解方式预测结果
lr = LinearRegression()
lr.fit(x_train, y_train)
print(lr.coef_)
#预测测试集的房子价格
y_predict = lr.predict(x_test)
print("测试集合里面每个房子的预测价格:",std_y.inverse_transform(y_predict))
#梯度下降去进行房价预测
sgd = SGDRegressor()
sgd.fit(x_train, y_train)
print(sgd.coef_)
# 预测测试集的房子价格
y_sgd_predict = sgd.predict(x_test)
print("测试集合里面每个房子的预测价格:", std_y.inverse_transform(y_sgd_predict))
return None
if __name__ == "__main__":
myliner()
[[-0.1104793 0.11032847 0.0397622 0.08135389 -0.19210311 0.36289619
-0.02047188 -0.33697462 0.24048481 -0.21689924 -0.21039004 0.10393991
-0.35926107]]
[-0.08571238 0.10477088 -0.0413873 0.06692462 -0.15353954 0.35267452
-0.0328122 -0.26335671 0.12334298 -0.09185532 -0.22311585 0.11182096
-0.32899844]
回归性能评估
sklearn回归评估API
sklearn.metrics.mean_squared_error
mean_squared_error(y_true, y_pred)
- 均方误差回归损失
- y_true:真实值
- y_pred:预测值
- return:浮点数结果
- 注:真实值,预测值为标准化之前的值
from sklearn.metrics import mean_squared_error
print("正规方程均方误差:",mean_squared_error(std_y.inverse_transform(y_test),
std_y.inverse_transform(y_predict)))
print("梯度下降均方误差:", mean_squared_error(std_y.inverse_transform(y_test), std_y.inverse_transform(y_sgd_predict)))
41.线性回归两种求解方式总结梯度
下降正规方程对比
1、LinearRegression与SGDRegressor评估
2、特点:线性回归器是最为简单、易用的回归模型。 从某种程度上限制了使用,尽管如此,在不知道特征之间关系的前提下,我们仍然使用线性回归器作为大多数系统的首要选择。
- 小规模数据:LinearRegression(不能解决拟合问题)以及其它欠拟合问题
- 大规模数据:SGDRegressor
42.过拟合以及欠拟合
过拟合与欠拟合
问题:训练数据训练的很好啊,误差也不大,为什么在测试集上面有问题呢?
过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
欠拟合:一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
对线性模型进行训练学习会变成复杂模型
欠拟合原因以及解决办法
- 原因: 学习到数据的特征过少
- 解决办法: 增加数据的特征数量
过拟合原因以及解决办法
- 原因: 原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点
- 解决办法: (1)进行特征选择,消除关联性大的特征(很难做) (2)交叉验证(让所有数据都有过训练) (3)正则化(了解)
正则化
- 作用:可以使得W的每个元素都很小,都接近于0
- 优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象
43.Ridge岭回归分析
带有正则化的线性回归-Ridge
sklearn.linear_model.Ridge
Ridge
sklearn.linear_model.Ridge(alpha=1.0)
- 具有l2正则化的线性最小二乘法
- alpha:正则化力度(0-1)(1-10)
- coef_:回归系数
观察正则化程度的变化,对结果的影响?
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor,Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
def myliner():
#获取数据
lb = load_boston()
#分割数据
x_train,x_test,y_train,y_test = train_test_split(lb.data, lb.target, test_size=0.25)
#进行标准化处理
#特征值目标值都要进行标准化处理
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.reshape(-1, 1))
y_test = std_y.transform(y_test.reshape(-1, 1))
#岭回归进行房价预测
rd = Ridge(alpha=1.0)
rd.fit(x_train, y_train)
print(rd.coef_)
# 预测测试集的房子价格
y_rd_predict = rd.predict(x_test)
print("测试集合里面每个房子的预测价格:", std_y.inverse_transform(y_rd_predict))
print("岭回归均方误差:", mean_squared_error(std_y.inverse_transform(y_test), std_y.inverse_transform(y_rd_predict)))
return None
if __name__ == "__main__":
myliner()
岭回归均方误差: 22.239994614677215
线性回归 LinearRegression与Ridge对比
岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研 究中有较大的实用价值。