机器学习与深度学习

置顶

  1. 不知道为什么,就是不想学机器学习。。。但为了完成作业,还是得了解一下。

  2. 之前用过sklearn,也学习过机器学习的知识,现在有点忘了,再整理一下。


一、机器学习概述

1. 机器学习算法分类

1. 监督学习

  • 定义

    • 输入特征值和目标值,输出连续的值(回归)或离散值(分类)

  • 分类算法

    • k-近邻算法,贝叶斯分类,决策树和随机森林,逻辑回归,SVM

  • 回归算法

    • 线性回归,岭回归

2. 无监督学习

  • 定义

    • 输入特征值,无标签

  • 算法

    • 聚类k-means

2. 机器学习开发流程

  1. 获取数据

  2. 数据处理(清洗)(可以用pandas)

  3. 特征工程

  4. 机器学习算法训练模型(可以用sklearn)

  5. 模型评估,若不好回到2-4,好的话继续

  6. 应用

3. 一般的算法工程师的工作

  1. 分析数据

  2. 分析业务

  3. 应用常见的算法

  4. 特征工程,调参,优化

4. 框架

  1. 机器学习

    • scikit learn(sklearn)

  2. 深度学习

    • tensorflow(最火)

    • pytorch/caffe2等

5. 没有免费的午餐

  • 某个算法在某个问题中效果好,在另一个问题中可能效果就不好

二、特征工程

1. 获取数据集

2. 数据集划分

  • 划分为训练集和测试集,比例通常为7:3左右

3. 特征抽取

  • 将任何数据(如文本和图像)转换成可用于机器学习的数字特征

    • 字典特征处理(特征离散化)

    • 文本特征处理

    • 图像特征处理

4. 特征预处理

  • 数值型数据的无量纲化

    1. 归一化

      • 即让数据归一到0~1区间

      • 受异常值(特别大的值和特别小的值)影响较大

      • 适用于传统精确小数据场景

    2. 标准化

      • x'=(x-mean)/a,a为标准差

      • 适用于现代嘈杂大数据场景

5. 特征降维

  • 定义:降低特征个数,得到一组"不箱管"主变量的过程

    • 例如:相关特征:相对湿度和降雨量,二者数据冗余,若冗余过多,降低处理速度

三、分类算法

1. KNN/K-近邻算法

  1. 原理

    • 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别

  2. 问题

    • k值取得过小,会受异常点影响

    • k值取得过大,样本不均衡会影响

  3. 优点

    • 简单易理解,易于实现,无需训练

  4. 缺点

    • k值选择不当则分类精度不能保证

    • 懒惰算法,对测试样本分类时的计算量大,内存开销大

  5. 使用场景

    • 小数据场景,千级别的数据

2. 朴素贝叶斯算法(常用与文本分类)

  1. 定义

    • 朴素:假设特征与特征之间是相互独立的

    • 贝叶斯:贝叶斯公式

    • 分类完后样本属于各个类别有不同的概率值,取概率值大的为预测类别

  2. 优点

    • 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率

    • 对缺失数据不太敏感,算法也较简单,常用于文本分类

    • 分类准确度高,速度快

  3. 缺点

    • 由于使用了样本属性独立性的假说,所以如果特征属性有关联时效果不好

3. 决策树

  1. 思想与原理

    • if-else,特征有优先级

    • 原理:信息熵,信息增益等,需要信息论知识

  2. 信息论基础 (1) 信息 - 香农:消除随即不定性的东西 - 例子:小明:“我今年18岁了”,可以得到一条信息。小华再说:“小明明年19岁”。这句话就不是信息了,是确定的东西,信息熵为0 (2) 信息的衡量(消除不确定性) - 信息量 - 信息熵 (3) 信息增益 - 决策树的划分依据之一,值越大,特征优先级越高,还有其他划分依据:信息增益比,基尼系数等

  3. 优点

    • 理解简单,树木可视化

  4. 缺点

    • 决策树学习者可以创建不能很好地推广数据的过于复杂的树,这被称为过拟合

  5. 改进

    • 剪枝cart算法

    • 随即森林

  6. 应用

    • 企业重要决策

