todo
t-sne
distplot
Amazon FSx for Lustre
开源库
- Scikit-learn:数据挖掘和分析的工具,包括数据预处理、交叉验证、算法与可视化算法等,基于Numpy和Scipy。特别适合于将原始数据转换为训练所用数据。
- pandas:特别适合处理表格/矩阵/时间序列数据。
- matplotlib:数据可视化库
- plotly:数据可视化库
- NLTK,Natural Language Toolkit:文本处理套件,适合于文本标签、分类和标记
- Scrapy:Python爬虫框架
知识脉络
人工神经元,Artificial Neuron
人工神经元是将多个输入参数计算加权和后,通过激活函数输出最终值的结构,如下图。图中,(a1, a2, ..., an)可称为输入向量,(w1, w2, ..., wn)可称为权向量,b为偏置,f称为激活函数(activation function),是非线性函数。因此,也可说神经元是求输入向量和权向量的内积,然后通过非线性激活函数得到结果。
感知机,Perceptron
感知机是激活函数为阶跃函数(返回1或-1)的神经元。也就是在普通激活函数后面加一个阈值判断,大于阈值返回1,否则返回-1。它解决N维空间的线性可分问题。3无法做出选择。
将有N个特征的二分样本视为N维空间中的点。如果样本线性可分,即存在一组N-1维超平面将正例和反例样本分开。感知机可以通过梯度下降来找到其中一个分离超平面。但是,普通的感知机无法区分哪些分离超平面比较好。感知机的训练方式也容易产生过拟合。如下图,存在无数个分离线性边界,但感知机无法做出选择。
支持向量机,Support-vector machine,SVM
SVM是感知机的变体。它能找到一个最大间隔超平面,该平面到最近的正样本的距离和最近负样本的距离最大。SVM也叫最佳稳定性感知机。此外,使用非线性核函数代替内积,SVM还能支持非线性分类。
协同过滤
基于如下假设:如果用户A和用户B在某点上观点相同,则用户B的其他观点也可能和用户A相近。因此,当收集了大量用户的喜好列表之后,对于单个用户来说,使用他的喜好列表(或列表的一部分)可以向他推荐可能喜好的其他物品。
相关服务
Amazon Textract
一个强化的OCR服务。可以提取文本,以及表格等结构化数据。当前仅支持英语。
Amazon Mechanical Turk
可以用于给数据打标签的众包平台。
SageMaker Ground Truth
使用机器学习给数据打标签。和Mechanical Turk集成,通过学习人类打标签的技巧,自动打标签。当自动标签置信度不高时,自动转为人类操作。此服务还提供注释整合功能,使用多个不同人类对同一样本标注,从而降低人工打标签错误率。
Amazon FSx for Lustre
高性能文件系统,提供亚毫秒级延迟,数百GBPS和数百万IOPS。
Amazon Comprehend
使用机器学习从文本中提取见解。可以处理以下内容:
- 提取关键词:从一段文本中自动提取关键词,给出关键词出现次数和置信度。
- 实体识别:类似提取关键词,但只提取实体。给出实体类型(组织、人物、地点等)。
- 自定义实体:使用私有示例训练自定义模型,以进行实体识别
- 语言检测:识别文本的语言。支持一百多种语言。
- 情绪检测:给出文本情绪属于正面、负面、中性或混合的置信度。
- 语法分析:把一段文本按单词切分,给出各个单词的词性。
- Comprehend Medical是一个子服务,可以进行医学方面的实体和关系提取。类似实体识别,但仅涉及医学部分;同时会指出相关关系,比如药品名和对应的用量。
Amazon Rekognition
用于图像和视频识别。可以识别以下内容:
- 识别已经预训练的物体,指出其位置和标签
- 识别不和谐的内容
- 识别图像中的文本
- 对于面孔,指出性别、年龄、眼镜、毛发、表情、情绪等数据
- 存储面孔元数据,并在图像中对比发现数据库中的面孔
- 识别名人
- 在视频中识别人物运动轨迹
Amazon Personalize
基于用户的基本信息和行为,给出各个用户的个性化产品推荐
Amazon Polly
- 既可朗读纯文本,也可朗读包含添加停顿、语速等标记的SSML文档
- 对于单词变体、缩写词,可以提供一个词典将其替换为普通单词,或直接指定音标。
Amazon Transcribe
Amazon Lex
Alexa的对话引擎,用于开发聊天机器人。通过接受用户发出的语音或文本形式的自然语言,理解用户意图。其利用 AWS Lambda 实现意图,利用 Amazon Cognito 进行用户身份验证,以及利用 Amazon Polly 将文本转换为语音
AWS Glue
- 主要包括两部分:爬虫和ETL作业。爬虫通过分类器扫描存储库,进行分类、提取架构、生成元数据,但不执行具体的数据转换。ETL作业是运行在内置Spark集群上的,执行数据转换操作。
- Glue使用分类器确定数据的格式。Glue提供众多内置分类器,还可以自行指定分类器。分类器如果能识别数据格式,就给出一个架构及确定性数字。Glue会依次测试所有自定义分类器,然后测试内置分类器,直到一个分类器返回100%确定。如果所有分类器都不能100%确定,则使用概率最高的。如果所有分类器的确定数字都是0,则返回UNKNOWN。
- 能输入输出的文件格式:avro、csv、json、orc、parquet、glueparquet
仅支持输入的文件格式:ion、grokLog、xml - FindMatches:通过机器学习识别数据集中的重复或匹配记录。即使记录没有唯一uid且没有完全匹配的字段时也能工作。这可用于在不同的客户数据库中链接客户记录(名称拼写差异、地址差异、不同的字段缺失等),或将自己数据库中的产品匹配竞争对手的产品等(字段结构不同)。
可指定查准率优化或查全率优化,还可指定需要高准确率还是低成本。
这是LakeFormation提供的特性。
AWS LakeFormation
在几天内轻松建立数据湖,管理成本低。它提供了ML转换,比如FindMatches。
深度学习AMI,Deep Learning AMI
机器学习术语
除了以下重要概念,还可以参考机器学习术语表。
监督式学习
监督式学习的实质是,我们认为在数据集每个样本的特征和标签之间存在函数关系,且该函数关系能适用于将来的样本。虽然该函数未知,但通过训练模型,可以拟合目标函数,从而使模型成为目标函数的近似值。
损失函数,Loss Function,或称代价函数,Cost Function
损失函数是模型和样本标签的差。对于数据集中的单个样本,特征记为X,标签记为Y,训练的模型记为f(X)。则损失函数为L(Y, f(X)) = (Y - f(X))^2
经验风险,
Empirical Risk
经验风险是损失函数的平均值。对于训练集data_set中的所有样本,经验风险为:
sum([L(Y, f(X)) for X, Y in data_set]) / len(data_set)
结构风险,Structural Risk
过度的训练会产生过拟合,这是模型过于适合训练集中的样本而逐渐远离实际业务函数的过程。过拟合会体现为模型复杂化。结构风险函数J(f)反映模型结构的复杂程度。也叫正则化,Regularization
目标函数,Objective function
经验风险和结构风险的加权和,使得模型在与训练样本准确度和结构复杂度之间获得平衡。
sum([L(Y, f(X))for X, Y in data_set]) / len(data_set) + λ* J(f)
优化超参数
批次大小
在梯度下降中,损失函数通过梯度查找全局最小值。然而,鞍点和局部最小值拥有和全局最小值相似的0梯度特性。陷入局部最小值会降低模型质量。
单个样本包含大量噪声,一批样本的噪声会被平均,多个样本的集合可以通过平均降低噪声,样本集越大噪声越不明显。噪声可以使损失函数逃脱局部最小值,而本批次的噪声会被后续批次拉平而不影响最终结果。因此使用较小的批次大小可以提高模型质量。然而由于总批次变多,也会增加训练时间。参考这里
学习率
过大的学习率会导致在局部最优点或鞍点附近震荡;过小的学习率会导致学习过慢或过拟合。
数据预处理
数据不平衡通常使用SMOTH来扩增少数分类的数据。但SMOTH的数据仅能反映现有少数类的综合情况。对于信用卡欺诈,基于生成对抗网络(GAN)的过采样更有效。
字段缺失最好使用深度学习策略估算缺失的字段
处理异常值时可抛弃x倍以上标准差的样本。x通常是2-4。x越小,抛弃的样本越多。也可以手动指定属性上限和下限,将异常值拉回可接受的范围。
将数据拆分为训练集和测试集时,如果是时间序列预测,使用连续拆分Sequentially splitting;否则使用随机拆分Randomly splitting。
数据转换
- 分位数分箱转换,Quantile Binning Transformation:指定分箱数量,将连续的数值变量转变为分类变量。比如,用于将0-99岁分为10类。
- N元转换,N-gram Transformation:用于将句子拆成不多于一个、两个、三个单词的短语。比如“I really enjoyed reading this book”的二元转换得到:{"I really", "really enjoyed", "enjoyed reading", "reading this", "this book", "I", "really", "enjoyed", "reading", "this", "book"}。最多支持10元。
- 正交稀疏二元转换,Orthogonal Sparse Bigram (OSB) Transformation:代替N元转换,可通过实验确定N元转换比较好还是OSB比较好。"The quick brown fox"转为{The_quick, The__brown, The___fox}。
sklearn的数据预处理方法,sklearn.preprocessing.*
- 规范化器,Normalizer:线性缩放数据【行】。将一行数字组成的向量变成长度为1的向量。
比如[0, 1, -1]转换为[0, 0.707, -0,707] - MinMaxScaler:线性移动缩放数据列,使其落在[0, 1]之间。比如[[-1],[1],[3]]转换为[[0],[0.5],[1]]
- MaxAbsScaler:线性缩放数据列且不移动0点。使其落在[-1, 1]之间。比如[[-1],[1],[3]]转换为[[-0.3333],[0.3333],[1]]
- StandardScaler:线性移动缩放数据列,使其均值为0,方差为1。相比于MinMaxScaler和MaxAbsScaler,StandardScaler对于异常大值不敏感。
- RobustScaler:类似MaxAbsScaler,但居中和缩放信息基于百分数,因此可跳过异常值的影响。特征值的结果范围比较大。
- PowerTransformer:对特征运用幂变换,使结果更接近正态分布。默认还会使均值为0,方差为1。
数据不平衡时的采样
试想以下数据集:正例有100个,反例有10000个。使用此数据集的模型可能会偏好将更多的样本认为是反例,可以以很低的模型复杂度获取非常高的准确率,但并不是我们想要的。
一个简单的方式是调整阈值。比如业务对召回率敏感但对精度不敏感时,可以简单地认为模型输出>0.3既是正例。
举例:一种低成本癌症筛查方式,在万分之一的发病率人群中,其筛查的阳性率为万分之五,召回率达99%。虽然有400%的假阳性,但这些假阳性者可以通过后续的高成本化验排除癌症嫌疑。因此这个筛查对召回率敏感但允许较低的精度。
改变采样方式以平衡正例和反例是一种另解决方法
过采样
重复采样正例100次,使数据集中的正例和反例数量都是10000个。但这可能导致在正例上过拟合。
欠采样
在反例中随机抽取100个样本,使数据集中的正例和反例数量都是100个。但这损失了大量样本,因此仅适合于正例也足够多的场景。也可以将反例分成100组,每一组都和正例组合训练一个模型,共100个模型,并在推理时进行模型投票。这种方式也可能产生过拟合。
SMOTE、ADASYN
找到正例数据的近邻,合成9900个新的正例。这通常可以有效对抗过拟合,也不会损失反例。但其生成的“近邻”在实际场景中可能是反例,导致出现问题。
通常,为了对抗过拟合,需要结合较强的正则化。
交叉验证
k折交叉验证
当对比k个模型的优劣时,将数据集均分为k份,每个模型分别取其中之一作为测试集,剩下k-1份作为训练集。
分层交叉验证
当数据不平衡时,比如正样本显著少于负样本,每次的验证集合包含的正样本和负样本数量相同。
时间序列交叉验证
当使用时间序列训练模型时,每次使用一整段(数个)完整时间周期作为训练集,一个完整的时间周期作为测试集。
二进制模型洞察
- 真正,True positive,TP:预测的值为 1,真正的值为 1。
- 真负,True negative,TN:预测的值为 0,真正的值为 0。
- 假正,FP:预测的值为 1,但真正的值为 0。
- 假负 ,FN:预测的值为 0,但真正的值为 1。
- 准确度,Accuracy,ACC:预测正确率。(TP+TN)/(TP+TN+FP+FN)
- 查准率,精度,Precision,预测为1时的正确率,体现对负样本的区分能力。TP/(TP+FP)
- 查全率,召回率,Recall:实际为1时的正确率。体现对正样本的识别能力。TP/(TP+FN)
- 假正率,False Positive Rate,FPR:实际为0但预测为1的比率,越低越好。FP/(FP+TN)
- F1 Score:精度和召回率的调和平均数。因为单独优化精度和召回率的其中一个值可能导致另一个值下降,所以使用F1 Score反映模型的总体稳健程度。 2*Precision*Recall/(Precision+Recall)
- Fβ Score:F1 Score加上调整权重。(1+β^2)*Precision*Recall/(β^2*Precision+Recall)
- ROC曲线和PR曲线
超参数优化
人类很难理解超参数如何在特定业务层面影响算法效果。因此很大程度上需要通过多次尝试不同的超参数组合来找到最好的组合。AWS通过两种方式:随机搜索所有组合、贝叶斯搜索的方式来优化超参
- 使用随机搜索或贝叶斯搜索优化最多20个变量的组合。
- 随机搜索:完全随机尝试超参数组合。没有并行数量限制。
- 贝叶斯搜索:将超参数优化视为回归。更多的并行节省时间,但通常会浪费计算成本。
- AWS使用正则表达式搜索算法的stdout和stderr以监控最多20个指标。
- 可在已完成的优化作业(称为父作业)的基础上执行新的优化作业以,称为热启动。目前不能通过控制台热启动作业,只能通过Boto3或SageMaker Python开发包。
采样
水库采样,Reservior Sampling
一种对流式数据采样的算法。其类似于向充满的水库中注水,均匀混合后流出等量的水。
具体算法是,一个数据序列中有N个元素(N>>k且N一开始是未知的);将序列中的前k个放入池中,然后对接下来的第i个元素,都有k/i的几率放入池中并替换池内的随机元素。伪代码如下:
def reservior_sampling(source, k):
samples, i = source[:k-1], k
for x in source[k:]:
temp, i = random() * i, i+1
if temp < k: samples[temp] = x
return samples
部署
SageMaker 托管服务
- 自动扩展的终端节点不能直接更新。需要先禁用自动扩展,更新后再启用自动扩展。
SparkML服务容器,SparkML Serving Container
将Spring Boot与MLeap结合,以RESTful Web服务的方式提供低延迟在线推理。这个容器镜像可以用于在SageMaker内部或外部部署Spark ML 管道。
特征工程,Feature engineering
- 降维,Dimensionality reduction:降低随机变量个数,得到一组“不相关”主变量的过程。常见的思路包括变量选择(抛弃不起作用的变量)和特征提取(将原始变量替换为变量的函数(比如线性变换)以获取最有效果的变量)
- 主成分分析,principal component analysis, PCA:特征提取技术,将多个可能相关的变量通过正交变换变形为一系列线性不相关变量(称为主成分)。这个过程中变量数量可能减少。
- t分布的随机邻域嵌入,t-distributed stochastic neighbor embedding,t-SNE:降维技术,主要用于数据可视化。将高维数据集映射到二维或三维数据集。t-SNE是SNE的一个变种。
- 添加单个数值变量的平方和立方作为新的维度,或者两个数值变量的积作为新维度可能有所帮助。
- 是/否枚举转换为1/0
- 有序枚举,形如大/中/小,可转换为4/2/1。具体取值取决于业务特性。
- 有k个有效值的无序枚举转换为k个0/1变量。例如马/牛/羊转换为[1,0,0]/[0,1,0]/[0,0,1]。这称为独热编码,One-Hot Encoding。
- 将过大或过小的数值变量进行缩放,以确保对预测的影响不会失衡。
- 归一化:一般指min-max 归一化。对列进行线性变换,将列的值域变换到[0, 1]。
(x - min)/(max-min) - 标准化:一般指z-score 标准化。对列进行线性变换,使列的平均值为0,标准差为1。
(x - mean) / std - 数据可视化:使用各种图表展示数据。经常使用的工具是散点图(Scatter plots)、直方图(Histograms)
- 混淆矩阵,Confusion matrix:一个2x2的矩阵,分别表示预测是否和实际是否的情况。
- 数据增强,data augmentation:将现有样本进行等价变换生成新的样本。比如在学习分辨猫狗的图片集中,将图片移位、旋转、缩放、扭曲不会改变图片是猫还是狗的特征,因此对图片进行上述转换以极大地增加样本量,还能阻止神经网络学习不相关特征。比如图片经过上述操作扩增之后,神经网络不会尝试利用动物在图片中的位置来分辨猫狗。
建模
- ML的本质是识别数据中的隐藏模式。当人类能够完成一个任务,但无法描述如何通过确定规则完成该任务时,适合使用ML解决。
- 监督式学习:使用一系列包含特征(feature)和正确答案(对于分类问题称为标签,label)的样本训练模型,以期模型仅需要特征便可预测答案。答案是连续的值时称为回归,答案是分类标签时称为分类。
举例:给出一些已经标记是否为垃圾邮件的邮件样本,推测新邮件是否为垃圾邮件。 - 无监督学习:训练所用样本中不包含正确答案。通常用于聚类。
举例:在银行的用户行为数据中,发现行为存在异常的用户。 - 强化学习:不提供一系列的样本,而是给出一个具有特定规则的环境、允许的动作集合和一个奖惩函数;模型能够观察环境并作出动作,从而改变环境并且模型受到奖励/惩罚。然后,模型学习该经验并继续观察环境、做出动作。
举例:让AI玩Dota。除了已有的环境(游戏战场)、动作集合(移动和技能)之外,还需要给出一个胜率预测函数以便提供奖惩。 - 二元分类:回答是/否
- 多元分类:将
- 回归问题:
- 模型参数,model parameters:在机器模型中储存的参数。在训练开始时通常被初始化为随机值,随着训练过程逐步改变,从而使模型逐步逼近目标。该参数由计算过程自动控制,无法人为指定。依据模型复杂度,参数数量可能有百万到千亿个。
- 超参数,hyperparameters:模型算法需要的启动参数,比如学习率、批处理的每批个数、输入图像的分辨率等等;根据算法的不同,超参数可能有十几或数十个。调整超参数可以显著影响学习速度和最终准确度。没有一个明确的方法可以确定如何选择超参数,因此经常需要在一个算法中试验不同的超参数组合以达到最优训练效果。
- 在监督学习中,应将数据集以8:1:1或70:15:15的比例分为训练集、验证集和测试集。
- 训练集,training set:用于训练模型,调整模型的参数。
- 验证集,validation set:用于检验模型的状态,判断收敛情况。判断具有不同超参数的多个模型的优劣,并监督是否产生过拟合。
- 测试集,test set:用来最终评价模型的性能。由于训练集作用于参数,验证集作用于超参数,因此用单独的测试集评价模型更为客观。
弹性GPU, Elastic GPUs
在EC2实例中加载一个特殊OpenGL驱动,使得所有渲染请求通过实例网络传输到相同子网中的GPU端点,并在计算后返回结果。
这种机制并非在实例中连接GPU(设备管理器中看不到GPU设备),也不支持OpenGL之外的使用方式。其优势是可以少量的使用GPU,对于需求低的使用方式来说,成本远低于G系列实例。劣势是通过网络传输数据会占用实例网络带宽,并且带宽和延迟明显较PCIe接口性能低。
该技术没有使用在SageMaker中。
SageMaker Elastic Inference,EI,弹性推理
可以为EC2附加一个EI加速器,这是一个低性能GPU实例,与EC2通过网络通讯。EI加速器可以提高推理速度。标准GPU实例对于推理来说性能过高造成浪费,EI在推理所需性能和成本之间取得平衡,最高可节省75%成本。
- EI仅能附加到SageMaker笔记本和托管终端节点。
- 仅支持AWS优化的TensorFlow和MXNet。可以使用SageMaker Python开发工具包或SageMaker预构建容器中的版本。
SageMaker inference pipeline,推理管道
将最多五个容器顺序组合在一起,视为单一推理模型。前一个容器的输出成为后一个容器的输入。这特别适合需要在推理终端节点中加入原有模型不包含的预处理和后处理功能。推理管道中的所有容器在同一台EC2上运行。支持SageMaker内置算法和用户自定义镜像。
推理管道是不可变的,但可通过UpdateEndpoint API部署新管道。
SageMaker model tracking/Search,模型跟踪/搜索
用于管理模型的成百上千个变体。可以依据元数据查找模型、依据指标找出性能最佳的模型、跟踪模型谱系等。