这虽然是篇关于算法的学习笔记,但主要是在机器学习的范畴内的算法学习,同时这也是我正式入门机器学习的第一篇学习笔记,所以这里首先介绍一下机器学习的有关概念
机器学习概念介绍
- 有监督学习
它从有标记的训练数据中推导出预测函数。有标记的训练数据是指每个训练实例都包括输入和期望的输出。一句话:给定数据,预测标签。
- 无监督学习
它从无标记的训练数据中推断结论。最典型的无监督学习就是聚类分析,它可以在探索性数据分析阶段用于发现隐藏的模式或者对数据进行分组。一句话:给定数据,寻找隐藏的结构。
- 泛化能力
机器学习算法对新鲜样本的适应能力。
- 过拟合(overfitting)、欠拟合(underfitting)
过拟合是指由于模型学习能力太强导致模型将训练样本的大部分特征(包括特殊的特征)学习到,从而使得模型不具有良好的泛化能力,造成对新样本的预测结果不理想。
欠拟合是指由于模型学习能力不强导致模型未能完全学习到训练样本的基本特征,从而也使得学得模型预测不够准确。
- 偏差、方差、残差
偏差是指预测结果偏离真实结果的程度,其刻画了学习算法本身的拟合能力。
方差度量了同样大小的训练集的变动所导致的学习性能的变化,即反映的是训练集的变动对模型预测结果变化的波动程度。
残差是指预测结果与真实结果之间的差异。其虽然与偏差定义相接近,但是两者的区别在于偏差主要反映模型的拟合程度,此时模型还没有正式确定,评判的是这个模型是否是较合适的模型。而残差是在模型确立的情况下反映与真实值之间的差异程度。
- 交叉验证
交叉验证法(cross validation)是模型的评估与选择中的一种评估方法。通常,我们对学习器的泛化误差进行评估进而做出选择(实际上也要考虑时间开销、存储开销、可解释性等方面的因素)。交叉验证也叫 “K折交叉验证”,其评估结果的稳定性和保真性在很大程度上取决于K。
线性回归原理
首先说一下回归模型,回归模型表示从输入变量到输出变量之间映射的函数,回归问题的学习等价于函数拟合:选择一条函数曲线使其很好地拟合已知数据且很好地预测未知数据。线性回归是回归问题中的一类,其拟合函数曲线是一条直线。
基本形式
给定由n个属性描述的示例
x
=
(
x
1
;
x
2
;
.
.
.
;
x
n
)
\textbf{x}=(x_1;x_2;...;x_n)
x=(x1;x2;...;xn),其中
x
i
x_i
xi是
x
\textbf{x}
x在第
i
i
i个属性上的取值,线性回归试图学得一个通过属性的线性组合来进行预测的函数
f
(
x
)
=
w
1
x
1
+
w
2
x
2
+
.
.
.
+
w
n
d
x
n
+
b
f(x)=w_1x_1+w_2x_2+...+w_ndx_n+b
f(x)=w1x1+w2x2+...+wndxn+b
写成矩阵形式为
f
(
x
)
=
w
T
x
+
b
f(x)=\textbf{w}^T\textbf{x}+b
f(x)=wTx+b
其中,
w
=
(
w
1
;
w
2
;
.
.
.
;
w
n
)
\textbf{w}=(w_1;w_2;...;w_n)
w=(w1;w2;...;wn)
或者写成
f
(
x
)
=
w
T
x
f(x)=\textbf{w}^T\textbf{x}
f(x)=wTx
其中,
w
=
(
w
1
;
w
2
;
.
.
.
;
w
n
;
b
)
,
x
=
(
x
1
;
x
2
;
.
.
.
;
x
n
;
1
)
\textbf{w}=(w_1;w_2;...;w_n;b),\textbf{x}=(x_1;x_2;...;x_n;1)
w=(w1;w2;...;wn;b),x=(x1;x2;...;xn;1)
所以,只要确定 w 和 b之后,模型就确定了。
参数估计
给定数据集
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
m
,
y
m
)
}
D=\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\}
D={(x1,y1),(x2,y2),...,(xm,ym)}
如何确定w和b呢,一般我们通过均方误差最小化来确定。
即
(
w
∗
,
b
∗
)
=
a
r
g
m
i
n
(
w
,
b
)
∑
i
=
1
m
(
f
(
x
i
)
−
y
i
)
2
(\textbf{w}^*,b^*)=arg min_{(w,b)} \sum_{i=1}^m(f(x_i)-y_i)^2
(w∗,b∗)=argmin(w,b)i=1∑m(f(xi)−yi)2
这就是所谓的最小二乘法(least squares)
下面可以通过偏导求驻点来得到
w
∗
,
b
∗
w^*,b^*
w∗,b∗
即
w
∗
=
∑
i
=
1
m
y
i
(
x
i
−
x
ˉ
)
∑
i
=
1
m
x
i
2
−
1
m
(
∑
i
=
1
m
x
i
)
2
w^*=\frac{\sum_{i=1}^{m}y_i(x_i-\bar{x})}{\sum_{i=1}^{m}x_i^2-\frac{1}{m}(\sum_{i=1}^{m}x_i)^2}
w∗=∑i=1mxi2−m1(∑i=1mxi)2∑i=1myi(xi−xˉ)
b
=
1
m
∑
i
=
1
m
(
y
i
−
w
x
i
)
b=\frac{1}{m}\sum_{i=1}^{m}(y_i-wx_i)
b=m1i=1∑m(yi−wxi)
其中,
x
ˉ
=
1
m
∑
i
=
1
m
x
i
\bar{x}=\frac{1}{m}\sum_{i=1}^{m}x_i
xˉ=m1i=1∑mxi
线性回归损失函数、代价函数、目标函数
- 损失函数(Loss Function)
损失函数是定义在单个样本上的,计算的是一个样本的误差 - 代价函数(Cost Function)
代价函数是定义在整个训练集上,是所有样本误差的平均,也就是损失函数的平均。 - 目标函数(Object Function)
目标函数定义为 代价函数+正则化项
也有很多地方,损失函数和代价函数是等价的,因此不用纠结于什么时候用损失函数、什么时候用代价函数,包括有时候有些目标函数和损失函数、代价函数也相等。
目标函数就是上面参数估计中的均方误差,我们通过最小化目标函数来最终确定模型中的参数。
所以普通的线性回归中的损失函数、代价函数、目标函数是一样的,就是上面的均方误差。
优化方法
梯度下降法
利用梯度下降法我们可以通过迭代更新求的函数的局部最小值,这样就可以达到最小化目标函数,从而确定模型的参数的目的。
基本形式为
θ
k
+
1
=
θ
k
−
α
∇
J
(
θ
)
\theta_{k+1}=\theta_k-\alpha \nabla J(\theta)
θk+1=θk−α∇J(θ)
其中,
θ
k
+
1
,
θ
k
\theta_{k+1},\theta_k
θk+1,θk是待估参数的前后项,
α
\alpha
α是需要我们设置的步长,
∇
J
(
θ
)
\nabla J(\theta)
∇J(θ)是梯度.
当迭代更新至梯度为0时,就可以得到局部最小值(一般认为就是最小值,反正现在我是这么认为得),从而求得参数值。
牛顿法
和梯度下降法一样,牛顿法也是寻找导数为0的点,同样是一种迭代法。核心思想是在某点处通过泰勒展开式展开成二次函数并用二次函数来近似目标函数,得到导数为0的方程,求解该方程,得到下一个迭代点。因为是用二次函数近似,因此可能会有误差,需要反复这样迭代,直到到达导数为0的点处。
迭代公式如下:
x
t
+
1
=
x
t
−
f
′
(
x
t
)
f
′
′
(
x
t
)
x_{t+1}=x_t-\frac{f'(x_t)}{f''(x_t)}
xt+1=xt−f′′(xt)f′(xt)
给定初始迭代点x0,反复用上面的公式进行迭代,直到达到导数为0的点或者达到最大迭代次数,就能确定参数的值了
线性回归的评估指标
线性回归的评估指标有MSE, RMSE, MAE,R2_score
- MSE(均方误差 Mean squared error)
M S E = 1 m ∑ i = 1 m ( y t e s t ( i ) − y ^ t e s t ( i ) ) 2 MSE=\frac{1}{m}\sum_{i=1}^{m}(y_{test}^{(i)}-\hat{y}_{test}^{(i)})^2 MSE=m1i=1∑m(ytest(i)−y^test(i))2
2.RMSE(均方根误差 Root mean squared error)
R
M
S
E
=
1
m
∑
i
=
1
m
(
y
t
e
s
t
(
i
)
−
y
^
t
e
s
t
(
i
)
)
2
RMSE=\sqrt{\frac{1}{m}\sum_{i=1}^{m}(y_{test}^{(i)}-\hat{y}_{test}^{(i)})^2}
RMSE=m1i=1∑m(ytest(i)−y^test(i))2
3.MAE(平均绝对误差 Mean absolute error)
M
A
E
=
1
m
∑
i
=
1
m
∣
y
t
e
s
t
(
i
)
−
y
^
t
e
s
t
(
i
)
∣
MAE=\frac{1}{m}\sum_{i=1}^{m}|y_{test}^{(i)}-\hat{y}_{test}^{(i)}|
MAE=m1i=1∑m∣ytest(i)−y^test(i)∣
4.R2_score(R方值)
R
2
=
1
−
∑
i
(
y
^
(
i
)
−
y
(
i
)
)
2
∑
i
(
y
ˉ
−
y
(
i
)
)
2
R^2=1-\frac{\sum_i(\hat{y}^{(i)}-y^{(i)})^2}{\sum_i(\bar{y}-y^{(i)})^2}
R2=1−∑i(yˉ−y(i))2∑i(y^(i)−y(i))2
sklearn参数略谈
from sklearn import linear_model
reg = linear_model.LinearRegression()
reg.fit(data)
reg.coef_
sklearn库中的linear_model模块有线性回归的函数可以调用,并且只要通过fit()方法就能非常轻松的拟合,得到线性回归模型,然后可以通过coef_属性参看模型的参数值。
参考资料