回归算法–线性回归
1.目标值:连续值
2.线性回归:寻找一种能预测的趋势
3.线性关系:二维:直线关系
三维:特征、目标值、平面当中
定义:通过一个或者多个自变量与因变量之间进行建模的回归分析。其中可以为一个或多个自变量之间的线性组合
4.损失函数(误差大小)
最小二乘法(误差平方和)
正规方差:当特征过于复杂,速度慢
梯度下降:面对训练数据规模十分庞大的任务
理解:沿着这个函数下降的方向找,最后就能找到山谷的最低点,更新w值
sklearn线性回归正规方程、梯度下降API
sklearn.linear_model.LinearRegression()
正规方程
普通最小二乘线性回归
coef_:回归系数
sklearn,linear_model.SGDRegressor()
梯度下降
通过使用SGD最小化线性模型
coef_:回归系数
scikit-learn:
优点:封装好,建立模型简单,预测简单
缺点:算法的过程,有些参数都在算法API内部优化
tensorflow:封装高低,自己实现线性回归,学习率等
线性回归实例
1.sklearn线性回归正规方程、梯度下降
2.波士顿放假数据集分析流程
分析流程
1.波士顿地区房价数据获取
2.波士顿地区放假数据分割
3.训练与测试数据标准化处理
4.使用最简单的线性回归模型LinearRegression和梯度下降估计SGDRegressor对放假进行预测
0.19的python fit_transform和estmator要求目标值为是二维的。使用.reshape(-1,1)进行转换
5.回归性能评估:均方误差
sklearn.mean_squared_error(y_true,y_pred)
均方误差回归损失
y_true:真实值
y_pred:预测值
return:浮点数结果
注:真实值、预测值为标准化之前的值
def mylinerar():
'''线性回归直接预测房子价格
:return:None'''
##获取数据
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)
x_test=std_x.transform(x_test)
##目标值
std_y=StandardScaler()
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_)
##预测测试集的房子价格
print('**'*20)
y_lr_predict = std_y.inverse_transform(lr.predict(x_test).reshape(1, -1))
print('正规方差的均方差测试集里面每个房子的预测价格:',y_lr_predict)
print('正规方程的均方误差:',mean_squared_error(std_y.inverse_transform(y_test).reshape(1, -1),y_lr_predict))
##梯度下降预测房价
sgd = SGDRegressor()
sgd.fit(x_train, y_train)
print(sgd.coef_)
##预测测试集的房子价格
print('@@' * 20)
y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test).reshape(1, -1))
print('梯度下降测试集里面每个房子的预测价格:', y_sgd_predict)
print('梯度下降的均方误差:',mean_squared_error(std_y.inverse_transform(y_test).reshape(1, -1),y_sgd_predict))
梯度下降:需要学习率α 需要多次迭代 当特征数量n大时也能较好使用 适用于各种类型的模型
正规方程:不需要 一次运算得出 需要计算(XT X)-1 如果特征数量n大较大则运算代价大,因为矩阵逆的计算时间复杂度为O(n3 )通常来说n小于10K时还可以接受的 只适用于线性模型,不适合逻辑会过模型等其他模型
过拟合和欠拟合
过拟合:一个假设在数据上能够获得比其他假设更好的拟合,但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
原因:原始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型尝试去兼顾各个册数数据点
解决办法:进行特征选择
欠拟合:一个假设在训练数据上不能获得更好的拟合,但是在训练数据外的数据集上也不能很好地拟合(模型过于简单)
对线性模型进行训练学习会变成复杂模型
原因:学习到数据的特征过少
解决办法:增加数据的特征数量,消除关联性大的特征(难)
交叉验证(让所有数据都有过训练)
正则化(了解)
2.特征选择:过滤式–低方差特征
嵌入式:正则化、决策树、神经网络
L2正则化:
作用:可以使得w的每个元素都很小,都接近于0
优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象
线性回归:LinearRegression 容易出现过拟合,为了把训练集数据表现好
可通过L2正则化解决-----------------Ridge:岭回归 带有正则化的线性回归,解决过拟合
带有正则化的线性回归-Ridge
sklearn.linear_model.Ridege
sklearn.linear_model.Ridege(alpha=1.0)
具有L2正则化的线性最小二乘法
alpha:正则化力度
coef_:回归系数
正则化力度越大,权重越趋近于0
##岭回归预测房价
rd = Ridge(alpha=1.0)
rd.fit(x_train, y_train)
print(rd.coef_)
##预测测试集的房子价格
print('$$' * 20)
y_rd_predict = rd_y.inverse_transform(rd.predict(x_test).reshape(1, -1))
print('岭回归测试集里面每个房子的预测价格:', y_rd_predict)
print('岭回归的均方误差:', mean_squared_error(rd_y.inverse_transform(y_test).reshape(1, -1), y_rd_predict))