上一篇文章到随机森林为止学习完了基础的分类算法,从现在开始就是回归算法的学习了。
关于什么是分类算法什么是回归算法的分类看ML0.
线性回归
寻找一种能预测的趋势
- 定义:通过一个或者多个自变量(特征)与因变量(目标值)之间的进行见面的回归的分析。其中可以为一个或者多个自变量之间的线性组合
- 通用公式:h(w)=w0+w1x1+…=wTx
误差大小的度量方式—损失函数
- 最小二乘法
- 误差平方和
优化:
- 正规方程
- 梯度下降
梯度下降算法是自我学习的过程,自我迭代去优化
正规方程API:sklearn.linear_model.LinearRegression
梯度下降API:sklearn.Linearn_model.SEDRessor
波士顿房价预测
数据集在kaggle上
流程
- get数据
- 数据分割
- 训练集和测试集标准化处理
- 算法开始
对特征值标准化处理,和分类算法不一样,这里的目标值也需要标准化处理,目标值最后要reverse_transform()
要实例化两个标准化api
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)) # 0.19版本的转换器,要求传进去的参数必须是二维的
用正规方程
lr = LinearRegression()
lr.fit(x_train, y_train)
print("权重参数是", lr.coef_) # 这是权重参数
# 预测测试集的房子价格
y_predict = lr.predict(x_test)
print("测试集的每个房子的价格预测", std_y.inverse_transform(y_predict)) # 转换会标准化之前的房价
print("正规方程的均方误差", mean_squared_error(std_y.inverse_transform(y_test), 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)) # 转换会标准化之前的房价
print("梯度下降的均方误差", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))
实际上一般用梯度下降的多
梯度下降 | 正规方程 |
---|---|
需要选择学习率alpha | 不需要 |
需要多次迭代 | 一次运算得出 |
当特征数量多的时候也较好 | 特征数量多的时候运算代价大 |
适用于各种数据模型 | 只适用于线性模型,不适用于逻辑回归等其他模型 |
author:specyue@mail.ustc.edu.cn 欢迎交流