机器学习理论基础
本节概要
因地制宜(模型选择与模型评估)
模型的成本及成本函数的含义
评价一个模型好坏的标准
学习曲线,以及用学习曲线来对模型进行诊断
通用的模型优化方法
其他模型评价标准
模型选择与模型评估
模型选择
世间万物千变万化,问题方法万千多样。我们应如何去面对和选择相应的算法和调整参数呢?这就是机器学习中的 模型选择(model selection) 问题。理想情况当然是我们的模型在面对新数据的时候能够做出完全正确的判断,但退而求其次,我们只能去寻找泛化能力最强,泛化误差最小的模型。这时,我们 模型的选择标准 就等价于 选择一个泛化误差最小的模型 ,但由于上节我们提到的过拟合问题,这个等价问题就明显不成立了。这就很头疼了!
一、要泛化误差小的模型。
二、又不能太过,防止出现过拟合问题。
这个问题就需要一个专门的模型评估方法来解决了。
过拟合和欠拟合问题
过拟合(overfitting) 是指模型能够很好的拟合训练样本,但对新数据的预测准确性很差。
原因:经常是由于学习能力过强大,以至于把训练样本所包含的几乎所有特性都学了。(即囊括了数据中几乎所有细节,但一般多多少少会有一些无关紧要的数据特性)
解决方法:将在例子结尾提出。
欠拟合 (underfitting)是指模型不能很好的拟合训练样本,且对新数据的预测准确性也不好。
原因:学习能力低下,模型太过简单了。
解决方法:将在例子结尾提出。
import numpy as np
生成20个点
n_dots = 20
x = np.linspace(0, 1, n_dots) # [0,1]之间创建20个点
y = np.sqrt(x) + 0.2 * np.random.rand(n_dots) - 0.1
训练样本是 y=x−−√+r y = x + r , 其中r是[-0.1,0.1]之间的一个随机数。
然后分别用一阶多项式、三阶多项式和十阶多项式3个模型来拟合这个数据集,得到的结果如图3-1所示。
左边是欠拟合(underfitting),也称为高偏差(high bias),因为我们尝试用一条线来拟合样本数据。右边是过拟合(overfitting),也称高方差(high varivance),用来十阶多项式来拟合数据,虽然模型对现有的数据集拟合得很好,但对新数据预测误差却很大。只有中间的模型较好的拟合了数据集,可以看出虚线和实现基本拟合。
通过例子是为了读者理解过拟合(高方差)和欠拟合(高偏差)。
def plot_polynomial_fit(x, y, order):
p = np.poly1d(np.polyfit(x, y, order))
# 画出拟合出来的多项式所表达的曲线以及原始的点
t = np.linspace(0, 1, 200)
plt.plot(x, y, 'ro', t, p(t), '-', t, np.sqrt(t), 'r--')
return p
plt.figure(figsize=(18, 4), dpi=200)
titles = ['Under Fitting', 'Fitting', 'Over Fitting']
models = [None, None, None]
for index, order in enumerate([1, 3, 10]):
plt.subplot(1, 3, index + 1)
models[index] = plot_polynomial_fit(x, y, order)
plt.title(titles[index], fontsize=20)
for m in models:
print('model coeffs: {0}'.format(m.coeffs))
针对一阶多项式的模型,不同的参数拟合出来的直线和训练样本对应的位置关系
coeffs_1d = [0.2, 0.6]
plt.figure(figsize=(9, 6), dpi=200)
t = np.linspace(0, 1, 200)
plt.plot(x, y, 'ro', t, models[0](t), '-', t, np.poly1d(coeffs_1d)(t), 'r-')
plt.annotate(r'L1: $y = {1} + {0}x$'.format(coeffs_1d[0], coeffs_1d[1]),
xy=(0.8, np.poly1d(coeffs_1d)(0.8)), xycoords='data',
xytext=(-90, -50), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
plt.annotate(r'L2: $y = {1} + {0}x$'.format(models[0].coeffs[0], models[0].coeffs[1]),
xy=(0.3, models[0](0.3)), xycoords='data',
xytext=(-90, -50), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
3.2成本函数
成本是衡量模型与训练样本符合程度的指标。简单地理解,成本针对所有的训练样本,模型拟合出来的值与训练样本的真实值得误差平均值。而成本函数就是成本与模型参数的函数。模型训练的过程,就是找出适合的模型参数,使得成本函数的值最小。成本函数记为J(θ),其中θ表示模型参数。
针对上一节中的例子,我们用一阶多项式来拟合数据,则得到的模型是 y=θ1+θ