算法工程师基础理论

  • 0.写在前面
  • 机器学习流程
    • 基本概念
      • 数据
      • 从数据到答案
      • 将原始数据映射到特征
      • 模型:数据关系的近似描述
  • 高屋建瓴
  • 1. 特征工程
    • 预处理:将原始数据变为特征向量
      • 1.数值变量:归一化/标准化处理
        • 1.1 归一化/标准化
        • 1.2 L1/L2范数标准化
      • 2. 分类变量:one-hot 编码
      • 3. 缺失值、特殊值处理
      • 4. 特征转换、构造新特征
    • 特征选择(=降维?)
      • 1. 过滤法(Filter)
      • 2. 包装法(Wrapper)
      • 3. 嵌入法(Embedded)
      • 寻找高级特征
    • 补充:处理不平衡数据
      • 1. 权重法
      • 2. 采样法
      • 3. SMOTE算法
      • AUC曲线
    • 降维
    • 补充问题
      • 1. 有哪些文本表示模型?它们各有什么优缺点?
      • 2. 图像数据不足时的处理方法
  • 2. 模型评估
    • 1. (离线)评估指标的局限性
    • 2. ROC曲线(受试者工作特征曲线)
    • 3. 余弦距离的应用
    • 4.(在线)A/B测试的陷阱
    • 5. (离线)模型评估的方法
    • 6. 超参数调优
    • 7. 模型过拟合与欠拟合
  • 3. 经典算法
    • 3.1 支持向量机
    • 3.2 逻辑回归
    • 3.3 决策树
    • 3.4 降维
    • 3.5 非监督学习
      • 3.5.1 K-means
      • 3.5.2 高斯混合模型(GMM)
      • 3.5.3 自组织映射神经网络(SOM)
      • 3.5.4 聚类算法的评估
    • 3.6 概率图模型(这块是空白)
  • 4.优化算法
    • 4.1 常见损失函数
    • 4.2 优化问题
    • 4.3 经典优化算法
    • 4.4 随机梯度下降及改进
    • 4.5 L1正则化与稀疏性
  • 5. 采样
    • 5.1 采样的作用
    • 5.2 常见的采样方法
    • 5.7 样本不均衡问题
  • 深度学习
  • 6. 前向神经网络
    • 6.1 多层感知机与布尔函数
    • 6.2 神经网络的激活函数
    • 6.3 多层感知机的反向传播算法(这块是薄弱)
    • 6.4 神经网络训练技巧
    • 6.5 深度卷积网络
    • 6.6 深度残差网络
  • 循环神经网络
  • 强化学习
  • 集成学习
  • NLP
  • CV
  • Coding
  • 数学
  • 参考
    • 其它总结博客
    • 知识点参考
  • 总结
    • 特征工程
    • 数据预处理(特征工程的核心)

记录所学,方便复习。

特征工程
|
模型评估
|
经典算法
|
降维
|
非监督学习
|
优化算法
|
采样
|
集成学习
|
神经网络

(0)问题:自我检验: 面试经验 | AI 算法工程师(面试官角度)

(1)综合知识点整理:

  1. 2020 AI 算法岗春招汇总 & 面经大全来了!点击接收你的招聘秘籍

    2.机器学习算法岗面试与提问总结

(2)零散知识
数据预测处理:

合鲸:干货 | 教你一文掌握数据预处理

(3)随文详解 :自己记录详细的知识

  • 特征工程——一些知识点

0.写在前面

机器学习流程

基本概念

学了那么多机器学习的理论和算法模型,回过头来再看看这最基础的几个概念:数据、特征和模型。

数据

数据是对现实世界现象的观测
例如,股票市场数据包括对每日股价、各个公司的盈余公告,甚至专家学者发表的股评文章的观测;个人的生物特征数据包括对每分钟的心率、血糖水平、血压等指标的测量。不同领域的数据示例无穷无尽,不一而足。

每份数据都是管中窥豹,只能反映一小部分现实,把这些观测综合起来才能得到一个完整的描述

但这个描述非常散乱,因为它由成千上万个小片段组成,而且总是存在测量噪声和缺失值