4. 随即森林

  1. 集成学习方法

    • 通过建立几个模型组合的来解决单一预测问题

    • 生成多个分类器/模型,各自独立的学习和做出预测。这些预测最后组合城组合预测,因此优于任何一个单分类的预测

  2. 随即森林

    • 包含多个决策树的分类器,属于集成学习方法之一

  3. 随即

    • 训练集随机,从原有N个样本中随即有放回的抽样N个

      • 为什么随即抽样?为了让各个树不一样

      • 问什么有放回?若不放回,各个树没有交集,每棵树都是“有偏的”“片面的”,各个树训练出来的差异大

    • 特征随即,从M个特征中随即抽取m个特征,M>>m,降维

  4. 优点

    • 在当前算法中,具有较好的准确率

    • 能有效运行在大数据集上,处理具有高纬度特征的样本,而且不需要降维

    • 能评估各个特征在分类问题上的重要性

四、回归与聚类算法

1. 线性回归

  1. 定义:目标值是连续的数据

  2. 通用公式:h(w)=w1x1+w2x2+...+b=Wx+b

  3. 线性模型

    • 线性关系:x的次数都为1

    • 非线性关系:x的次数不定,如x+x^2+x^3

  4. 线性回归的损失和优化原理

    • 目标:求模型参数

    • 损失函数/cost/成本函数/目标函数

      • 最小二乘法

    • 优化算法

      • 正规方程:直接求W,当特征值过多过复杂时,求解速度过慢且得不到正确结果,不能解决过拟合的问题

      • 梯度下降:不断试错改进,需要手动指定学习速率(超参数)

2. 欠拟合与过拟合

  1. 过拟合

    • 训练集效果好,测试集效果不好

  2. 欠拟合

    • 学习特征过少

  3. 解决方案

    • L1正则化:使一些w直接为0,删除影响,又名LASSO回归

    • L2正则化:更常用,使得其中一些w很小,接近0,削弱某个特征的影响,又名岭回归。损失函数+惩罚项

3. 岭回归

  • 就是用了L2正则化的线性回归

4. 分类算法--逻辑回归与二分类

  1. 应用场景

    • 如是否是垃圾邮件,是否患病等

  2. 原理

    • 输入:逻辑回归的输入就是线性回归的输出结果,h(w)=w1x1+w2x2+...+b=Wx+b

    • 激活函数:sigmoid函数

    • 分析:将回归的结果输入到sigmoid函数中,输出结果为[0,1]间的一个概率值,默认为0.5为阈值,大于这个阈值属于一个类别,小于阈值属于另一个类别

  3. 损失函数

    • 其值越小越好

    • 因为实际分类为1或0,最小二乘法适用于连续数据,在这里不适用,要用对数似然损失

  4. 优化损失

    • 梯度下降

5. 分类的评估方法

真实结果\预测结果
正例
假例

正例

真正例TP

伪反例FN

假例

伪正例FP

真反例TN

  1. 精确率

    • 预测结果为正例样本中,真正为正例的比例

    • TP/(TP+FP)

  2. 召回率

    • 真实为正例的样本中预测结果为正例的比例(对正样本的区分能力,常用)

    • TP/(TP+FN)

  3. F1-score

    • 反应模型的文件稳健性

6. ROC曲线与AUC指标--衡量样本不均衡下的评估

  1. ROC曲线

    • TPR为纵轴,TPR是召回率

    • FPR为横轴,TPR是在所有真实类别为假的样本中,预测为假的比例

  2. AUC指标

    • 就是ROC曲线下方的面积

    • 范围[0.5,1],若是0.5,相当于瞎猜

    • AUC只能用来评价二分类

    • AUC非常适合评价样本不均衡中的分类器性能

五、无监督学习--K-means算法

1. 什么是无监督学习

  • 没有目标值

2. 无监督学习算法

  • 聚类:K-means(K均值聚类)

  • 降维:PCA

3. K-means原理

  1. 随即设置K个特征空间内的点作为初始的聚类中心

  2. 对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别

  3. 接着对着标记的聚类中心后,重新计算出每个聚类的新中心点(平均值)

  4. 如果计算的新中心点与原中心点一致,结束。否则重复2

4. 优点

  • 采用迭代式算法,直观易懂且实用

5. 缺点

  • 容易收敛到局部最优解。解决办法:多次聚类

6. 应用场景

  • 一开始没有目标值,可以先聚类获得目标值,再分类


六、深度学习介绍

1. 深度学习与机器学习的区别

  1. 特征提取方面

    • 机器学习:特征工程步骤手动完成,需要大量领域专业知识

    • 深度学习:通常由多个层组成。它们通常将更简单的模型组合在一起,将数据从一层传递到另一层来构建更复杂的模型。通过训练大量数据自动得出模型,不需要人工特征提取环节。

      • 深度学习适合用在难提取特征的图像,语音,自然语言处理领域

  2. 数据量和计算性能要求

    • 深度学习需要大量的训练数据

    • 训练深度神经网络需要大量的算力

      • 所有深度学习通常需要强大的GPU服务器来计算

      • 需要全面管理的分布式训练与预测服务——如谷歌Tensorflow云机器学习平台

  3. 算法代表

    • 机器学习:朴素贝叶斯,决策树等

    • 深度学习:神经网络

2. 深度学习应用场景

  1. 图像识别

    • 物体识别,场景识别,车型识别,人脸检测跟踪,人脸关键点定位,人脸身份认证

  2. 自然语言处理

    • 机器翻译,文本识别,聊天对话

  3. 语言技术

    • 语音识别

GPU/CPU

  1. CPU

    • 核心数量少,但每一个核心的速度更快,性能更强

    • 更适用于处理连续性任务(sequential)

  2. GPU

    • 核心数量多,但每一个核心的速度慢

    • 更适用于处理并行任务(parallel)

七、Tensorflow框架

1. Tensorflow结构

  1. 构建阶段:数据(张量)与操作(节点)的执行步骤描述成一个图

  2. 执行阶段:使用会话执行构建好的图中的操作。session

  3. 数据流图

    • Tensor——数据——张量

    • Flow——操作——节点

2. 会话

  1. 创建会话,常用tf.session

  2. 会话初始化参数

  3. 会话的执行——run(op,feed_dict=None)

    • op:单一的operation操作

    • feed_dict:传入的数据,与tf.placeholder()搭配

3. 张量

  1. 定义

    • 就是数据的定义

    • n维数组

  2. 创建张量

    • tf.zeros(),全0

    • tf.ones(),全1

    • tf.constrant(),常量

    • tf.random_normal(),随即

    • tf.Varinable(),变量

    • tf.placeholder(),占位符

  3. 张量变化

    • 类型改变

    • 形状改变

    • 张量的数学运算

4. 变量op(操作)

  1. 创建变量

    • tf.Variable()

    • 变量需要显式初始化,才能运行值,如下:

5. 模型保存与加载

  • 用时再搜

6. 数据IO

1. 三种获取数据到Tensorflow程序的方式

2. 文件读取流程

  1. 构建文件名队列

    • tf.train.string_input_producer(string_tensor,shuffle=True)

    • string_tensor为列表

  2. 读取

    • tf.TextLineReader,读csv格式文件

    • tf.WholeFileReader,读取图片文件

    • tf.TFRecordReader,读取TFRecords文件

    • 用时再查

  3. 解码

    • 读取不同类型的文件,要进行相应的解码操作,解码成统一的Tensor格式

    • tf.decode_csv,解码csv文本文件

    • tf.image.decode_jpeg(contents),将JPEG编码的图像解码为uint8张量

    • tf.image.decode_png(contents),将PNG编码的图像解码为uint8张量

    • tf.decode_raw:解码二进制文件内容

  4. 批处理

    • 解码后只获得默认的一个样本内容,若想获取多个样本,需要加入到新的队列进行批处理

    • tf.train.batch

    • tf.train.shuffle_batch

7. TensorBoard可视化

  1. 图结构

    • 数据+操作

  2. 图相关操作

    • 默认图

      • 查看默认图:tf.get_default_graph()

      • 查看属性:sess.graph

    • 创建图

  3. 可视化

    • 数据序列化为events文件

    • 查看图

3. 图片数据

  1. 用张量表示一张图片

    • 张量形状:Tensor(指令名称,shape,dtype)

    • 对于shape

      • 一张图片:shape=(height,width,channels通道数)

      • 多张图片:shape=(batch,...如上),batch表示一个批次的张量数量

  2. 图片特征值处理

    • 若图片大小不一,要进行统一的缩放处理,保持特征数量相同

    • 方法:tf.image.resize_images(images,size)

    • 数据格式:

      • 存储:uint8

      • 矩阵计算:float32

八、神经网络

