赞
踩
线性关系模型:
因变量可理解为目标值
损失函数:即为误差大小,误差平方和(最小二乘法)
求解模型中的W可以缩小误差
梯度下降需要手动制定学习率
线性回归时算法对比:
scikit-learn :优点:封装好,建立模型简单,预测简单
缺点:算法的过程,有些参数都在算法API内部优化
TensorFlow :封装高低都有,自己实现线性回归
特征值
注意:线性回归案例中数据需要进行标准化处理,避免因为某个特征数值过大对结果产生影响
from sklearn.metrics import mean_squared_error # 线性回归性能评估
官网建议:样本数量大于10万使用梯度下降SGDRegressor
样本数量小于10万使用正规方程LinearRegression
线性回归:线性关系的数据(直线的关系)
非线性关系(曲线的关系)
模型复杂的原因:数据的特征和目标值的关系不仅仅是线性关系
欠拟合原因及解决方法:
原因: 学习到的数据特征过少
解决方法:增加数据的特征数量
过拟合原因及解决方法:
原因:原始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型尝试去兼顾各个测试数据点
解决方法:进行特征选择,消除关联性大的特征(很难做)
交叉验证(让所有数据都有过训练)
正则化(了解)
根据结果现象判断是过拟合还是欠拟合,交叉验证:训练集、测试集都不行是欠拟合;训练集很好,测试集不行是过拟合。
回归解决过拟合的方式:
线性回归:LinearRegression容易出现过拟合,为了把训练集数据表现更好
L2正则化:Ridge岭回归 带有正则化的线性回归
带有正则化的线性回归-Ridge岭回归
线性回归岭LinearRegression与Ridge回归对比:
岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研究中有较大的实用价值。
- # import matplotlib.pyplot as plt
- #
- # plt.figure(figsize=(10,10))
- # plt.scatter([60,72,75,80,83], [126,151.2,157.5,168,174.3])
- # plt.show()
-
- from sklearn.datasets import load_boston # 加载波士顿房价数据
- from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge # 回归预测时使用的API:正规方程/梯度下降/岭回归
- from sklearn.model_selection import train_test_split # 数据分割
- from sklearn.preprocessing import StandardScaler # 标准化
- from sklearn.metrics import mean_squared_error # 线性回归性能评估
- import numpy as np
-
- 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)
-
- print(y_train, y_test)
- # 进行标准化处理
- # 特征值和目标值都进行标准化处理,目标值还需再转换回来,实例化两个标准化API
- std_x = StandardScaler()
- x_train = std_x.fit_transform(x_train.reshape(-1, 1)) # x_train.reshape(-1, 1) 把一维数据改成二维
- x_test = std_x.transform(x_test.reshape(-1, 1))
-
- std_y = StandardScaler()
- y_train = std_y.fit_transform(y_train.reshape(-1, 1))
- y_test = std_y.transform(y_test.reshape(-1, 1))
-
- print(x_train.shape)
- print(y_train.shape)
-
- # estimator预测
- # 正规方程求解方式预测结果
- lr = LinearRegression()
- lr.fit(x_train[0:379], y_train) # 该处与视频不同,必须保持fit两个参数长度一致,这是数据量过少导致的
- print("lr权重参数:", lr.coef_) # 打印权重参数
-
- # 预测测试集的房子价格
- y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
- print("lr测试集中每个房子的预测价格:", y_lr_predict)
- print("正规方程的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict[0:127]))
-
- # 梯度下降进行房价预测
- sgd = SGDRegressor()
- sgd.fit(x_train[0:379], y_train) # 该处与视频不同,必须保持fit两个参数长度一致
- print("sgd权重参数:", sgd.coef_) # 打印权重参数
-
- # 预测测试集的房子价格
- y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
- print("sgd测试集中每个房子的预测价格:", y_sgd_predict)
- print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict[0:127]))
-
- # 岭回归进行房价预测
- rd = Ridge(alpha=1.0) # alpha可以在0-1之间,或者1-10之间
- rd.fit(x_train[0:379], y_train) # 该处与视频不同,必须保持fit两个参数长度一致
- print("Ridge权重参数:", rd.coef_) # 打印权重参数
- # 预测测试集的房子价格
- y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
- print("Ridge测试集中每个房子的预测价格:", y_rd_predict)
- print("岭回归的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict[0:127]))
-
- return None
-
-
- if __name__ == "__main__":
- mylinear()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。