总而言之,我们用数据来描述客观事物。这些数据总是会不同程度地存在着噪声和缺失值。
想要(理想地)完整描述需要无穷尽的数据,所以这个描述显得非常散乱。

从数据到答案


从数据到答案的路上,充满了错误的开始和死胡同,经常是有意栽花花不发,无心插柳柳成荫。
数据处理工作流往往是多阶段的迭代过程。

举个例子,股票价格是在交易所中观测到的,然后由像汤森路透这样的中间机构进行汇集并保存在数据库中,之后被某个公司买去,转换为一个 Hadoop 集群上的 Hive 仓库,再被某个脚本从仓库中读出,进行二次抽样和各种处理,接着通过另一个脚本进行清洗,导出到一个文件,转换为某种格式,然后你使用 R、Python 或 Scala 中你最喜欢的建模程序进行试验。接着,预测结果被导出为一个CSV 文件,再用一个估值程序进行解析。模型会被迭代多次,由产品团队用 C++ 或 Java 重写,并在全部数据上运行,然后最终的预测结果会输出到另一个数据库中保存起来。

然而,如果我们不被这些杂乱的工具与系统所迷惑,就能够发现这个过程包括两个构成机器学习基础的数学实体特征模型

将原始数据映射到特征

特征就是,于己而言,特征是某些突出性质的表现,于它而言,特征是区分事物的关键。(参考知乎某答)

我们将描述事物的特征分为数值型特征(定量特征)和非数值型特征(定性特征)。根据数据是否无限可分,可以将数值型特征再继续细分为连续特征和离散特征。
(关于统计学中连续变量和离散变量的定义可参考:

在统计学中,变量按变量值是否连续可分为连续变量与离散变量两种。在一定区间内可以任意取值的变量叫连续变量,其数值是连续不断的,相邻两个数值可作无限分割,即可取无限个数值。例如,生产零件的规格尺寸,人体测量的身高、体重、胸围等为连续变量,其数值只能用测量或计量的方法取得。
反之,其数值只能用自然数或整数单位计算的则为离散变量。例如,企业个数,职工人数,设备台数等,只能按计量单位数计数,这种变量的数值一般用计数方法取得。)
即:
离散特征 = 定性特征 ?——(X)
连续特征 = 定量特征 ?——(X)
定量特征:离散特征 + 连续特征(√)
关于变量:点击

从上一节的例子中可以得知,我们平时验证自己的模型时用到的数据集大多数都是已经是被整理过和处理好的数据(由特征和特征值组成)

很多机器学习算法要求输入的样本特征是数学上可计算的, 因此在机器学习之前我们需要将这些不同类型的数据转换为向量表示.即将数据特征向量化
,完成数据的特征表示。(原始数据空间——特征空间)
(也有一些机器学习算法,比如决策树,不需要向量形式的特征,当然也就不需要特征工程中的归一化等处理)

模型:数据关系的近似描述

数据的数学模型 描述了数据不同部分之间关系
例如,预测股票价格的模型可以是一个公式,它将公司的收入历史、过去的股票价格和行业映射为预测的股票价格。音乐推荐模型可以基于收听习惯测量用户之间的相似度,然后向收听大量同种歌曲的用户推荐同一个音乐家。

  • 线性模型、非线性模型
    常见的机器学习模型可以简单的划分为线性模型非线性模型

线性模型和非线性模型的区别:
a.线性模型可以用曲线拟合样本,线性模型可以是用曲线拟合样本,但是分类的决策边界一定是直线的,例如logistics模型(广义线性模型,将线性函数进行了一次映射)。
b. 区分是否为线性模型,主要是看一个乘法式子中自变量x前的系数w,如果w只影响一个x,那么此模型为线性模型。或者判断决策边界是否是线性的
c. 其实最简单判别一个模型是否为线性的,只需要判别决策边界是否是直线,也就是是否能用一条直线来划分

更多线性/非线性模型概念:点击

  • 生成式模型、判别式模型
    对于监督学习来说,其任务就是学习一个模型,应用这一模型,对给定的输入预测相应的输出。
    监督学习方法又可以分为生成方法(generative approach)和判别方法(discriminative approach)。所学到的模型分别称为生成模型(generative model)和判别模型(discriminative model)。

