Python基础4
回归算法
回归的目标值是连续的
线性回归
定义:线性回归通过一个或者多个自变量与因变量之间之间进行建模的回归分析。其中特点为一个或多个称为回归系数的模型参数的线性组合
一元线性回归:涉及到的变量只有一个
多元线性回归:涉及到的变量两个或两个以上
W0为偏移量 WX中W为权重
即:目标值=∑(权重*特征值)
单变量
双变量
损失函数
最小二乘正规矩阵
最小二乘梯度下降
α衡量梯度下降快慢
sklearn线性回归正规方程、梯度下降API
线性回归需要标准化处理
sklearn.linear_model.LinearRegression()
普通最小二乘线性回归
coef_:回归系数
sklearn.linear_model.SGDRegressor( )
通过使用SGD最小化线性模型
coef_:回归系数
#最小二乘法和梯度下降
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
from sklearn.metrics import mean_squared_error
def myliner():
"""
线性回归预测房价
:return: None
"""
# 获取数据
lb = load_boston()
# 分割训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
# 特征值和目标值都要进行标准化处理 由于矩阵维度不一样 要实例化两个API
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)
std_y = StandardScaler()
# 新版sklearn只可以传入二维数组 y是一维要reshape
y_train = std_y.fit_transform(y_train.reshape(-1, 1))
y_test = std_y.transform(y_test.reshape(-1, 1))
# 正规方程
#sgd=SGDRegressor()
lf = LinearRegression()
lf.fit(x_train, y_train)
# 回归系数
print(lf.coef_)
print()
# 预测测试集的房子价格
y_predict = lf.predict(x_test)
# 转换为标准化之前的真实数据
y_predict = std_y.inverse_transform(y_predict)
print("测试集每个样本房子的预测价格", y_predict)
print("正规方程均方误差", mean_squared_error(std_y.inverse_transform(y_test), y_predict))
if __name__ == '__main__':
myliner()
输出结果:
[[-0.1164782 0.12157346 -0.00978715 0.04360493 -0.21301302 0.28373375
0.01197126 -0.34769889 0.29789835 -0.23722638 -0.21358051 0.08563227
-0.41318975]]
测试集每个样本房子的预测价格
[[13.67727662]
[33.30368294]
[11.84275218]
.......
正规方程均方误差 20.10187144634618
梯度下降和正规方程的对比:
线性回归器是最为简单、易用的回归模型。从某种程度上限制了使用,尽管如此,在不知道特征之间关系的前提下,我们仍然使用线性回归器作为大多数系统的首要选择。
小规模数据:LinearRegression(不能解决拟合问题)以及其它
大规模数据:SGDRegressor
回归性能评估
sklearn回归评估API
sklearn.metrics.mean_squared_error
mean_squared_error(y_true, y_pred)
均方误差回归损失
y_true:真实值
y_pred:预测值
return:浮点数结果
过拟合 欠拟合
过拟合:
一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
欠拟合:
一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
欠拟合原因和解决方法:
原因:学习到数据的特征过少
解决办法:增加数据的特征数量
过拟合原因和解决方法:
原因:原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点
解决办法:
- 进行特征选择
- 消除关联性大的特征(很难做)
- 交叉验证(让所有数据都有过训练)
- 正则化(了解)
L2正则化
作用:可以使得W的每个元素都很小,都接近于0
优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象
对线性模型进行训练学习会变成复杂模型
(要尽量减小高次项特征的影响,这样就会将模型变的更加靠近正好值)
线性回归容易出现过拟合,从而引出了岭回归(带有正则化)
岭回归
岭回归API
sklearn.linear_model.Ridge(alpha=1.0)
具有l2正则化的线性最小二乘法
alpha:正则化力度
coef_:回归系数
岭回归优点:
回归得到的回归系数更符合实际,更可靠。另外,能让估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研究中有较大的实用价值。
模型保存
sklearn.externals.joblib
保存和加载API
保存:
joblib.dump(模型,'文件名.pkl')
读取:
estimator = joblib.load('文件名.pkl')
文件后缀为pkl
#存储模型
rd = Ridge(alpha=1)
rd.fit(x_train, y_train)
joblib.dump(rd, 'test.pkl')
#读取模型预测
# 获取数据
lb = load_boston()
# 分割训练集和测试集
x_train, x_test, y_train, y_test =
train_test_split(lb.data, lb.target, test_size=0.25)
# 特征值和目标值都要进行标准化处理 由于矩阵维度不一样 要实例化两个API
std_x = StandardScaler()
x_test = std_x.transform(x_test)
std_y = StandardScaler()
# 新版sklearn只可以传入二维数组 y是一维要reshape
y_test = std_y.transform(y_test.reshape(-1, 1))
model = joblib.load('./test.pkl')
#不用训练,直接导入数据测试
y_predict = std_y.inverse_transform(model.predict(x_test))
print("预测为:", y_predict)