公众号:尤而小屋
作者:Peter
编辑:Peter

继续更新《Python深度学习》一书的精华内容,仅作为学习笔记共享。

Python深度学习精华笔记5:机器学习基础

本末节是第5篇:主要是介绍机器学习/深度学习的基础知识,主要包含:

  • 机器学习的多种方法
  • 评价机器学习的模型的规范化流程
  • 深度学习的数据预备
  • 数据预处理、特征工程
  • 解决过拟合问题
  • 处理机器学习问题的通用作业流程

机器学习的四大分支

监督学习

监督学习supervised learning:机器学习中最常见的类型,它能够学会将输入数据映射到已知方针annotation。比方回归问题和分类问题(二分类、多分类问题等)是最常见的监督学习的比方。

其他监督学习的应用比方:

  • 序列生成sequence generation
  • 语法树猜测syntax tree prediction
  • 方针检测object detection
  • 图画切割image segmentation

分类问题和回归问题的常用术语:

  • 样本或输入:进入模型的数据点
  • 猜测或输出:从模型出来的成果
  • 方针:实在值;抱负状态下,模型应该能够猜测到的值
  • 类别:分类问题中供挑选的一组标签
  • 真值或标注:数据集的一切方针,一般是人工收集
  • 二分类:binary classification,一种分类使命,比方是否两个互斥的类别
  • 多分类:multiclass classfitication,也是一种分类使命,每个输入样本被区分到两个以上的互斥类别中
  • 多标签分类:multilabel classification,也是一种分类使命,每个样本都能够被分配到多个标签中。比方一幅图画里或许既有猫又有狗,那么应该一起标注猫和狗的标签。
  • 标量回归:scalar regression,方针是接连标量值的使命。猜测房价的比方。
  • 向量回归:vector regression,方针是一组接连值的使命。假如对多个值进行回归,就是向量回归。
  • 小批量:mini-batch,模型能够一起处理的小部分样本。一般是8~128,样本数一般是2的倍数,便于GPU上的内存分配。

无监督学习

无监督学习是机器学习使命的一种,它从无标记的练习数据中揣度结论,它是进行数据剖析的必要进程。无监督学习的两种主要办法:降维dimensionality reduction和聚类clustering。

  • 无监督学习最典型的比方是聚类剖析,它能够在探索性数据剖析阶段用于发现隐藏的方法或许对数据进行分组。给定数据,寻觅隐藏的结构。在无监督学习中,一切的标记(分类)是未知的,因而练习样本的岐义性高。
  • 无监督学习被广泛应用于数据发掘,如降维的PCA、T-SNE算法,用于聚类的K-Means等,以及用于异常检测的LOF、SVDD算法等,用于切割的Mean-shift和高斯混合模型等,此外还有强化学习和生成模型。

自监督学习

自监督学习是没有人工标注的标签的监督学习。可是标签是仍然存在的,标签是在输入数据中生成的。一般运用的是启发式算法生成。

自监督学习是另一种类型的无监督学习,其经过运用数据自身的结构和相关性来生成监督信号,从而进行练习。在自监督学习中,一般会规划一个预界说的改换(或改换组合),该改换能够将输入数据转化为另一种具有显着差异的数据,然后练习一个模型来猜测这个改换后的数据。

自监督学习的中心思维是运用大规模无标签数据,发掘数据自身的结构信息和相关性,生成能够辅导模型练习的监督信息,以此进步无监督学习作用。自监督学习是一种重要的无监督学习办法,在天然语言处理、计算机视觉等多个领域都得到了广泛的应用。

自编码器autoencoder是很有名的自监督学习的比方。

强化学习

强化学习(Reinforcement Learning, RL)是机器学习的范式和办法论之一,用于描绘和解决智能体(agent)在与环境的交互进程中经过学习战略以达到报答最大化或完成特定方针的问题。常见模型是规范的马尔可夫决议计划进程(Markov Decision Process, MDP)

强化学习能够分为根据方法的强化学习(model-based RL)和无方法强化学习(model-free RL),以及自动强化学习(active RL)和被迫强化学习(passive RL)。

