线性回归
分类: 目标值离散
回归: 目标值连续
线性回归:寻找一种能预测的趋势
线性关系:
-二维:直线关系
-三维:平面
线性关系定义
y = k x + b y = kx + b y=kx+b
参数b,偏置项,为了对于单个特征的情况更加通用
参数k,权重
f ( x ) = w 1 x 1 + w 2 x 2 + . . . + w d x d + b f(x) = w_1x_1 + w_2x_2 +...+ w_dx_d + b f(x)=w1x1+w2x2+...+wdxd+b
线性回归定义:
线性回归通过一个或多个自变量与因变量之间进行建模的回归分析
一元线性回归:变量只有一个
多元线性回归:变量两个或以上
通用公式:
h
(
w
)
=
w
0
+
w
1
x
1
+
w
2
x
2
+
.
.
.
=
w
T
x
h(w) = w_0 + w_1x_1 + w_2x_2 + ... = w^Tx
h(w)=w0+w1x1+w2x2+...=wTx
其中w,x为矩阵
w
=
(
w
0
w
1
w
2
)
w = \begin{pmatrix} w_0 \\ w_1 \\ w_2 \end{pmatrix}
w=⎝⎛w0w1w2⎠⎞,
x
=
(
1
x
1
x
2
)
x = \begin{pmatrix} 1 \\ x_1 \\ x_2 \end{pmatrix}
x=⎝⎛1x1x2⎠⎞
属性和权重的组合来预测结果
矩阵
数组 矩阵
0维 1
1维 [1, 2, 3]
2维 [ 必须是二维的
[1, 2, 3], 满足了特定的运算要求
[4, 5, 6]
]
3维 [[
[1, 2, 3],
[4, 5, 6]
],[
[1, 2, 3],
[4, 5, 6]
]]
数组的运算:加法,乘法
numpy.ndarray
矩阵乘法:
(m行,l列) * (l行,n列) = (m行,n列)
特征值 权重 目标值
[[1, 2, 3, 4]] [[1], [2], [3], [4]] 一个样本一个值
(1, 4) (4, 1) (1,1)
(100, 4) (4, 1) (100,1)
数组相乘
import numpy as np
a = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[1, 4, 3, 5]
]
b = [2, 2, 2, 2]
np.multiply(a, b)
Out[5]:
array([[ 2, 4, 6, 8],
[10, 12, 14, 16],
[ 2, 8, 6, 10]])
矩阵相乘
import numpy as np
a = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[1, 4, 3, 5]
]
c = [
[2],
[2],
[2],
[2]
]
np.dot(a, c)
Out[9]:
array([[20],
[52],
[26]])
线性回归
求函数中的参数w,使得损失函数最小
迭代的算法
损失函数(误差大小)
f
(
a
)
=
(
h
w
(
x
1
)
−
y
1
)
2
+
(
h
w
(
x
2
)
−
y
2
)
2
+
.
.
.
+
(
h
w
(
x
m
)
−
y
m
)
2
f(a)=(h_w(x_1)-y_1)^2 + (h_w(x_2)-y_2)^2 + ... +(h_w(x_m)-y_m)^2
f(a)=(hw(x1)−y1)2+(hw(x2)−y2)2+...+(hw(xm)−ym)2
f
(
a
)
=
∑
i
=
1
m
(
h
w
(
x
i
)
−
y
i
)
2
f(a) = \sum_{i=1}^{m}(h_w(x_i)-y_i)^2
f(a)=i=1∑m(hw(xi)−yi)2
y
i
y_i
yi 为第i个训练样本的真实值
h
w
(
x
i
)
h_w(x_i)
hw(xi) 为第i个训练赝本特征值组合预测函数
又称为最小二乘法
尽量去减少损失,算法的自我学习过程
算法 策略(损失函数) 优化
线性回归 误差平方和 正规方程
最小二乘法 梯度下降
最小二乘法之正规方程
w = ( X T X ) − 1 X T y w = (X^TX)^{-1}X^Ty w=(XTX)−1XTy
X
X
X 为特征矩阵
y
y
y 为目标值矩阵
缺点:当特征过于复杂,求解速度太慢
X T X^T XT 转置
X
−
1
X^-1
X−1 求逆 ->
X
∗
?
=
单
位
矩
阵
X * ? = 单位矩阵
X∗?=单位矩阵
单位矩阵
[
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]
]
最小二乘法之梯度下降
方向
d
=
b
c
o
s
t
(
w
0
+
w
1
x
1
)
b
w
1
d = \frac{bcost(w0+w1x1)}{bw1}
d=bw1bcost(w0+w1x1)
w
1
:
=
−
w
1
−
a
d
w1 := -w1 -ad
w1:=−w1−ad
w
0
:
=
−
w
0
−
a
d
w0 := -w0 -ad
w0:=−w0−ad
a是学习速率
沿着这个函数下降的方向找,最后就能找到山谷的最低点,然后更新w值
使用:面对训练数据规模十分庞大的任务
线性回归API
普通最小二乘线性回归
sklearn.linear_model.LinearRegression
coef_ 回归系数
使用SGD最小线性模型
sklearn.linear_model.SGDRegressor
coef_ 回归系数
scikit-learn
优点:封装好,建立模型简单,预测简单
缺点:算法过程,参数都在算法内部优化
v0.18
v0.19 转换器 estimator 要求数据必须是二维数据
reshape(-1, 1)
TensorFlow
封装高低都有,自己实现线性回归
回归性能评估
均方误差(Mean Squared Error)MSE评价机制
M
S
E
=
1
m
∑
i
=
1
m
(
y
i
−
y
−
)
2
MSE=\frac{1}{m}\sum_{i=1}^{m}(y^i-y^-)^2
MSE=m1i=1∑m(yi−y−)2
y
i
y^i
yi预测值
y
−
y^-
y−真实值
梯度下降和正规方程区别
梯度下降 | 正规方程 |
---|---|
需要选择学习率a | 不需要 |
需要多次迭代 | 一次运算得出 |
当特征数据量n大时能较好适用 | 如果特征数量n较大则运算代价较大 |
适用于各种类型的模型 | 只适用于线性模型,不适合逻辑回归模型 |
大规模数据 | 小规模数据,过拟合 |
代码示例
# -*- coding: utf-8 -*-
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 加载数据
boston = load_boston()
# 训练集,测试集拆分
X_train, X_test, y_train, y_test = train_test_split(
boston.data, boston.target, test_size=0.25)
# 数据标准化处理
# 特征值 标准化
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))
# 正规方程 线性回归预测
lr = LinearRegression()
lr.fit(X_train, y_train)
print(lr.coef_)
y_lr_predict = std_y.inverse_transform(lr.predict(X_test))
print(y_lr_predict)
# 梯度下降 线性回归预测
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)
# 性能评估 均方误差
lr_mse = mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict)
sgd_mse = mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict)
print(lr_mse) # 28.97
print(sgd_mse) # 31.36