更多点击:
由生成模型与判别模型引发出的思考、是什么机器学习中生成模型/判别模型?

高屋建瓴

启发

数据
|
特征 <-特征工程:空间转换(欧式空间-向量表示)、归一化、特征选择、降维
|
模型 <- 数据关系的近似描述:“距离”比较(距离、相似度计算)…
|
答案 <-描述结果:分类、回归、排序…

简单地说,我们的最终目的非常清晰明了:发现数据 + 理解数据。

如果以数据为视角,在本质上来看,整个机器学习的流程不过是一个进行数据分析的过程,只不过因为在将数据变为有用的特征和数据关系描述建模,即特征模型这两块用到了数学的方法,因此显得比较专业化。前者即是特征工程的任务,主要包括我们目前所熟知的向量化、归一化和缺失值处理等预处理工作,以及特征选择降维等主要步骤而后者,模型的构建主要是利用常见的数学模型,例如机器学习中常用到的线性回归和逻辑回归等线性模型,决策树、随机森林和梯度提升(gradient boosting)等树模型以及以CNN为代表的的神经网络模型等。

1. 特征工程

问题:

  1. 离散、连续特征一般怎么处理(onehot、归一化、why、方法 等);

  2. 特征变换、构造/衍生新特征(woe、iv、统计量 等);

  3. 特征筛选(离散、连续、多重共线性 等);

  4. 采样(除了随机呢?);

  5. 缺失值处理(离散、连续)


特征工程的概念:

有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。从本质上来讲,特征工程是一个表示和展现数据的过程。在实际工作中,特征工程旨在去除原始数据中的杂质和冗余,设计更高效的特征刻画求解的问题与预测模型之间的关系

通过总结和归纳,人们认为特征工程包括以下方面:(感觉是真的站在了工程的角度上来总结)

  • 特征使用方案(数据来源+可用性评估)
  • 特征获取方案(获取+存储)
  • 特征处理(特征清洗+预处理——是核心部分)
  • 特征监控(特征有效性分析+监控重要)

特征工程的核心:特征处理

特征处理是特征工程的核心部分,sklearn提供了较为完整的特征处理方法,包括数据预处理,特征选择,降维等。
框架如下:

预处理:将原始数据变为特征向量

这里主要将 数据分为数值变量分类变量来进行,而不是现在经常见到的连续型变量和离型变量(这种分法很直观,但是好像不太正确,在下面会阐述)

1.数值变量:归一化/标准化处理

作用:① 无量纲化:将不同规格的数据转换到同一规格——以使得不同的特征具有相同的尺度(Scale),以解决不同指标无法比较的问题。②在训练神经网络的过程中,通过将数据标准化,能够加速权重参数的收敛(加快了梯度下降求最优解的速度)。

写在前面:标准化和归一化这两个词经常混用,所以不用具体纠结于区分标准化和归一化,自己喜欢的话,可以统一叫做”标准化/归一化“。

1.1 归一化/标准化

数值类型的特征做归一化可以将所有的特征都统一到一个大致相同的数值区间内。最常用的方法主要有以下两种:

  • 零均值归一化(Z-Score Normalization) / z-score 标准化 / 方差缩放

    零均值归一化是最常见的特征预处理方式,它的作用是将原始数据中心化(分子部分),并标准化成均值为0、标准差为1的一个服从正态分布的数据。

    如何本质上理解0均值归一化?其实就是取其离散程度的比值:(依据数据分布)将数据原来x到中心点μ的距离和标准差的比值当做新的x‘(”像标准分布靠拢“)

  • 线性函数归一化(Min-Max Scaling)/ min-max 归一化/min-max缩放/极差变换
    对原始数据进行线性变换,将其映射到 [0,1]的范围


    如何本质上理解线性函数归一化?其实就是取其极差的比值:(将数据看为在一维直有限直线上的分布)将x在原来线段长度上所占的比值作为新的x’(”像标准线段靠拢“)

注意:不要“中心化”稀疏数据!
在稀疏矩阵上执行 0 均值归一化和 min-max 归一化会将其变成密集特征向量,因为他们都会从原始特征值中减去一个量(min 或者μ)。

归一化相关更详细解释:点击1 、点击 2

