线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。python
特色:只有一个自变量的状况称为单变量回归,大于一个自变量状况的叫作多元回归web
通用公式:h(w) = w1x1+w2x2+w3x3+...+b=wTx + b算法
其中w,x能够理解为矩阵: dom
线性回归当中的关系有两种,一种是线性关系(单特征与目标值的关系呈直线关系,或者两个特征与目标值呈现平面的关系),另外一种是非线性关。ide
线性回归损失函数定义为:函数
线性回归常常使用的两种优化算法:性能
1. 正规方程学习
理解:X为特征值矩阵,y为目标值矩阵。直接求到最好的结果优化
缺点:当特征过多过复杂时,求解速度太慢而且得不到结果spa
2. 梯度降低(Gradient Descent)
理解:α为学习速率,须要手动指定(超参数),α旁边的总体表示方向,沿着这个函数降低的方向找,最后就能找到山谷的最低点,而后更新W值
使用:面对训练数据规模十分庞大的任务 ,可以找到较好的结果
sklearn提供的线性回归API
sklearn.linear_model.LinearRegression(fit_intercept=True)
经过正规方程优化
fit_intercept:是否计算偏置
LinearRegression.coef_:回归系数
LinearRegression.intercept_:偏置
sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='invscaling', eta0=0.01)
经过使用SGD优化
loss:损失类型 *
fit_intercept:是否计算偏置
learning_rate : string, optional
学习率填充
'constant': eta = eta0
'optimal': eta = 1.0 / (alpha * (t + t0)) [default]
'invscaling': eta = eta0 / pow(t, power_t)
power_t=0.25:存在父类当中
SGDRegressor.coef_:回归系数
SGDRegressor.intercept_:偏置
示例: 波士顿房价预测
数据集来源:UCI datasets
分析
回归当中的数据大小不一致,会致使结果影响较大,因此须要作标准化处理,同时对目标值也须要作标准化处理。
1. 数据分割与标准化处理
2. 回归预测
3. 线性回归的算法效果评估
回归性能评估
均方偏差(Mean Squared Error)MSE)评价机制:
yi为预测值,¯y为真实值
回归性能评估的sklearn API:
sklearn.metrics.mean_squared_error(y_true, y_pred)
均方偏差回归损失
y_true:真实值
y_pred:预测值
return:浮点数结果
完整代码:
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import (
LinearRegression,
SGDRegressor
)
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_boston
def mylinearregression():
"""
线性回归预测房价
:return:
"""
lb = load_boston()
# 对数据集进行划分
x_train, x_test, y_train, y_test = train_test_split(
lb.data, lb.target, test_size=0.3, random_state=24
)
# 须要作标准化处理对于特征值处理
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.fit_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))
y_test = std_y.inverse_transform(y_test)
# 使用线性模型进行预测 使用正规方程求解
lr = LinearRegression()
lr.fit(x_train, y_train)
y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
print("正规方程预测的结果为:", y_lr_predict)
print("正规方程的均方偏差为:", mean_squared_error(y_test, y_lr_predict))
# 梯度降低进行预测
sgd = SGDRegressor()
sgd.fit(x_train, y_train)
print("SGD的权重参数为:", sgd.coef_)
y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
print("SGD的预测的结果为:", y_sgd_predict)
print("SGD的均方偏差为:", mean_squared_error(y_test, y_sgd_predict))
return None
mylinearregression()
执行结果
梯度降低预测方法:
SGDRegressor()
def __init__(self, loss="squared_loss", penalty="l2", alpha=0.0001,
l1_ratio=0.15, fit_intercept=True, max_iter=None, tol=None,
shuffle=True, verbose=0, epsilon=DEFAULT_EPSILON,
random_state=None, learning_rate="invscaling", eta0=0.01,
power_t=0.25, early_stopping=False, validation_fraction=0.1,
n_iter_no_change=5, warm_start=False, average=False,
n_iter=None):
经过调参,能够找到学习率效果更好的值
线性回归的两种优化方法对比:
梯度降低 | 正规方程 |
---|---|
须要选择学习率 | 不须要 |
须要迭代求解 | 一次运算得出 |
特征数量较大可使用 | 须要计算方程,时间复杂度高O(n3) |
适用范围: