基础知识:
所谓的机器学习高大尚的说法是机器像人一样的学习能力,能在预测中给出判断,其实是训练个强大的模型,里面有足够参数,可以对复杂的输入通过足够的参数表示,能对类似的输入得到相似的结构,不再是一条直线两个参数划分平面,或者更多参数曲线划分空间。人工智能研究的方向之一,是以所谓 “专家系统” 为代表的,用大量 “如果-就” (If - Then) 规则定义的,自上而下的思路。人工神经网络 ( Artifical Neural Network),标志着另外一种自下而上的思路。神经网络没有一个严格的正式定义。它的基本特点,是试图模仿大脑的神经元之间传递,处理信息的模式。机器学习通过研究如何通过计算的手段,利用经验来改善自身性能,在计算机里经验是以数据存在,机器学习就是在数据上计算产生模型,模型是通过数据学习到的结果,其精髓是:非线性、分布式、并行计算、自适应、自组织。
特性 | AI | ML | DL |
---|---|---|---|
范围 | 最广 | AI的子集 | ML的子集 |
数据依赖 | 不一定 | 需要数据 | 需大量数据 |
特征提取 | 人工或算法 | 人工或半自动 | 全自动 |
典型应用 | 规则系统、专家系统 | 随机森林、SVM | 神经网络 |
机器学习:计算机模拟人类的学习行为,以获取新的知识或技能并重新组织已有的知识结构使之不断改善自身;
机器学习核心技术
分类:应用以分类数据进行模型训练,根据模型对新样本进行精准分类与预测。
聚类:从海量数据中识别数据的相似性与差异性,并按照最大共同点聚合为多个类别。
异常检测:对数据点的分布规律进行分析,识别与正常数据及差异较大的离群点。
回归:根据对已知属性值数据的训练,为模型寻找最佳拟合参数,基于模型预测新样本的输出值
机器学习基本流程
数据预处理:输入(未处理的数据 + 标签)→处理过程(特征处理+幅度缩放、特征选择、维度约减、采样)→输出(测试集 + 训练集)。
模型学习:模型选择、交叉验证、结果评估、超参选择。
模型评估:了解模型对于数据集测试的得分。新样本预测:预测测试集。
机器学习的分类:
机器学习中最基本的分类主要分为三类:监督学习、无监督学习和强化学习。
监督学习(Supervised Learning):
监督学习是指模型从标记好的训练数据中学习,并根据这些数据进行预测或分类。在监督学习中,每个训练样本都有一个对应的标签或输出,模型的目标就是学习如何从输入数据预测正确的输出。常见的监督学习算法包括线性回归、逻辑回归、支持向量机(SVM)和神经网络等。
无监督学习(Unsupervised Learning)
无监督学习是指模型从非标记数据中学习,发现数据的内在结构或模式。在无监督学习中,模型没有对应的标签或输出,其任务通常是聚类、降维或关联规则等。常见的无监督学习算法包括K均值聚类、主成分分析(PCA)和关联规则挖掘等。
强化学习(Reinforcement Learning):
强化学习是指智能体通过与环境的交互学习,在不断尝试和错误的过程中,根据奖励信号来调整自己的行为以达到最大化长期奖励的目标。强化学习常用于处理决策与控制问题,比如机器人控制、游戏策略等。常见的强化学习算法包括Q学习、深度强化学习(Deep Reinforcement Learning)和策略梯度等。
从样本中学习
样本:进行学习的已知数据,样本空间的一个采样,这里又有样本属性与属性空间。
训练集:用于训练的样本叫训练集。根据训练是否有标记信息,分为有监督学习和无监督学习,分类和回归是有监督,聚类即是无监督学习。学的模型适用于新样本的能力成为泛化能力,具有强泛化能力的模型能很好的适用于整个样本空间。
模型训练: 从数据中学的得模型的过程称为学习或者训练,是执行某个学习算法的过程,训练使用的数据称为训练数据,每个样本称为训练样本,训练样本组成训练集。无论是有监督(有导师)或者还是无监督(无导师训练)是目的是通过已有的数据经验判断未至,归纳与演绎。书中例子是判断西瓜的好坏可以根据假设空间(颜色、根蒂、敲声)等通过已知信息判断西瓜好坏,可以二分类(好坏),也可以多分类-成熟度。通过对样本空间的假设分析,在计算机上的模拟参数化训练就会使得训练模型“黑箱子”在路径上自顶向下或自底向上同时进行去掉了和正例不一样的假设(训练上是使得参数结果靠近正例假设偏离负例假设)。
关于书中其他的一些概念,如属性特征;以判断西瓜好坏为例,属性就是外在判断一个西瓜的特征:根蒂、颜色等。为什么要有属性值因为在计算机的数据处理中这些属性是人去判断的而计算机是要处理主要以数字形式的数据,这里的属性值的填写又涉及到数据预处理:归一化、数据填充、删除等操作。因为要得到好的训练模型一个脏数据的影响往往比一个正常数据影响要大。
归纳偏好:
判断分类的属性得到整理的属性空间往往不止一个,计算机算法基于某种偏好认为哪种假设比其他假设好就是归纳偏好。其实在非线性拟合的预测中,一些胡猜有时会和经过训练模拟的函数预测差不多,这要求学习算法的归纳偏好与实际问题相是否符合有莫大的关系。
机器学习发展:
符号主义
又称为逻辑主义、心理学派或计算机学派,其原理主要为物理符号系统(即符号操作系统)假设和有限合理性原理,代表有决策树和基于逻辑的学习。典型决策树是以信息论为基础以信息熵最小化为目标直接模拟人类的对概念进行判定属性流程。基于逻辑的典型是归纳逻辑程序设计ILP。
连接主义:
基于神经网络的连接主义学习,它产生的是黑盒模型,BP算法的出现使得这种机器学习模型得到快速发展,但其局限性是试错性,就是过程涉及大量的参数而参数设置缺乏理论指导主要靠手工调参。
统计学习:
统计学习是通过分析数据来推断或预测未知的规律和模式。这种方法结合了统计学和学习算法。目标:在观察到的数据中找到规律,以便能够对新数据进行预测或分类。代表是支持向量机(SVM) 连接主义和统计学习关系密切。
深度学习:
连接主义的又一次创意发展,狭义的讲就是很多层神经网络,主要涉及是数据量大,参数多,其发展是大数据及计算机设备的提升伴随产生。
模型评估与选择
误差:
学习器的实际预测输出与样本的真实输出之间的差异,错误样本数占测试样本数的比例称为错误率。 训练误差(经验误差):学习器在训练集上的误差。 泛化误差:在新样本上的误差,想得到的就是泛化误差较小的模型。
过拟合(overfitting)和欠拟合(underfitting)
欠拟合:
当模型过于简单,无法捕捉数据中的复杂关系时,就会发生欠拟合。表现:模型在训练集和测试集上的表现都比较差,无法很好地拟合数据。解决方案:增加模型的复杂度,可以尝试使用更复杂的模型、增加特征数量或提高模型容量等方式来解决欠拟合问题。
过拟合:
当模型过于复杂,试图记住训练数据中的噪声和细节,导致在新数据上表现不佳时,就会发生过拟合。表现:模型在训练集上表现很好,但在测试集上表现较差,泛化能力不强。解决方案:可以采取以下方法缓解过拟合
- 正则化:如L1、L2正则化,通过惩罚复杂模型的系数来防止过拟合。
- 减少特征数量:可以通过特征选择或降维等方式减少模型输入的特征数量。
- 增加训练数据:更多的数据有助于模型更好地学习数据的分布。
- 交叉验证:通过交叉验证来评估模型的泛化能力,选择合适的模型。
正则化:它通过在模型的损失函数中加入额外的惩罚项,限制模型的复杂度,使模型在训练数据上不过度拟合,从而提升模型在新数据上的泛化能力,
J(θ)=原始损失+λ⋅Ω(θ),J(θ):正则化后的损失函数,θ:模型参数;Ω(θ):正则化项,衡量模型复杂度;λ:正则化强度超参数,控制惩罚力度。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 生成数据 y = 2x + 1 + 噪声
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 2 * X.flatten() + 1 + np.random.randn(100) * 0.8
# 添加偏置项
X_b = np.c_[np.ones((100, 1)), X]
# 计算均方误差损失(带L2正则化)
def compute_loss(theta, X, y, lambd=0):
m = len(y)
predictions = X.dot(theta)
loss = (1/(2*m)) * np.sum((predictions - y)**2)
reg = (lambd/(2*m)) * np.sum(theta[1:]**2) # 不正则化偏置项
return loss + reg
# 计算梯度(带L2正则化)
def compute_gradient(theta, X, y, lambd=0):
m = len(y)
predictions = X.dot(theta)
grad = (1/m) * X.T.dot(predictions - y)
grad[1:] += (lambd/m) * theta[1:]
return grad
# 梯度下降
def gradient_descent(X, y, learning_rate=0.1, iterations=1000, lambd=0):
theta = np.zeros(X.shape[1])
losses = []
for i in range(iterations):
grad = compute_gradient(theta, X, y, lambd)
theta -= learning_rate * grad
loss = compute_loss(theta, X, y, lambd)
losses.append(loss)
return theta, losses
# 训练无正则化模型
theta_no_reg, losses_no_reg = gradient_descent(X_b, y, lambd=0)
# 训练有正则化模型
theta_reg, losses_reg = gradient_descent(X_b, y, lambd=10)
print("无正则化参数:", theta_no_reg)
print("有正则化参数:", theta_reg)
# 画损失曲线对比
plt.figure(figsize=(12,5))
plt.subplot(1, 2, 1)
plt.plot(losses_no_reg, label='无正则化')
plt.plot(losses_reg, label='L2正则化 λ=10')
plt.xlabel('迭代次数')
plt.ylabel('损失')
plt.title('损失函数变化对比')
plt.legend()
plt.grid(True)
# 画拟合曲线对比
plt.subplot(1, 2, 2)
plt.scatter(X, y, color='gray', alpha=0.6, label='数据点')
X_plot = np.linspace(0, 2, 100).reshape(-1, 1)
X_plot_b = np.c_[np.ones((100, 1)), X_plot]
y_pred_no_reg = X_plot_b.dot(theta_no_reg)
y_pred_reg = X_plot_b.dot(theta_reg)
plt.plot(X_plot, y_pred_no_reg, label='无正则化拟合', color='blue')
plt.plot(X_plot, y_pred_reg, label='L2正则化拟合', color='red')
plt.xlabel('X')
plt.ylabel('y')
plt.title('回归曲线对比')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
过拟合:形象的讲就是学的太细致博学的生物教授在以往的经验上看到新的植物,比以往植物少一片叶子都不认为他们是同一类。把一些特点当做所有数据共有的特性。欠拟合就是训练样本的性质没有学好预测与根据一定数据范围胡猜类似。书中例子就是训练树叶欠拟合就会误以为绿色都是树叶。相对于过拟合欠拟合相对容易克服,如在神经网络里通过增加训练轮数,决策树扩展分支,过拟合相对麻烦,过拟合只能缓解不能避免,连接性训练网络的机器学习通常都会参数初始化,不同初始化的模型得到效果也不一样,哪个模型好要通过泛化误差进行评估。泛化误差不能直接获得,训练误差由于过拟合的存在不标准,现实中模型的评估与选择有以下几个方法:(只考虑泛化误差,没有考虑时间开销、存储开销、可解释性等方面,测试集的测试误差作为泛化误差)
欠拟合:好比你见了一个人但是没有留意只记个大概,让你确认是不是这个人的时候你很含糊觉得像与不像之间徘徊,过拟合:这个人你印象深刻,脸上有个痣你的记得很清晰,有一天她把痣去掉了,你断定不是她,她没有痣了,一个点影响很大。
模型训练的结构方法:
1、留出法:
直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T,即D=S∪T,S∩T=空集,在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。假定D包含1000个样本,将其划分为S包含700个样本,T包含300个样本,用S进行训练以后,如果模型在T上有90个样本分类错误,那么其错误率为(90/300)*100%=30%,精度为1-30%=70%。
需注意:训练/测试集的划分要保持数据分布的一致性,避免额外偏差。这里的一致不仅要保持训练与测试数据比例,还要保持训练数据的样本类别数据一致,多分类任务中如果某一样本过多(Yk)那么模型更偏向于Yk,结果相似的就会归类于Yk。神经网络大多还存在一个数据样本打乱的算法,就是让数据随机训练,如果不这样,每一类样本集中训练,最后的结果更偏向于最后迭代训练的那类样本。常见数据集训练与测试的划分:2/3 4/5.(弊端一般划分不均匀)
交叉验证:
先将数据集D分为k个大小相似的互斥子集,即D=D1∪D2∪……∪Dk,Di∩Dj=空集(i≠j)。每次用K-1个子集的并集作为训练集,余下的子集作为测试集;获得K组训练/测试集,从而可进行k次训练和测试,最终返回的是这k个测试结果的均值,相对客观的一种方法,它的稳定性和保真性取决于k的取值。但是模型训练测试开销较大,每次划分训练测试都要耗费很多的时间,每次训练如果初始化参数训练的模型,也不一定是最准确的方式。
自助法:
自助采样:在数据集D中做放回抽取样本,将m次抽取后得到的样本做数据集D’。每个样本被选中的概率是1/D,因此未被选中的概率就是(1-1/D),这样一个样本在训练集中没出现的概率就是d次都未被选中的概率,即(1-1/D)^D。当d趋于无穷大时,这一概率就将趋近于e^-1=0.368,通过自助采样,初始数据集D中约有36.8%的样本出现在D’中。将D’做训练集,将D/D’做测试集。
调参与最终模型:
调参:
因参数配置不同,学得模型的性能有显著差别,在进行模型评估和选择时,需要对算法参数进行设定,参数的设定没有具体准则,但又不能全都训练和调节范围过大,一般是在[0,0.2]范围内步长0.05为步长调节,在梯度下降法中,用学习率的大小控住调节量的度量变化。寻找最优值的值的过程是让初始参数向预测度高的方向靠近,即总体的误差越来越小。
模型性能度量
性能度量:衡量模型泛化能力的评价标准在预测任务时,将学习器预测结果与真实值进行比较,什么样的模型是好的不仅取决于算法核数据,还取决于任务需求,回归任务中常用的性能度量“均方误差”。
错误率与精度错误率:分类错误在样本总数,精度分类正确的占样本的总数。常用的衡量标准。
查准率、查全率:面对不同问题,性能度量不同,例如。信息检索中,“检索出的信息中有多少比例是用户感兴趣的”即为“查准率”“用户感兴趣的信息有多少被检索出来了”即“查全率”。查准率与查全率是矛盾度量,所以一般会综合两方面考量学习器的好坏,找到最佳平衡点BEP(Break-Even Point)。衡点定义:查全率等于查准率时的取值。我们可以根据学习器的预测结果对样例排序,计算出当前的查准率、查全率,做查准率-查全率曲线,简称“P-R曲线”如果一个学习器的PR曲线包住了另一个,外面的较为好,如果有交叉,如A、B,可比较曲线下面积大小,但不容易估算,需综合考虑PR性能。引入平衡点(BEP),基于BEP比较,平衡点大的较好。当BEP判断不够准确时使用F1变量,本质上是P和R的调和平均。
ROC与AUCROC曲线:用于研究综合考虑学习器在不同任务下“期望泛化性能”的好坏。现实中有限个测试样例仅能获得有限个坐标对绘制ROC,若一个学习器的ROC曲线被另一个包住,后者的性能能优于前者;若交叉,判断ROC曲线下的面积,即AUC。AUC:考虑的是样本预测的排序质量,因此它与排序误差有紧密联系。
代价敏感错误与代价曲线:为权衡不同类型错误(有病判无病,无病判有病)所造成的不同损失,可为错误赋予“非均等代价”在非均等代价下ROC曲线不能直接反应出学习器的期望总体代价,以及其他性能度量如精度的代价敏感版本。所以需要“代价曲线”,如图。
绘图过程:ROC曲线每一点对应代价平面上一条线段设ROC曲线上点的坐标(FPR,TPR),计算FNR,绘制一条从(0,FPR)到(1,FNR)的线段,线段下的面积表示该条件下的期望总体代价,诸如此类,取所有线段的下界围成的面积为在所有条件下学习器的期望总体代价。
比较检验:机器学习性能不能通过度量值直接比较。因为通过实验评估获得的是测试集的,两者对比结果未必相同。二是测试性能与测试集的选择有很大关系,最后机器学习的随机性,即便相同的初始参数经过训练后结果也不一定相同。“统计假设检验”为学习器性能比较提供重要依据给出如下检验方法:假设检验:“假设“是我们对学习器泛化错误率分布的猜想或判断。我们通过不同假设,基于假设检验结果可推断出学习器性能的比较。当我们做出多次重复留出法或交叉验证法进行训练/测试时,得出多个测试错误率:t检验。
交叉验证t检验:基本思想:若两个学习器的性能相同,则使用相同的训练/测试集得到的测试错误率应相同。假设检验的前提:测试错误率均为泛化错误率的独立采样。k折交叉验证产生的K对测试错误率:先对每对结果求差,若两个学习器性能相同则差值均值应为0。因此根据差值对“学习器AB性能相同”做t检验,计算差值的均值和方差,在显著度确定条件下,判断变量是否小于临界值,若小于则无显著差别,否则可判断平均错误率较小的学习器性能较优。
因样本有限,加查验证不同轮次训练集有重叠,测试错误率实际上不独立,会导致过高估计假设成立的概率。
McNemar检验通过考虑变量,服从自由度为1的分布,即标准正态分布变量的平方。给定显著度α,当以上变量值小于临界值时,认为两学习器性能没有显著差别;否则性能有显著差别。且平均错误率较小的那个学习器性能较优。
Friedman检验与Nemenyi后续检验。定义:Friedman检验是利用秩实现对多个总体分布是否存在显著差异的非参数检验方法。原始前提:当多个配对样本来自的多个总体分布无显著差异时。基于算法排序的Friedman检验用于:一组数据集上对多个算法进行比较:假定数据集比较,由好到差排序,并赋予序值1,2,……Friedman检验判断这些算法是否性能相同:性能相同,平均序值应当相同。若”所有算法的性能相同”这个假设被拒绝,说明算法的性能显著不同。
Nemenyi检验计算出平均序值差别的临界值域,若两个算法的平均序值之差超出了临界值域,则以相应的置信度拒绝”两个算法性能相同”这一假设。
偏差与方差:偏差-方差分解(bias-variance decomposition)就是用来解释学习算法泛化性能的一种工具,试图拆解期望泛化错误率。泛化误差可分解为偏差、方差与噪声之和。范化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。偏差和方差是有冲突的。训练不足时,拟合能力不强,由偏差主导泛化错误率;训练充足时,方差主导泛化错误率。