1.2 L1/L2范数标准化

根据范数来进行 Normalization

将|x1|到 |xn| 先取p次幂再取 1/p 次幂不仅计算麻烦而且没啥用啊,所以取每一个 |xn|的p次幂,求和之后再取 1/p 次幂!——纯属YY

可见,L2范数即为欧式距离,则规则为L2的Normalization公式如下所示,易知,其将每行(条)数据转为相应的“单位向量”。


范数归一化的过程是将每个样本缩放到单位范数(结合单位向量进行理解,p=2时为单位向量,其他为单位范数),如果后面要使用如二次型(点积)或者其它核方法计算两个样本之间的相似性这个方法会很有用。

更多参考之前的文章:“距离”、“范数”和范数正则化

补充:

  • 归一化的好处:加快梯度下降收敛的速度;

  • 适用范围:包括线性回归、逻辑回归、支持向量机、神经网络等使用梯度下降求解的模型,不适用于决策树等模型,因为归一化并不会改变样本在特征x上的信息增益。

2. 分类变量:one-hot 编码

数据一般的处理方法
对数值变量进行归一化,比如零均值归一化;
对分类变量进行 one-hot 编码序号编码

序号编码:序号编码通常用于处理类别间具有大小关系的数据。例如高表示为3、中表示为2、低表示为1,转换后依然保留了大小关系。

其它需要进一步转换的情况:

  • 将离散特征连续化——将数据向量化(满足模型输入);增加模型非线性性

    • one-hot 编码:对离散特征进行编码
    • embedding(特征嵌入)
  • 将离散特征离散化——有时候就算你需要的是离散值,也是没法直接使用的
    • one-hot 编码
    • dummy coding 虚拟编码/哑编码
  • 将连续特征离散化
    • 区间划分:根据阈值进行分组

3. 缺失值、特殊值处理

(1)缺失值
特征有缺失值是非常常见的,对于连续特征,一般采取两种方式来处理:

  • 取含有该特征所有样本的平均值作为缺失值的填充
  • 中位数来进行填充

对于离散型特征,一般取“众数”来进行填充,即选择所有有该特征值的样本中最频繁出现的类别值

在sklearn中,可以使用preprocessing.Imputer来选择这三种不同的处理逻辑做预处理。

(2)特殊值

有些特征的默认取值比较特殊,一般需要做了处理后才能用于算法,比如日期时间
对于时间原始特征,处理方法有很多:

  • 使用连续的时间差值法
    即计算出所有样本的时间到某一个未来时间之间的数值差距,这样这个差距是UTC的时间差,从而将时间特征转化为连续值
  • 离散化,根据时间所在的年,月,日,星期几,小时数,将一个时间特征转化为若干个离散特征
  • 权重法,即根据时间的新旧得到一个权重值。
    具体可参考: 特征工程之特征表达

4. 特征转换、构造新特征

(1)特征变换——解决非正态性的问题
数据变换一般分为单变量变换多变量变换
一般来说多变量变换就成为了特征抽取(Feature Extraction),维度压缩(Dimension Reduction),数据分解(Decomposition)等, 譬如主成分分析(PCA)。这里主要还是单变量的变换。

单变量的变换又分为线性变换和非线性变换, 这里主要是利用一些非线性变换, 来获取合适数据分布的常见方法。

常见的变换方法有如下几种:


(未包括线性变换)

一般使用经验
(破折号后面代表使用的条件/情况)

  • 直接标准化——变换前,数据接近正态分布

  • square-root变换(取均方根)——变换前数据分布,偏中前

  • logarithmic变换(取 log)——变换前数据分布,偏前

  • inverse/reciprocal变换(取倒数函数)——变换前数据分布,集中前面

  • square变换(取平方)——变换前数据分布,偏中后

  • exponential变换(取指数函数)——变换前数据分布,偏后

个人理解:为什么这些个情况,通过这些函数的变换就可以将数据分布向正态分布靠拢?其实结合这些常见数学函数的图像就可以理解了:

  • 转换函数的目的是将原来在某一部分(非中心位置)集中的 y 值变得分散,所以可以选择那些在相应位置y的取值随着x变化非常剧烈(y被打散)的函数。
  • 原数据越是表现得极端(极端靠近分布的两头),就越应该使用在相应位置变化趋势越快的那些转换函数;
  • 靠近头部/前部的袁(原始)数据的都比较小,取平方根、log 、倒数函数会更有效(效果依次递增),而靠近尾部/后部的(原始)数据都比较大,取平方、指数函数的作用会更明显(效果依次递增)

