回归算法
线性回归
寻找一种能预测的趋势
二维:直线关系
三维:特征目标值,平面中
线性关系模型
一个通过***属性的线性组合 ***来进行预测的函数:
f(x)=w1x1+w2x2+w3x3+w4x4…+wnxn
w为权重,b为偏移量
回归,神经网络,全部称为迭代算法
预测的时候有差距,
回归:知道自己有误差
那门问题来了:我们如何去求解模型中的w使得误差值最小呢?
目的:是找到最小损失对应的W值
损失函数:寻找最优化的w
最小二乘法----梯度下降法
from sklearn.datasets import load_boston
from sklearn.linear_model import SGDRegressor, LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
def mylinear():
"""
线性回归直接预测房价
"""
# 获取数据集
lb = load_boston()
# 分割数据集,测试
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
# print(y_test,y_train)
# 进行标准化(?)目标值要不要标准化处理
# 特征值,目标值都都要标准化,实例2个标准化API
std_x = StandardScaler()
x_train=std_x.fit_transform(x_train)
x_test=std_x.transform(x_test)
# 目标值
std_y = StandardScaler()
# 要求数组必须2维
y_train=std_y.fit_transform(y_train.reshape(-1, 1))
y_test= std_y.transform(y_test.reshape(-1, 1))
# 正规方程求解预测
# lr = LinearRegression()
#
# lr.fit(x_train,y_train)
# print(lr.coef_)
# # 预测测试集房子的价格
# y_pred = lr.predict(x_test)
# print("预测出来的房屋讲个:",y_pred)
# 梯度下降
sgd = SGDRegressor()
sgd.fit(x_train, y_train)
print(sgd.coef_)
# 预测测试集房子的价格
y_pred = sgd.predict(x_test)
print("预测出来的房屋讲个:", y_pred)
return None
if __name__ == "__main__":
mylinear()
回归性能评估
mean_absolute_error(y_true,y_pred)
print('梯度下降的均方误差:', mean_absolute_error(std_y.inverse_transform(y_test), std_y.inverse_transform(y_pred)))
------------------------------
1.y_true 为真实值
2.y_pred 测试值
真实值,测试值均为标准化之前的值
梯度下降和正规方程比较
梯度下降 | 正规方程 |
---|---|
需要选择学习效率a | 不需要 |
需要多次迭代 | 一次运算出结果 |
特征数量N大时,也比较好用 | 如果特征数量N太大不太好用 |
使用与各种类型的模板 | 只适用于线性模型,不符合逻辑回归模型 |
过拟合,欠拟合
1.过拟合—学的太多了,模型过于复杂
- 原因:原始特征过多,存在嘈杂特征
- 决绝办法:1.进行特征选择,消除关联性大的,2.交叉验证,3正则式
2.欠拟合—学太少了,模型过于简单
- 原因:学习到数据特征过少
- 解决办法:增加数据的特征数量
经验:根据结果现象,判断是过拟合,还是欠拟合
L2正则化–Ridge领回归 带有正则化的回归
作用:可使得w的每个元素都很小,都接近于0
优点:越小的参数,说明模型越简单越简单的参数不容易过拟合
岭回归—rideg
sklearn.linear_model. Ridge
- alpha: 正则化力度
- cof_:回归系数
正则化力度越大,模型越来越简单,w
# 岭回归去进行房价预测
rd = Ridge(alpha=1.0)
rd.fit(x_train, y_train)
print(rd.coef_)
# 预测测试集房子的价格
y_rd_pred = sgd.predict(x_test)
print("预测出来的房屋讲个:", y_rd_pred)
print('梯度下降的均方误差:', mean_absolute_error(std_y.inverse_transform(y_test), std_y.inverse_transform(y_rd_pred)))