求解强化学习问题所运用的算法可分为战略搜索算法和值函数(value function)算法两类。深度学习模型能够在强化学习中得到运用,形成深度强化学习。

评价机器学习模型

一个现象:模型在练习集上功能始终在进步,可是在验证集体现得不好,即呈现了过拟合overfit

机器学习的目的是得到泛化generalize的模型,即在前所未见的数据集体现良好。

练习集、验证集和测验集

数据集的区分:

  • 练习集
  • 验证集
  • 测验集

假如数据自身就很少,能够运用穿插验证的办法:简略的留出验证、K折验证、以及带有打乱数据次序的重复K折验证

3种验证法

简略的留出验证hold-out validation

留出必定的份额作为测验集;在剩下的数据上练习模型

# 留出验证代码完成
num_validation_sample = 10000
np.random.shuffle(data)  # 打乱数据
validation_data = data[:num_validation_sample]  # 界说验证集-前面10000个数据
data = data[num_validation_sample:]
train_data = data.copy()  # 界说练习集
model = get_model()
# 在练习集上练习模型;而且在验证集上评价模型
model.train(train_data)
validation_score = model.evaluate(validation_data)
# 调理模型-从头练习-再评价模型
model = get_model()
model.train(np.concatenate([train_data,validation_data]))  # 一旦调理好超参数,一般在一切非测验集上从头练习,得到终究的模型
test_score = model.evaluate(test_data)

办法简略,一个缺点:假如数据自身就很少,验证集和测验集的数据就太少了,无法从统计学上代表数据

假如在区分数据前进行不同的随机打乱,终究得到的模型功能差别将会很大。

K-fold 穿插验证(k-fold validation)

思维:K折穿插验证是一种用于评价机器学习模型功能的技能,其基本思维是将原始数据集分红K个子集,每次挑选其间的K-1个子集作为练习数据集,剩下的一个子集作为测验数据集,这样共进行K次穿插验证。每次试验都会得到一个过错率,终究的评价成果是这K次试验过错率的均匀值

这种技能能够有效地避免过拟合和欠拟合,而且能够评价模型的泛化才能。

# k折穿插验证
k = 5
num_validation_samples = len(data) // k
np.random.shuffle(data)
validation_scores = []
for fold in range(k):
    validation_data = data[num_validation_samples*fold:num_validation_samples*(fold+1)]  # 验证集数据
    train_data = data[:num_validation_samples*fold] + data[num_validation_samples*(fold+1):]  # 练习集数据
    model = get_model()  
    model.train(train_data)  # 根据练习集train_data来练习模型
    validation_score = model.evaluate(validation_data)  # 验证集评价模型
    validation_scores.append(validation_score)  # 验证集上得分列表
validation_score = np.mean(validation_scores)  # 得分均值
model = model.get_model()
model.train(data)  # 根据全部数据data从头练习模型
test_score = model.evaluate(test_data)

注意一点:原始数据分红练习集train、验证集valid和测验集test;先在练习集上进行练习,接着在验证集进行评价;模型经往后,然后在train+valid的完好测非测验集上进行练习,得到终究的模型。

根据sklearn快速完成k折穿插验证一个事例:

from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score  
from sklearn.datasets import load_iris  
from sklearn.linear_model import LogisticRegression  
# 加载数据集  
iris = load_iris()  
X = iris.data  
y = iris.target  
# 创立KFold目标  
kfold = KFold(n_splits=5)  
# 创立模型  
model = LogisticRegression()  
# 运用K折穿插验证评价模型功能  
scores = cross_val_score(model, X, y, cv=kfold)  
# 输出均匀准确率和规范差  
print("Accuracy: %.3f%% (+/-%.3f%%)" % (scores.mean()*100.0, scores.std()*100.0/len(scores)))

带有打乱数据的重复K折穿插验证(iterated k-fold validation with shuffling)

带有打乱数据的重复K折穿插验证是一种用于评价机器学习模型功能的更加谨慎的技能。

它与K折穿插验证类似,可是在每次穿插验证中,数据集的次序会被随机打乱,然后再进行K折区分。这样做能够避免因为数据集次序的影响而发生误差的评价成果。

