1. 统计学习
统计学习(statistical learning)是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科。统计学习也称为统计机器学习(statistical machine learning)。
- 研究对象:数据 Data
- 目的:构建模型,学习数据中的规律,预测未知的新数据
- 方法:监督学习、无监督学习,半监督学习、强化学习、主动学习等
2. 统计学习分类
2.1 基本分类
2.1.1 监督学习 supervised learning
- 数据都是带有标注的
- 本质: 学习输入到输出的映射的统计规律。
2.1.2 无监督学习 unsupervised learning
- 是指从无标注数据中学习预测模型。
- 本质: 学习数据中的统计规律或潜在结构。
2.1.3 强化学习 reinforcement learning
- 是指智能系统在与环境的连续互动中学习最优行为策略的机器学习问题。
- 本质: 学习最优的序贯决策,从一个策略开始,不断的搜索更优的策略。
2.1.4 半监督学习 semi-supervised learning、主动学习 active learning
- 半监督学习(semi-supervised learning)是指利用标注数据和未标注数据学习预测模型的机器学习问题。通常有少量标注数据、大量未标注数据。 半监督学习旨在利用未标注数据中的信息,辅助标注数据,进行监督学习,以较低的成本达到较好的学习效果。
- 主动学习(active learning)是指机器不断主动给出实例让教师进行标注,然后利用标注数据学习预测模型的机器学习问题。 通常的监督学习使用给定的标注数据,往往是随机得到的,可以看作是“被动学习”,主动学习的目标是找出对学习最有帮助的实例让教师标注,以较小的标注代价,达到较好的学习效果。
半监督学习和主动学习更接近监督学习。
2.2 按模型分类
- 概率模型 :决策树、朴素贝叶斯、隐马尔可夫模型、条件随机场、概率潜在语义分析、潜在狄利克雷分配、高斯混合模型
- 非概率模型:感知机、支持向量机、k近邻、AdaBoost、k均值、潜在语义分析,以及神经网络
- 基本概率公式: 加法规则:
乘法规则:
- 线性模型:感知机、线性支持向量机、k近邻、k均值、潜在语义分析
- 非线性: 核函数支持向量机、AdaBoost、神经网络、深度学习
- 参数化模型:模型由优先维参数描述(感知机、朴素贝叶斯、逻辑斯谛回归、k均值、高斯混合模型)
- 非参数化模型:模型参数不固定,随着训练数据增加而增大(决策树、支持向量机、AdaBoost、k近邻、潜在语义分析、概率潜在语义分析、潜在狄利克雷分配)
参数化模型适合问题简单的情况;现实问题比较复杂,非参数化模型更有效。
2.3 按算法分类
- 在线学习(online learning):是指每次接受一个样本,进行预测,之后学习模型,并不断重复该操作。
- 批量学习(batch learning):批量学习一次接受所有数据,学习模型,之后进行预测。
有些场景要求必须是在线的。比如,数据依次达到无法存储,系统需要及时做出处理;数据规模很大,不可能一次处理所有数据;数据的模式随时间动态变化,需要算法快速适应新的模式(不满足独立同分布假设)。
利用随机梯度下降的感知机学习算法就是在线学习算法。
在线学习通常更难,很难学到预测准确率更高的模型,因为每次模型更新中,可利用的数据有限。
2.4 按技巧分类
- 贝叶斯学习(Bayesian learning):后验概率
- 核方法(kernel method):是使用核函数表示和学习非线性模型的一种机器学习方法
核方法可以把线性模型扩展到非线性模型,直接的做法是显式地定义从输入空间(低维空间)到特征空间(高维空间)的映射,在特征空间中进行内积计算。 比如,支持向量机,把输入空间的线性不可分问题转化为特征空间的线性可分问题
3. 统计学习方法三要素
- 模型:输入空间,输出空间,决策函数集合
- 策略:按什么准则选择最优模型
- 损失函数(代价函数):度量预测错误程度,损失越小,模型越好 0-1损失、平方损失、绝对损失、对数损失
- 风险函数:损失函数的期望
- 经验风险最小化:损失最小,样本足够大时,效果好;样本小时,易产生过拟合
- 结构化风险最小化:为防止过拟合,加入正则化项
- 算法:最优化问题的高效迭代求解
4. 模型评估与选择
- 训练误差 & 测试误差
- 过拟合与模型选择 一味追求对训练数据的预测能力,模型的复杂度则往往会比真模型更高。这种现象称为过拟合(over-fitting)。 过拟合是指学习时选择的模型所包含的参数过多,模型对已知数据预测得很好,但对未知数据预测得很差的现象。 模型选择旨在避免过拟合并提高模型的预测能力。
过拟合Python代码
代码语言:javascript复制# -*- coding:utf-8 -*-
# Python 3.7
# @Time: 2020/2/26 23:58
# @Author: Michael Ming
# @Website: https://michael.blog.csdn.net/
# @File: 1.introduction_ploy_fitting.py
# 参考代码:https://github.com/wzyonggege/statistical-learning-method
'''
目标函数 ?=???2?? , 加上一个正态分布的噪音干扰,用M次多项式去拟合
'''
import numpy as np
import scipy as sp
from scipy.optimize import leastsq
import matplotlib.pyplot as plt
# 真实函数
def real_func(x):
return np.sin(2 * np.pi * x) # ???2??
# 多项式拟合函数
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
def fitting(x, x_points, y_, y, 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.title("多项式次数 M=%d" % (M))
plt.rcParams['font.sans-serif'] = 'SimHei' # 消除中文乱码
plt.legend()
plt.show()
return p_lsq
if __name__ == '__main__':
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_] # 加入噪声扰动
p_lsq_0 = fitting(x, x_points, y_, y, 0)
p_lsq_1 = fitting(x, x_points, y_, y, 1)
p_lsq_3 = fitting(x, x_points, y_, y, 3)
p_lsq_9 = fitting(x, x_points, y_, y, 9)
多项式拟合结果 | M=0 | M=1 | M=3 | M=9 |
---|---|---|---|---|
曲线 |
- 9次多项式,完全拟合了所有点,过拟合了
- 加入L2正则项
def residuals_func_regularization(p,x,y,lambd=0.0001):
ret = fit_func(p,x)-y
ret = np.append(ret, np.sqrt(0.5*lambd*np.square(p)))
# 加入L2正则表达式, L1: lambd*abs(p)
return ret
if __name__ == '__main__':
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_] # 加入噪声扰动
p_init = np.random.rand(9 1)
p_lsq_9_regularization = leastsq(
residuals_func_regularization, p_init,args=(x,y))
plt.plot(x_points,real_func(x_points),label='real')
plt.plot(x_points,fit_func(p_lsq_9[0],x_points),label='fitted curve')
plt.plot(x_points,fit_func(p_lsq_9_regularization[0],x_points),label='L2regular')
plt.rcParams['font.sans-serif'] = 'SimHei' # 消除中文乱码
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
plt.plot(x,y,'bo',label='noise')
plt.title("展示L2正则下的9次多项式拟合结果")
plt.legend()
plt.show()
5. 正则化与交叉验证
- 正则化是结构化风险最小化策略的实现;在经验风险上 正则化
- 一般,模型越复杂,正则化值就越大;正则化可以是模型参数向量的范数
- L1、L2 范数介绍
- 交叉验证:在许多实际应用中数据是不充足的。为了选择好的模型,可以采用交叉验证方法。
- 交叉验证的基本想法是重复地使用数据;把给定的数据进行切分,将切分的数据集组合为训练集与测试集,在此基础上反复地进行训练、测试以及模型选择。
- 简单交叉验证 首先随机地将已给数据分为两部分,训练集,测试集(如,70%训练集,30%测试集); 然后用训练集在各种条件下(例如,不同的参数个数)训练模型,得到不同的模型; 在测试集上评价各个模型的测试误差,选出测试误差最小的模型。
- S 折交叉验证 应用最多的是S折交叉验证(S-fold cross validation) 方法如下: 首先随机地将已给数据切分为 S 个互不相交、大小相同的子集; 然后利用 S-1 个子集的数据训练模型,利用余下的子集测试模型; 将这一过程对可能的 S 种选择重复进行; 最后选出 S 次评测中平均测试误差最小的模型。
- 留一交叉验证 S 折交叉验证的特殊情形是 S=N,称为留一交叉验证(leave-one-out cross validation),往往在数据缺乏的情况下使用。这里,N是给定数据集的容量。
6. 泛化能力
学习方法的泛化能力(generalization ability)是指由该方法学习到的模型对未知数据的预测能力,是学习方法本质上重要的性质。
通过测试误差来评价泛化能力。这种评价是依赖于测试数据集。因为测试数据集是有限的,很有可能由此得到的评价结果是不可靠的。
- 泛化误差:模型对未知数据预测的误差
- 泛化误差上界: 学习方法的泛化能力分析往往是通过研究泛化误差的概率上界进行的,简称为泛化误差上界(generalization error bound)。 通过比较两种学习方法的泛化误差上界的大小来比较它们的优劣。 泛化误差上界通常具有以下性质:
- 它是样本容量的函数,当样本容量增加时,泛化上界趋于0;
- 它是假设空间容量(capacity)的函数,假设空间容量越大,模型就越难学,泛化误差上界就越大。
7. 生成模型与判别模型
- 生成方法:由数据学习联合概率分布 P(X,Y) ,然后求出条件概率分布 P(Y|X) 作为预测的模型,即生成模型
- 典型的生成模型:有朴素贝叶斯法、隐马尔可夫模型
- 判别方法:由数据直接学习决策函数 f(X) 或者条件概率分布 P(Y|X) 作为预测的模型,即判别模型。
- 判别方法关心的是对给定的输入 X,应该预测什么样的输出 Y。
- 典型的判别模型:k近邻法、感知机、决策树、逻辑斯谛回归模型、最大熵模型、支持向量机、提升方法和条件随机场等
- 生成方法的特点:可以还原出联合概率分布 P(X,Y),而判别方法则不能
- 生成方法的学习收敛速度更快,当样本容量增加的时候,学到的模型可以更快地收敛于真实模型;当存在隐变量时,仍可以用生成方法学习,此时判别方法就不能用
- 判别方法的特点:直接学习条件概率 P(Y|X) 或决策函数 f(X),直接面对预测,往往学习的准确率更高;由于直接学习 P(Y|X) 或 f(x),可以对数据进行各种程度上的抽象、定义特征并使用特征,因此可以简化学习问题
8. 监督学习应用
8.1 分类问题
- 从数据中学习一个分类模型或分类决策函数,称为分类器(classifier)
- 分类器对新的输入进行输出的预测,称为分类(classification)
- 可能的输出称为类别(class)
- 分类的类别为多个时,称为多类分类问题
评价分类器性能的指标一般是分类准确率(accuracy),其定义是:对于给定的测试数据集,分类器正确分类的样本数与总样本数之比。也就是损失函数是0-1损失时测试数据集上的准确率
对于二类分类问题常用的评价指标是精确率(precision)与召回率(recall)。 通常以关注的类为正类,其他类为负类,分类器在测试数据集上的预测或正确或不正确,4种情况出现的总数分别记作: TP——将正类预测为正类数; FN——将正类预测为负类数; FP——将负类预测为正类数; TN——将负类预测为负类数。
图片参考:https://www.jianshu.com/p/4434ea11c16c
值,是精确率和召回率的调和均值:
许多方法可以分类,包括k近邻法、感知机、朴素贝叶斯法、决策树、决策列表、逻辑斯谛回归模型、支持向量机、提升方法、贝叶斯网络、神经网络、Winnow等。
- 在银行业务中,可以构建一个客户分类模型,对客户按照贷款风险的大小进行分类
- 在网络安全领域,可以利用日志数据的分类对非法入侵进行检测
- 在图像处理中,分类可以用来检测图像中是否有人脸出现
- 在手写识别中,分类可以用于识别手写数字
- 在互联网搜索中,网页的分类可以帮助网页的抓取、索引与排序
8.2 标注问题
标注(tagging)也是一个监督学习问题。
标注问题是分类问题的一个推广,标注问题是更复杂的结构预测(structure prediction)问题的简单形式。
标注问题输入一个观测序列,输出一个标记序列或状态序列。标注问题的目标在于学习一个模型,使它能够对观测序列给出标记序列作为预测。
注意,可能的标记个数是有限的,但其组合所成的标记序列的个数是依序列长度呈指数级增长的。
- 常用方法有:隐马尔可夫模型、条件随机场。
- 标注问题在信息抽取、自然语言处理等领域被广泛应用,是这些领域的基本问题。
- 例如,自然语言处理中的词性标注(part of speech tagging)就是一个典型的标注问题:给定一个由单词组成的句子,对这个句子中的每一个单词进行词性标注,即对一个单词序列预测其对应的词性标记序列。
8.3 回归问题
回归(regression)用于预测输入变量(自变量)和输出变量(因变量)之间的关系,特别是当输入变量的值发生变化时,输出变量的值随之发生的变化。
回归模型正是表示从输入到输出之间映射的函数。回归问题的学习等价于函数拟合:选择一条函数曲线使其很好地拟合已知数据且很好地预测未知数据
- 回归问题按照输入变量的个数,分为一元回归和多元回归
- 按照输入变量和输出变量之间关系的类型即模型的类型,分为线性回归和非线性回归。
- 最常用的损失函数是平方损失函数,在此情况下,回归问题可以由著名的最小二乘法(least squares)求解。
- 许多任务都可以形式化为回归问题,如,商务领域,作为市场趋势预测、产品质量管理、客户满意度调查、投资风险分析的工具。