更多参考:点击

(2)构造/衍生新特征
参考下面的小结:[寻找高级特征]

特征选择(=降维?)

首先,看当业务已经整理好各种特征数据时,第一步是找到该领域懂业务的专家,让他们给一些建议。
其次,通常来说,我们需要从特征是否发散(看方差)特征与目标的相关性这两个方面来考虑选择特征。

特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。

这样看来,特征选择与降维似乎是一个意思?
不不不,特征选择和降维有着些许的相似点,这两者达到的效果是一样的,就是试图去减少特征数据集中的属性(或者称为特征)的数目;
但是两者所采用的方式方法却不同:降维的方法主要是通过特征间的关系,如组合不同的特征得新的属性,这样就改变了原来的特征空间;而特征选择的方法是从原始特征数据集中选择出子集,是一种包含的关系,没有更改原始的特征空间。参考点击

具体来说,常规特征选择的方法有以下三类:

1. 过滤法(Filter)

其主要思想是:对每一维的特征“打分”,即给每一维的特征赋予权重,这样的权重就代表着该维特征的重要性,然后依据权重排序。

  • 方差
    最简单的方法就是方差筛选。方差越大的特征,那么我们可以认为它是比较有用的。在实际应用中,我们会指定一个方差的阈值,当方差小于这个阈值的特征会被我们筛掉。

    如果方差较小,比如小于1,那么这个特征可能对我们的算法作用没有那么大。最极端的,如果某个特征方差为0,即所有的样本该特征的取值都是一样的,那么它对我们的模型训练没有任何作用,可以直接舍弃。最极端的,如果某个特征方差为0,即所有的样本该特征的取值都是一样的,那么它对我们的模型训练没有任何作用,可以直接舍弃。

  • 相关系数
    分别计算所有训练集中各个特征与输出值之间的相关系数,设定一个阈值,选择相关系数较大的部分特征。

  • 假设检验
    比如卡方检验,卡方检验可以检验某个特征分布和输出值分布之间的相关性。
    还可以使用 F 检验t 检验

  • 互信息
    即从信息熵的角度分析各个特征和输出值之间的关系评分。互信息值越大,说明该特征和输出值之间的相关性越大,越需要保留。

2. 包装法(Wrapper)

包装法的解决思路没有过滤法这么直接,它会选择一个目标函数来一步步的筛选特征。

其主要思想是:将子集的选择看作是一个搜索寻优问题,生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个是一个优化问题,这里有很多的优化算法可以解决,尤其是一些启发式的优化算法,如GA,PSO,DE,ABC等。

最常用的方法是递归消除特征法(recursive feature elimination,RFE)。递归消除特征法使用一个机器学习模型来进行多轮训练,每轮训练后,消除若干权值系数的对应的特征,再基于新的特征集进行下一轮训练。

我们下面以经典的SVM-RFE算法来讨论这个特征选择的思路。这个算法以支持向量机来做RFE的机器学习模型选择特征。它在第一轮训练的时候,会选择所有的特征来训练,得到了分类的超平面

