1. 单变量线性回归
1.1. 假设函数
h
(
x
)
=
θ
0
+
θ
1
x
h(x) = θ_0 + θ_1x
h(x)=θ0+θ1x
其中,x是特征,因为我们是单变量,所以只有一个特征
θ
0
θ_0
θ0和
θ
1
θ_1
θ1是需要学习的参数,刚开始可以随机给两个值
h
(
x
)
h(x)
h(x)是预测的结果
工作流程:根据特征x,通过这个模型,预测出 h ( x ) h(x) h(x)的结果
1.2. 目标函数
我们刚开始的
θ
0
θ_0
θ0和
θ
1
θ_1
θ1是随机的,需要通过梯度下降来使我们的误差更小,这里的误差我们指的是平均均方误差
我们要通过梯度下降,最小化这个值。
m:一共有m个训练样本
h
θ
(
x
i
)
h_θ(x^i)
hθ(xi):表示假设方程求出的预测值
i:表示第i个样本
y
i
y^i
yi:表示第i个样本的真实值
简单来说,就算对每一个样本求出,预测值和真实值的误差的平方,再相加,乘以
1
/
2
m
1/2m
1/2m,我们要使得这个式子的值最小。
我们可以吧这个函数写成这样
1.3. 梯度下降
步骤:
- 随机设置 θ 向 量 θ向量 θ向量,我们通常把全部 θ i θ_i θi设置为0,以单变量线性回归为例,我们设置 θ 0 = 0 , θ 1 = 0 θ_0=0,θ_1=0 θ0=0,θ1=0
- 持续改变 θ i θ_i θi的值,直到收敛( θ i θ_i θi趋近于一个值,不再改变)
梯度下降公式:
学习率(
α
α
α):每一次迈出多大的步子,当学习率过小,梯度下降会很慢,当学习率过大,梯度下降将无法收敛甚至发散
θ
j
θ_j
θj减去代价函数求对
θ
j
θ_j
θj求偏导乘以学习率(
α
α
α)得到的值,把这个值赋值给
θ
j
θ_j
θj,完成一次修改。
每一轮都要先把所有
θ
i
θ_i
θi都修改了,所有
θ
i
θ_i
θi都必须同时更新,才能进行下一轮修改,例如这样:
1.3.1. 手推偏导
1.4. sklearn实现
根据房屋住宅用地所占比例(ZN),预测房屋的价格
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn import metrics
boston = load_boston()
df = pd.DataFrame(boston.data,columns=boston.feature_names)['ZN']
x_train, x_test, y_train, y_test = train_test_split(df, boston.target, test_size=0.2)
x_train = pd.DataFrame(x_train)
y_train = pd.DataFrame(y_train)
x_test = pd.DataFrame(x_test)
y_test = pd.DataFrame(y_test)
linreg = LinearRegression()
linreg.fit(x_train,y_train)
y_pred = linreg.predict(x_test)
print('MSE:',metrics.mean_squared_error(y_test,y_pred))
print('RMSE:',np.sqrt(metrics.mean_squared_error(y_test,y_pred)))
2. 多元线性回归
2.1. 假设函数
假设我们有四个特征,那么线性回归方程是这样的
h
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
θ
3
x
3
+
θ
4
x
4
h(x)=θ_0 + θ_1x_1 + θ_2x_2 + θ_3x_3 + θ_4x_4
h(x)=θ0+θ1x1+θ2x2+θ3x3+θ4x4
在此基础上,我们可以添加一个特征
x
0
=
1
x_0=1
x0=1,这样我们的特征向量就是
x
=
[
x
0
,
x
1
,
x
2
,
x
3
,
x
4
]
x=[x_0,x_1,x_2,x_3,x_4]
x=[x0,x1,x2,x3,x4]
参数向量就是
θ
=
[
θ
0
,
θ
1
,
θ
2
,
θ
3
,
θ
4
]
θ=[θ_0,θ_1,θ_2,θ_3,θ_4]
θ=[θ0,θ1,θ2,θ3,θ4]
这样我们可以得到:
h
(
x
)
=
θ
T
x
h(x) = θ^Tx
h(x)=θTx
2.2. 代价函数
2.3. 目标函数
这是我们梯度下降的函数
x
j
i
x_j^i
xji表示第i个样本的第j个特征
梯度下降每一个
θ
θ
θ
2.4. 特征缩放
当样本中的不同特征的值相近的时候,梯度下降的速度会很快,所以我们可以用特征缩放来使得不同特征的值相近
例如我们有两个特征:
x
1
=
房
屋
面
积
(
0
,
2000
)
m
2
x_1=房屋面积(0,2000)m^2
x1=房屋面积(0,2000)m2
x
2
=
卧
室
的
个
数
(
1
,
,
5
)
个
x_2=卧室的个数(1,,5)个
x2=卧室的个数(1,,5)个
这个时候,
J
(
θ
)
J(θ)
J(θ)是一个关于
θ
0
,
θ
1
,
θ
2
θ_0,θ_1,θ_2
θ0,θ1,θ2的方程,但是我们现在忽略掉
θ
0
θ_0
θ0,我们画出
J
(
θ
)
J(θ)
J(θ)关于
θ
1
,
θ
2
方
程
的
图
像
θ_1,θ_2方程的图像
θ1,θ2方程的图像
当
x
1
x_1
x1和
x
2
x_2
x2的差值越大的时候,椭圆形越长,那么梯度下降想要降到中点所需要的时间就越多。
但是当我们改变一下,把特征的每一个值除以当前特征的最大值,那么特征间的差值就不会很大,这样的话我们得到的图形就很接近一个圆,梯度下降就会更快
在我们进行特征缩放的时候,通常把特征控制在
[
−
3
,
+
3
]
[-3,+3]
[−3,+3]
2.5. 归一化
将每个特征值变成
(
x
i
−
μ
i
)
/
s
i
(x_i - μ_i)/s_i
(xi−μi)/si,这样的值要在
[
−
0.5
,
0.5
]
[-0.5,0.5]
[−0.5,0.5]
x
i
x_i
xi:特征值
μ
i
μ_i
μi:平均值
s
i
s_i
si:标准差(
最
大
值
−
最
小
值
最大值-最小值
最大值−最小值)
例如房子的面积平均是1000,卧室个数平均是2,可以得到这个式子
2.6. 学习率
学习率是为了梯度下降正常工作的,梯度下降是用来选择
θ
θ
θ,使得
J
(
θ
)
J(θ)
J(θ)最小,我们画出随着梯度下降的迭代次数,
J
(
θ
)
J(θ)
J(θ)的值的图形
学习率过大会导致得到越来越糟糕的结果,画出图形是这样的
学习率过小,又会导致梯度下降的速度太慢
2.7. 正规方程
我们可以提供一个一次性就能找到
θ
θ
θ的值的方法,那就是让
J
(
θ
)
J(θ)
J(θ)最小化,对
J
(
θ
)
J(θ)
J(θ)求偏导,再把导数的值等于0,解出
θ
θ
θ的值就行了
3. Logistic回归
Logistic回归是一种用于二分类的算法,在面试题也会考到,所以手推Logistic回归,是很必要的
3.1. 假设函数
其实逻辑回归的假设函数就是线性回归的假设函数再加上一个sigmod函数
线性回归:
h
(
x
)
=
θ
T
x
h(x)=θ^Tx
h(x)=θTx
逻辑回归:
h
(
x
)
=
g
(
θ
T
x
)
h(x)=g(θ^Tx)
h(x)=g(θTx)
g
(
z
)
的
定
义
是
g(z)的定义是
g(z)的定义是
当
z
>
0
z>0
z>0,从图像上看,
g
(
z
)
>
0.5
g(z)>0.5
g(z)>0.5
画出
g
(
z
)
g(z)
g(z),是这样的
从图中,我们可以看出,不管z取多少,
g
(
z
)
g(z)
g(z)的值都在
(
0
,
1
)
(0,1)
(0,1),大于0.5的时候,样本为正类,小于0.5的时候样本为父类
完整的Logistic回归的假设函数:
在给定x的条件下,y=1的概率,可以写成这样
我们有个这样的图
假设我们已经得到了
θ
θ
θ,并且
θ
0
=
−
3
,
θ
1
=
1
,
θ
2
=
1
θ_0=-3,θ_1=1,θ_2=1
θ0=−3,θ1=1,θ2=1,所以,我们可以写出假设函数
h
θ
(
x
)
=
g
(
−
3
+
x
1
+
x
2
)
h_θ(x)=g(-3+x_1+x_2)
hθ(x)=g(−3+x1+x2)
当
−
3
+
x
1
+
x
2
>
0
-3+x_1+x_2>0
−3+x1+x2>0时,我们预测为正类,这样我们就可以在图上画出分界线了
这条线被称为决策边界,其实决策边界说白了,就是
z
=
0
z=0
z=0的这个函数
3.2. 目标函数
我们把线性回归代价函数换一种写法
但是这个代价函数不适用于Logistic回归,所以我们找到了另一个代价函数
我们画出前半部分的函数,当
y
=
1
y=1
y=1,当预测值为1的时候,我们发现代价函数等于0,因为我们没有出现误差
我们画出后半部分的函数
为了避免把代价函数分成两个来写,我们可以把他们合并成这样一个函数
也就是这样
C
o
s
t
(
h
θ
,
y
)
Cost(h_θ,y)
Cost(hθ,y)
=
−
y
l
o
g
(
h
θ
(
x
)
)
−
(
1
−
y
)
l
o
g
(
1
−
h
θ
(
x
)
)
=-ylog(h_θ(x)) - (1-y)log(1-h_θ(x))
=−ylog(hθ(x))−(1−y)log(1−hθ(x))
我们现在可以写出完整的代价函数
为了减小这个误差,我们还是要用到梯度下降
3.3. 多元分类
Logistic回归是一个二分类的算法,那么如何用他来解决多分类问题呢?
我们可以用“一对多”的方法,也就是说把样本分成正类和其他类。这样的话,我们用三个Logistic回归就能区分这三个类别了。
4. 过拟合问题
4.1. 过拟合定义
在训练集上表现很好,在测试集上表现不好,模型过于复杂,并且只适用于训练集
4.2. 过拟合解决
我们的目的就是要让
J
(
θ
)
J(θ)
J(θ)变小,那我们改变一下我们的
J
(
θ
)
J(θ)
J(θ),在后面添加一些东西
当我们要最小化这个式子的时候,
θ
3
θ_3
θ3和
θ
4
θ_4
θ4就会很小很小,这样的话,他们对函数的影响也就会很小,但是不至于没有。
例如一个函数
h
(
x
)
=
θ
0
+
θ
1
x
h(x)=θ_0+θ_1x
h(x)=θ0+θ1x,当
θ
θ
θ接近0的时候,这个函数越接近
h
(
x
)
=
0
h(x)=0
h(x)=0的这条直线。
所以我们都要给代价函数增加一个正则项,用来减小所有
θ
θ
θ的值
但是若正则化参数
λ
λ
λ被设置的太大的话,那么所有
θ
θ
θ对函数的影响会很小,函数会是接近一条直线,,会是这样的效果
我们在梯度下降中,加上这个正则化
我们再把下面这个方程变形