1. 人工神经网络(Artificial Neural Network,ANN)

  1. 简称神经网络(NN),经典NN结构包含三个层次的神经网络,分别为输入层,隐藏层,输出层。

  2. 感知机

    • 一种最基础的分类模型,类似于逻辑回归

    • 和逻辑回归激活函数不同,逻辑回归是sigmoid,感知机是sign

    • 感知机只能解决简单的与或问题

2. 神经网络原理

  1. 神经网络的主要用途在于分类,分类的原理要围绕损失,优化两块

  2. softmax回归

    • 将神经网络输出转换成概率结果。类似与逻辑回归中的sigmoid函数,sigmoid输出的是某个类别的概率

    • logits+softmax能解决多分类问题

  3. 交叉熵损失(损失函数)

    • 真实值要用one-hot形式[0,0,0,0,1,0,0,0],这样才能算离真实值的距离

    • 损失大小

      • 总损失——求平均

      • 最小二乘法——衡量线性回归的损失——均方误差

    • 优化损失函数

3. 手写数字识别例子

  1. 准备数据

  2. 构建模型

  3. 构造损失函数

  4. 优化损失

4. 卷积神经网络(CNN)

1. CNN和NN的区别

  1. NN

    • 只有输入层,隐藏层,输出层。

    • 隐藏层的层数根据需要而定,没有明确说多少层合适

  2. CNN

    • 在原多层网络的基础上,加入了更有效的特征学习部分,具体操作如下

      • 在原来的全连接层前加入了卷积层和池化层

    • 卷积神经网络出现,使得神经网络层数得以加深,“深度”学习由此而来

    • 2012年被重视

  3. 深度学习

    • 一般指的是这些CNN等新的结构以及一些新的方法(比如一些新的激活函数Relu等),解决了传统多层神经网络的一些难以解决的问题。

2. 卷积层

  1. 通过在原始图像上平移来提取特征

  2. 卷积核(Filter过滤器)四大要素

    • 卷积核个数

    • 大小,3*3,5*5

    • 步长

    • 零填充大小

  3. 卷积运算的目的是提取特征

  4. 每层卷积层由若干卷积单元(卷积核)组成

  5. 每个卷积单元的参数是通过反向传播算法以最佳化得到的

3. 激活层

  1. 使用激活函数,增加非线性分割能力

  2. sigmoid不能满足,效果不好,计算量大,且反向传播时,容易出现梯度消失

  3. Relu

    • 解决梯度消失问题

    • 计算速度快

    • 对图像没有负的像素值

4. 池化层pooling

  1. 主要作用是特征提取。通过去掉Feature Map中不重要的样本,进一步减少参数数量,降低网络的复杂度,防止过拟合。

5. 全连接层

  1. 前面的卷积和池化相当于做特征工程

  2. 最后的全连接层在整个CNN中起到“分类器”的作用,最后的输出层,进行损失计算

5. 网络设计

1. 一个简单的网络结构

  • 卷积|激活|池化--->卷积|激活|池化--->全连接

2. 具体参数

  1. 第一层:

    • 卷积:

      • 输入图像(None,28,28,1)

      • 32个filter,5*5,strides=1(步长),padding=SAME

      • 输出形状(None,28,28,32)

    • 激活:Relu

    • 池化:大小2*2,步长2

      • 输入图像(None,28,28,32)

      • 2*2,strides=2(步长)

      • 输出形状(None,14,14,32)

  2. 第二层:

    • 卷积:

      • 输入图像(None,14,14,32)

      • 64个filter,5*5,strides=1(步长),padding=SAME

      • 输出形状(None,14,14,64)

    • 激活:Relu

    • 池化:大小2*2,步长2

      • 输入图像(None,14,14,64)

      • 2*2,strides=2(步长)

      • 输出形状(None,7,7,64)

  3. 全连接层

    • [None,7,7,64]-->[None,7*7*64]

    • [None,7*7*64]*[7*7*64,10]=[None,10]

    • [None,1024]*[1024,10]=[None,10]

    • y_predict=tf.matmul(pool2,weights)+bias

3. 调参提高准确率

  1. 改变学习率,梯度下降的学习率

  2. 随即初始化的权重,偏置的值

  3. 选择好的优化器,梯度下降用的

4. CNN几种经典模型

  1. AlexNet

  2. ResNet

  3. GoogleNet

6. MNIST例子

  • 为了保存为pb文件在安卓上运行而找的代码

最后更新于

这有帮助吗?