2020 AI 算法工程师常见知识点整合相关推荐

  1. 推荐收藏 | 算法工程师常见面试问题及相关资料汇总

    关注上方"视学算法",选择"星标公众号", 关键时间,第一时间送达! 编辑:数据派THU Github传送门: https://github.com/lcylm ...

  2. 年薪30W起,如何4个月拿下AI算法工程师offer?

    自2017年10月开设第1期课程以来,我们已经帮助了数千名同学迈入了AI人工智能领域,同时与阿里.腾讯等大厂达成深度人才战略合作,光环人工智能课程学员可额外享受大厂及其生态系企业人才直推福利. 在以往 ...

  3. 90 后美女独家秘籍:从小白到 AI 算法工程师

    这是一篇关于如何成为一名AI算法工程师的长文~ 经常有朋友私信问,如何学python呀,如何敲代码呀,如何进入AI行业呀? 正好回头看看自己这一年走过的路,进行一次经验总结. 来看看你距离成为一名AI ...

  4. 我的一年AI算法工程师成长记

    作者 | 张怡 来源 | Datawhale(ID:Datawhale) [导语]经常有朋友私信问,如何学python?如何敲代码?如何进入AI行业?正好回头看看自己这一年走过的路,进行一次经验总结. ...

  5. (建议收藏)算法工程师常见面试问题及相关资料汇总

    目录 算法工程师 Github.牛客网.知乎.个人博客.微信公众号.其他 机器学习 面试问题.资料.代码实战 深度学习 面试.资料.代码实战Pytorch.代码实战TensorFlow.网课 C/C+ ...

  6. 算法工程师常见面试问题及相关资料汇总

    点击上方"AI派",选择"设为星标" 最新分享,第一时间送达! ☞[加薪必备]全套零基础学AI资料免费领! 目录 算法工程师 Github.牛客网.知乎.个人博 ...

  7. 一名阿里安全一线AI算法工程师的“三观”

    在阿里巴巴集团安全部,有一个专注于计算机视觉.自然语言处理.机器学习和深度学习的团队,其全称为阿里安全图灵实验室.该实验室的相关技术广泛应用于手淘.天猫.支付宝.闲鱼.优酷土豆.UC.阿里妈妈等核心业 ...

  8. 阿里安全图灵实验室炫谦:如何成长为一名优秀的AI算法工程师?

    在阿里巴巴集团安全部,有一个专注于计算机视觉.自然语言处理.机器学习和深度学习的团队,其全称为阿里安全图灵实验室.该实验室的相关技术广泛应用于手淘.天猫.支付宝.闲鱼.优酷土豆.UC.阿里妈妈等核心业 ...

  9. 开源!《AI 算法工程师手册》中文教程正式发布!

    作者 | 红色石头 转载自 AI有道(id:redstonewill) 最近红色石头在浏览网页的时候,偶然发现一份非常不错的 AI 资源,就是这本<AI 算法工程师手册> .本文将给大家推 ...

最新文章

  1. 用批处理查询电脑信息
  2. linux下eclipse的使用教程,linux下Eclipse的使用方法总结.doc
  3. 在ubuntu 14.04 编译android 2.3.1 错误解决办法
  4. SQL Server 获取所有表和数据的批量操作
  5. 浅谈PHP+Access数据库的连接 注意要点
  6. 【数据结构与算法】排序优化
  7. ibatis调用mysql带OUT类型参数的存储过程并获取返回值
  8. 数据库SQL Server DAC 导入导出数据到SQL Azure问题
  9. Java中递归复制多级文件夹(IO流)
  10. PDF、图片转OCR文字识别合集【网站+PC软件+手机APP+小程序】
  11. IPFS 存储文件夹 与 IPNS的应用
  12. Generative Adversarial Text to Image Synthesis 论文翻译精校版
  13. 留良乡投资理财只需做到这五点
  14. 2020中国上市公司品牌价值榜20强发布
  15. webpack将部分图片打包后转化为base64
  16. 《算法笔记》4.4小节——算法初步->贪心
  17. mysql read rnd next_mysql Handler_read_rnd_next value 值超大(10G+)的处理
  18. 【参赛记录】糖尿病遗传风险预测
  19. 这几个图片工具请收藏好,能够解决大家拼图需求
  20. qt支持的html5,用 Qt 5 中实现多国语言支持

热门文章

  1. 计算机应用研究 相对好发一些,传感技术学报期刊好投吗_机械科学与技术录用率高吗_计算机工程与应用被拒还能再投吗...
  2. MySQL之DQL(数据查询语言)-常见关键字
  3. LWD主要功能及优点是什么?
  4. JS前端关于加密和解密
  5. 用友U8开放平台的 api接口
  6. IEEE Fellow推荐,2023年计算机EI学术会议最新列表,录用率高,审稿周期短!
  7. 物联网开发到底是干什么的?
  8. 看过来看过来,快去看看这个网站!!!
  9. 病毒是怎么命名的?认识病毒命名规则
  10. vue 引入avue