数据驱动 = 数据 + 模型
模型 = 假设函数(f)+ 优化
优化 = loss function + optimization algorithm
A.单变量线性回归
为了测试机器学习算法的效果,通常使用两套独立的样本集:训练集和测试集。当机器学习程序开始运行时,使用训练集作为算法的输入,训练完成之后的那个东西叫模型,我们可以借助模型,通过输入测试集来预测目标变量。比较预测出来的目标变量和实际目标变量之间的差别,就可以算出算法的实际精确度。
为了描述训练集,我们一般做以下规定:
𝑚 代表训练集中实例的数量
𝑥 代表特征/输入变量
𝑦 代表目标变量/输出变量
(𝑥, 𝑦) 代表训练集中的实例
代表第𝑖 个观察实例
ℎ 代表学习算法的解决方案或函数也称为假设(hypothesis)
表达方式为:ℎ𝜃 (𝑥) = 𝜃0 + 𝜃1𝑥
我们用假设函数来表示我们预测结果的模型,但模型有好坏和差异,这里我们用损失函数来表示:
通过训练集我们可以得到假设函数h,即我们建立的模型,y是测试集。通过输入测试集的自变量向函数h和y,得出预测出来的结果与实际的结果,让两者相减得到误差,通过误差可以看出我们预测的结果好还是不好,如果误差小于某一个极小数时,我们可以认为我们建立的模型非常成功,反之则是失败。求和的目的是把所有预测值的误差加起来,平方的目的是保证求和的时候,误差是正数,除以m是求平均误差,除以2是为了今后对代价函数求导方便的一种手段。
EG:
该图以点(1,1),(2,2),(3,3)作为数据集,我们要找到的假设函数要尽量拟合该数据,假设我们这里有两个假设函数 h1 = 1/2x 和 h2 = x ,对应的损失函数分别为 J1(0,0.5),J(0,1) ,通过对比这两个式子可知,当取损失函数最小值时,误差最小,假设函数拟合的最好。
这里介绍一种求损失函数最小值常用的一种方法:梯度下降(迭代法)
推导:
α(学习率)不应过大,可能跳过最低点,过小时间消耗多,速度慢,α为超参数
𝑎是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向 向下迈出的步子有多大,在批量梯度下降中,我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数。
批量梯度下降的具体实现的步骤如下所示:
先初始化当前所在位置,根据公式计算出梯度下降一步之后的位置,然后再以此位置为基础,让参数值减去学习率乘以该点的导数,得出再梯度下降一步之后的位置,即新的参数值。重复上面的步骤直到走到最低点。在此过程中,我们发现随着梯度下降法的运行,点移动的幅度会越来越小,这是因为,点越往下走,导数的值越小,而a不变,所以步幅会减小。
ps:过拟合问题(难):如果我们有非常多特征/模型很复杂,我们的假设函数曲线可以对原始数据拟合的非常好(即损失函数值约等于0),但丧失了一般性,从而对新的待预测样本预测效果差。
⽋拟合与过拟合实例:
import numpy as np
import scipy as sp
from scipy.optimize import leastsq
import matplotlib.pyplot as plt
%matplotlib inline
def real_func(x):
return np.sin(2 * np.pi * x)
def fit_func(p, x):
f = np.poly1d(p)
return f(x)
def residuals_func(p, x, y):
ret = fit_func(p, x) - y
return ret
x = np.linspace(0, 1, 10)
x_points = np.linspace(0, 1, 1000)
y_ = real_func(x)
y = [np.random.normal(0, 0.1) + y1 for y1 in y_]
def fitting(M=0):
p_init = np.random.rand(M + 1)
p_lsq = leastsq(residuals_func, p_init, args=(x, y))
print('Fitting Parameters:', p_lsq[0])
def fitting(M=0):
p_init = np.random.rand(M + 1)
p_lsq = leastsq(residuals_func, p_init, args=(x, y))
print('Fitting Parameters:', p_lsq[0])
plt.plot(x_points, real_func(x_points), label='real')
plt.plot(x_points, fit_func(p_lsq[0], x_points), label='fitted curve')
plt.plot(x, y, 'bo', label='noise')
plt.legend()
return p_lsq
p_lsq_0 = fitting(M=0)
p_lsq_1 = fitting(M=1)
p_lsq_3 = fitting(M=3)
M = 0
M = 1
M = 3
正则化:控制参数幅度,限制参数搜索空间
正则化和逻辑(斯蒂)回归后面会讲
B.多变量线性回归
相较于单变量线性回归,多变量线性回归对模型增加了更多的特征
增加规定:
n 代表特征的数量
代表特征矩阵中第 𝑖 行的第 𝑗 个特征,也就是第 𝑖 个训练实例的第 𝑗 个特征。
假设函数表示方式为:
这个公式中有n+1个参数和n个变量,为了能够使公式简化一些,引入X0=1(表示截距项),则公式转化为:
此时该模型中的参数和变量都是n+1维的向量(向量化表示),可以写成如下的形式:
最小化多元损失函数:
模型策略
损失函数:度量模型预测错误的程度,是模型的预测输出𝑓 (𝐗)和实际输出𝑌 的⾮负实值函数,记作𝐿 (𝑌 , 𝑓 (𝐗))。
0-1损失函数
𝐿 (𝑌 , 𝑓 (𝐗)) = {1, 𝑌 ≠ 𝑓 (𝐗)
0, 𝑌 = 𝑓 (𝐗)
= 𝐼(𝑌 ≠ 𝑓 (𝐗))
其中,𝐼 (⋅) 是指示函数,当括号中条件成⽴返回 1,否则返回 0。
平⽅损失函数
𝐿 (𝑌 , 𝑓 (𝐗)) = (𝑌 − 𝑓 (𝐗) ^ 2
绝对值损失函数
𝐿 (𝑌 , 𝑓 (𝐗)) = |𝑌 − 𝑓 (𝐗)|
对数似然损失函数
𝐿 (𝑌 , 𝑃 (𝑌 |𝐗)) = − log 𝑃 (𝑌 |𝐗)