这种办法一共需求练习和评价K*P个模型(P代表重复次数)。

根据sklearn完成:

from sklearn.model_selection import RepeatedKFold
from sklearn.metrics import accuracy_score  
from sklearn.datasets import load_iris  
from sklearn.linear_model import LogisticRegression  
# 加载数据集  
iris = load_iris()  
X = iris.data  
y = iris.target  
# 创立RepeatedKFold目标  
rbf = RepeatedKFold(n_splits=5, n_repeats=3)    # k=5,重复次数为3
# 创立模型  
model = LogisticRegression()  
# 运用重复K折穿插验证评价模型功能  
scores = cross_val_score(model, X, y, cv=rbf)  
# 输出均匀准确率和规范差  
print("Accuracy: %.3f%% (+/-%.3f%%)" % (scores.mean()*100.0, scores.std()*100.0/len(scores)))

评价模型注意事项

挑选模型评价办法时的注意事项:

  • 数据代表性:在区分数据的时分一般进行随机打乱
  • 时刻箭头:在时序剖析的相关数据中,时刻是否先后次序的,一般不应该随机打乱数据;否则会形成时刻走漏temporal leak。始终保证练习集早于测验集。
  • 数据冗余:保证验证集和练习集之间没有交集。在机器学习建模中,数据冗余指的是在同一个数据会集,存在着相同或许相似的数据。这种冗余或许是因为数据输入过错、数据复制或数据合并等原因导致的。数据冗余会糟蹋存储空间,增加数据处理的负担,一起也或许导致数据不一致性。在机器学习建模中,数据冗余或许会影响模型的准确性和效率。

数据预处理、特征工程和特征处理

神经网络的数据预处理

向量化

一切神经网络的输入数据都必须是浮点数张量(极少特殊情况能够是整数张量)。

向量化是一种将数据从一维数组转化为多维数组的数学操作,它能够将原始数据转化为更适合神经网络处理的方法。

具体来说,神经网络的输入数据一般需求是一维数组或许多维数组的方法,其间每个元素对应一个特征。而原始数据往往是一维数组的方法,其间每个元素对应一个样本。因而,为了将原始数据直接输入神经网络进行练习,需求对数据进行向量化操作。

值规范化

在神经网络中,数据进行规范化(归一化)处理是一个非常重要的进程。归一化的作用主要是将输入数据的特征缩放到一个相对较小的区间,以进步模型的练习效率和避免呈现过拟合现象。具体来说,规范化能够使不同规范的特征具有相同的规范,从而使得网络在处理不同特征时能够有相同的学习速率。

比方图画处理中,图画数据被编码在0255之间的整数,表明灰度值。在输入网络前需求除以255,这样缩放得到01规模的浮点数。

输入数据的两个特征:

  1. 取值较小:大部分的值控制在0到1之间
  2. 同质性homogenous:一切特征的值都应该在大致相同的规模内
# numpy数组完成规范化:均值为0,规范差为1
import numpy as np
x -= x.mean(axis=0)
x /= x.std(axis=0)

处理缺失值

在处理数据中缺失值的办法,有以下几种常见的办法:

  1. 删去含有缺失值的数据行或列:这是一种简略的办法,能够直接删去含有缺失值的行或列,但或许会形成数据的损失和糟蹋。
  2. 填充缺失值:运用某种办法填充缺失值,使得数据完好。常见的办法有:
    • 固定值填充:挑选一个固定的值来填充缺失值。例如,能够将一切的缺失值都填充为0,或许运用该列的均匀值、中位数或众数等来进行填充。
    • 均值填充:运用该列一切非缺失值的均匀值来填充缺失值。
    • 中位数填充:运用该列一切非缺失值的中位数来填充缺失值。
    • 众数填充:运用该列一切非缺失值的众数来填充缺失值。
    • K最近邻算法:运用K个最近的非缺失值来猜测缺失值。经过计算这些非缺失值与缺失值之间的间隔,挑选间隔最近的K个点,然后运用这些点的均匀值、中位数或众数等来猜测缺失值。
    • 回归拟合:运用线性回归或其他回归办法拟合数据,并猜测缺失值。
    • 运用人工智能模型猜测:运用机器学习或深度学习模型来猜测缺失值。这种办法需求大量的数据和计算资源,但能够取得更好的猜测作用。
  3. 不处理缺失值:假如缺失值较少,或许在某些情况下不会对数据剖析成果发生太大影响,能够挑选不处理缺失值,直接运用原始数据进行数据剖析。

