线性回归
定义:线性回归通过一个或者多个自变量与因变量之间之间进行建模的回归分析。其中特点为一个或多个称为回归系数的模型参数的线性组合
通用公式:
其中w,x为矩阵:
属性和权重的一种组合来预测结果
矩阵也是大多数算法的计算基础
矩阵乘法:
损失函数(误差大小)
- y_i为第i个训练样本的真实值
- h_w (x_i)为第i个训练样本特征值组合预测函数
总损失定义:
又称最小二乘法
如何去求模型当中的W,使得损失最小?(目的是找到最小损失对应的W值)
最小二乘法之正规方程
求解:
𝑋为特征值矩阵,𝑦为目标值矩阵
缺点:当特征过于复杂,求解速度太慢
对于复杂的算法,不能使用正规方程求解(逻辑回归等)
sklearn线性回归正规方程、梯度下降API
正规方程: sklearn.linear_model.LinearRegression
梯度下降: sklearn.linear_model.SGDRegressor
LinearRegression、SGDRegressor
普通最小二乘线性回归
- sklearn.linear_model.LinearRegression()
- coef_:回归系数
通过使用SGD最小化线性模型
- sklearn.linear_model.SGDRegressor( )
- 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 test01():
"""
线性回归直接预测房子价格
:return: None
"""
# 获取数据
lb = load_boston()
# 分割数据集到训练集和测试集,按照75%:25%的比例进行数据分配训练数据和测试数据
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()
#标准化目标训练数据(因为数据是[y,y,1,1,1,1,...]变换成[[],[],[],[],[]...])进行变换
y_train = 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)
#查看w的参数
print(lr.coef_)
#查看b的参数
print(lr.intercept_)
# 预测测试集的房子价格
y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
print("正规方程测试集里面每个房子的预测价格: ", y_lr_predict)
print("正规方程的均方误差: ", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))
if __name__ == "__main__":
test01()
梯度下降:
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 mylinear():
"""
线性回归直接预测房子价格
: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()
y_train = std_y.fit_transform(y_train.reshape(-1, 1))
y_test = std_y.transform(y_test.reshape(-1, 1))
# estimator预测
# 梯度下降进行房价预测
sgd = SGDRegressor()
sgd.fit(x_train, y_train)
print(sgd.coef_)
# 预测测试集的房子价格
y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
print("梯度下降测试集里面每个房子的预测价格: ", y_sgd_predict)
print("梯度下降的均方误差: ", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))
if __name__ == "__main__":
mylinear()
回归性能评估
(均方误差(Mean Squared Error)MSE) 评价机制:
这个非常简单,就是你的预测值和真实值之间的差值的平方和求一个平均值
sklearn回归评估API
sklearn.metrics.mean_squared_error
mean_squared_error
mean_squared_error(y_true, y_pred)
- 均方误差回归损失
- y_true:真实值
- y_pred:预测值
正规方程与梯度下降的对比
梯度下降 | 正规方程 |
---|---|
需要选择学习率α | 不需要 |
需要多次迭代 | 一次运算得出 |
当特征数量n大时也能较好适用 | 需要计算(XTX)-1<br />如果特征数量n较大则运算代价大,因为矩阵逆的计算时间复杂度为O(n^3),通常来说当n小于10000时还是可以接受的 |
适用于各种类型的模型 | 只适用于线性模型,不适合逻辑回归模型等其他模型 |
线性回归器是最为简单、易用的回归模型。
从某种程度上限制了使用,尽管如此,在不知道特征之间关系的前提下,我们仍然使用线性回归器作为大多数系统的首要选择。
- 小规模数据:LinearRegression(不能解决拟合问题)以及其它
- 大规模数据:SGDRegressor