一般来说,神经网络中缺失值设置为0是安全的,只需0不是一个有意义的值。网络从数据学到0表明着缺失数据,而且会忽略这个值。

特征工程feature engieering

特征工程是指从原始数据中提取有用的特征,以便能够更好地练习机器学习模型。

这个进程包含从原始数据中挑选有用的特征,转化特征以便更容易处理,或许构造新的特征,以进步模型的准确性。

特征工程是树立机器学习模型的第一步,因为它能够使模型的体现与所运用的特征有很大的关系。

过拟合和欠拟合

机器学习的底子问题是优化泛化之间的敌对。

优化optimization:调理模型,在练习集上得到最佳功能

泛化generalization:练习好的模型在前所未见的数据上的功能好坏。泛化是无法控制的

欠拟合underfit:欠拟合是指机器学习模型在练习数据上的功能欠安,其泛化才能也较差。这意味着模型无法很好地把握练习数据背后的复杂关系或方法,因而在新数据上的体现也不尽如人意。模型在练习调集验证集都体现得很差

过拟合overfit:模型在练习集上标签良好,可是验证集上体现得很差。

获取更多的数据

为了避免模型从练习数据中学到过错或许无关紧要的方法,最优的办法是供给更多的练习数据。模型练习的数据越多,泛化才能天然也越好。

常用下降过拟合的办法叫做正则化regularization,下面介绍几种办法:

减小网络巨细

减小网络巨细是解决过拟合现象的一种常用办法。经过减小网络巨细,能够约束模型的复杂度,削减模型对练习数据的过度拟合,从而进步模型在新数据上的泛化才能。

具体来说,减小网络巨细能够经过以下几种办法完成:

  1. 削减层数:削减网络中的层数能够下降模型的复杂度,从而削减过拟合的危险。
  2. 削减节点数:削减每层的节点数也能够下降模型的复杂度,削减过拟合的危险。

增加权重正则化

  • L1正则化:根据权重系数的绝对值
  • L2正则化:也叫权重衰减,根据权重系数的平方
# 向模型增加L2权重正则化
from keras import regularizers
from keras import layers, models
model = models.Sequential()
model.add(layers.Dense(16,
                       kernel_regularizer=regularizers.l2(0.001),
                       activation="relu",
                       input_shape=(10000,)
                      ))
model.add(layers.Dense(16,
                       kernel_regularizer=regularizers.l2(0.001),
                       activation="relu"
                      ))
model.add(layers.Dense(1, activation="sigmoid"))

运用其他权重正则化来替代L2正则化:

from keras import regularizers
regularizers.l1(0.001)
regularizers.l1_l2(l1=0.001,l2=0.001)  # 一起进行l1-l2正则化

增加dropout正则化

对某一层运用dropout,就是在练习进程中对该层的一些输出特征值进行随机舍弃。

比方对向量的dropout操作:[0.2,0.5,1.3,0.8,1.6]经过操作后变成[0,0.5,1.3,0,1.6],部分元素随机变成0。

被设为0的输出特征的份额称之为dropout rate,一般取值在0.2~0.5之间。

在keras中的运用办法:

model = model.Sequential()
model.add(layers.Dense(16,activation="relu",input_shape=(X_trian.shape[1],)))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(16,activation="relu"))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1,activation="sigmoid"))

避免神经网络过拟合的办法总结

  1. 获取更多的练习数据
  2. 减小网络容量
  3. 增加权重正则化
  4. 增加dropout

机器学习的通用作业流程

  1. 界说问题,收集数据
  2. 挑选衡量成功的规范
  3. 确定评价规范
  4. 预备数据
  5. 开发比基准好的模型
  6. 扩大模型的规模:开发过拟合的模型
  7. 模型正则化与超参数调理