文章目录
1.数据的获取
-
一些常用的数据集
-
如何采集数据
2.数据的爬取
-
当然python爬取网页,解析网页的包有很多,包括beautifulsoup、xtree都是可以简单上手的。
-
如果使用云服务器爬取数据,它会给你大量的ip地址,用大量的机器给你做这个事情,它的执行效率还是高的。
3.数据的标注
3.1 半监督学习
是机器学习里面的一个分支,它主要解决的是数据中有一小部分的数据已经标注,但是还有很多没有标注的数据。
半监督学习对于有标注和没标注的数据做了一些假设,对有标注和没有标注的数据做了一些假设:
- 连续性的假设:如果一个样本的特征和另外一个样本相似的话,那么这两个样本可能是有相同的标号的。
- 聚类的假设:数据是按类进行划分的,如果数据在内在有好一点的聚类结构,就是数据不是随机在整个空间里均匀分布的,而是按照一小层一小层分布的。那么可以假设一个类中的中有比较相同的标号,同样的,不同类之间也是可能有相同的标号的。
- 流形假设:虽然收集到的数据可能维度比较高,有很多不同的特征,但是你的数据本质上可能是在一个低维的的流形上分布的,就是数据的内在复杂性可能远比你看到的要低。
3.1.1 自学习算法
3.1.2 人工标注数据
众包:就是从网络上找到一群人,也许不一定是专家类的,但是有一定的能力去标注这个数据,以低成本的形式去标注数据。
众包在方式上是有诸多挑战的:
可以把任务的数据减少:通过主动学习算法
- Uncertainty sampling 算法:通过训练一个模型去选择哪些是置信的还是不置信的,将最难的样本才交给人工去标注
- 也可以使用贵的一点模型,通过多个模型去训练,选出绝大多数模型觉得这个数据样本比较难的
一般主动学习和自学习算法是可以相互融合的
3.1.3 弱监督学习
假如在没有部分已经标注的数据的前提下,又没有足够的资金请求众包,则可以使用弱监督学习。
弱监督学习:就是半自动的生成标号,这个标号比人工标注的要差一些,但是也能生成一个比较好的模型
数据编程:使用启发式的一些方法给数据做一些标号
就是总结出一系列的规律,比如要判断一个评论是垃圾评论或者正常评论,可以通过总结规律得到垃圾评论中的关键词,或者通过一些情绪模型之类的,若是能够得到高的置信度,说明是一条正常评论。这样的规律可以有很多条,那么可以将一条评论输入各个规律的函数中,若返回的大部分是垃圾评论,则为垃圾评论。
4.数据的预处理
刚开始获得是数据可能是脏数据,需要通过一系列的数据清洗操作,可能用道numpy、pandas等数据清洗的库
- 首先得到的数据可能很多列上是NAN,可以如果这个空列的数组占总数据的30%以上,就将这些列删除
- 可能得到的数据的数据类型不明确,pandas没有识别出来,为Object
- 然后通过绘制一些直方图,协方差图,会得到数据的特征之间的一些关系,可以得到数据的一些基本的特征
5. 数据的清理
对于噪音比较多的数据,需要进行数据清理得到稍干净的数据
数据错误的类型:
-
某个样本中某个特性的值,可能不在正常的分布区间里面
-
你的数据违背了一些规则:例如id序列号必须唯一,有的列要求必须是一个数字类型,不能为空、
-
语法或者语义上的限制:例如某个金额要求必须按照美元来算,是美元符号,如果是一个其他币种,就违反了美元金额的语义
一些规则上的检测
总结:数据总是有错误的,就算一些大的常用的数据集也不可避免的存在一些错误
检测错误可以通过上述的Outlier 检测,或者规则检测或者模式检测来修复她们
同时可有多种工具可以帮助数据清理
6. 数据的变换
数据的转换
对每列数据进行Normalization
图片的转换
视频转化
在视频转换方面,同样需要考虑存储的大小,视频的质量以及读取的速度
在机器学习的过程中,通常采用的是十秒以内的是视频
就是假如拿到了一段视频,一般会剪切最感兴趣的一段视频交给机器学习的模型
视频的存储比图片来的大的多,因为一秒钟视频可能有几百帧那个十秒钟的视频就需要存储很多图片
但是可以使用相关视频的压缩算法,但是正是因为使用了压缩算法,可能导致视频的读取是一个问题
因为通常十秒钟的视频,只需要采样出其中关键的帧而不需要完整的全部图片。如果使用压缩算法,虽然视频的存储空间减少了,但是其采样和压缩的代价就会增大。
通常会使用GPU来进行采样,通常在视频存储需要权衡存储大小与解码速度之间的关系,如果需要更小的存储空间,通常就需要更好的硬件或者gpu来处理
文本转换:词根化或者词元化
总结:
- 数据转换需要平衡数据的大小,数据太大的时候存储比较难,而且读取的时候相对比较慢
- Tabular:对于实数的一些数值,可以将其数值变换到合理区间内
- Images:可以将图片切的更小一点
- Videos:可以将视频切成一段一段的,也可以采样一些需要的帧出来
- Text:通过词根化、语法化得到机器学习需要的一些小的单元
7.特征工程
表数据特征
文本信息抽取
图片/视频特征提取
4-7节总结:
产品部署上线之后,仍然可能是一个不断迭代的过程,因为会得到用户的反馈,得到新的用户数据
8.机器学习介绍
机器学习分类
- 监督学习:在有标签的基础上去预测标签
- 半监督学习:数据有标签和没标签,根据有标签的数据训练去预测没标签数据的标签
- 无监督学习:对于所有没标签的数据
- 强化学习:类似人类的一种学习,不断的和环境进行交互,根据反馈去调整自己的行为
监督学习
- 首先关注的是模型本身,这个模型的输入以及对应的输出是什么
- 损失函数Loss:模型的预测值和真实值之间的差别
- 目标函数Objective:就是在模型训练中的尽可能的优化,比如讲模型的损失和最小
- 优化的目标:在模型中没有指定的参数,也就是可以学习的参数,在实际数据中填上值,能够解决目标函数
监督学习模型分类
- 决策树:用一些树来做一些决定
- 线性模型:做决策的时候是根据输入的线性组合决定
- 核方法:就是用核函数来衡量两个样本之间的相似度,可以通过指定核函数,使得它的相似度不相同,达到一个非线性的效果
- 神经网络:用多层的神经网络来学习一个特征表示,在最后接上一个线性方法也能得到一个非常好的表示
总结:
8.1 决策树模型
决策树一般用于分类问题或者回归问题
决策树的好处:
- 可以解释从根节点到叶子节点的每一步步骤是怎么做下来的,机器学习中为数不多的可以解释的模型
- 决策树可以处理一些数值类以及类别类的特征
决策树的坏处:
- 它是不断的对特征进行分类,非常的不稳定;如果数据中产生了一定的噪音,其构建出来的树的形状就不一样了
- 可能导致过拟合
- 决策树是一个顺序化的过程不太好并行
随机森林介绍:通过训练多个决策树来提升稳定性
- 每个树都独立的进行训练,然后训练之后的结果一起结合产生结果 例如如果是分类问题,采用投票形式,超过一半的树是1就投出1;如果是回归的化,在每个数上取平均
- 但是随机森林的代价是训练和预测的成本高了,训练和预测的成本都是原来的n倍,但是其对稳定性确实提高
- 这里的随机来自两种情况,在训练集中随机采样一些样本,而且是替换的采样,每次随机抽取一个样本,再放回去,拿到这个样本后训练一个决策树,一直重复,直到训练n棵树为止;第二在Bagging中随机采样的样本中,再随机采样一些特征,而不用整个特征。这样每棵训练的决策树不管在样本上还是特征上都是随机的
梯度Boosting方法:训练多棵树,这些树之间不再是独立的完成,是顺序的完成,这些树一起合成一个比较大的树
总结:
8.2 线性模型
线性模型做回归
线性模型做分类
Softmax回归
8.3 小批量随机梯度下降
代码演示:
总结
-
线性模型就是将我们的输入通过线性加权和来得到预测,
-
在线性回归中使用平均均方误差来作为我们损失函数,在softmax回归中用的是一个交叉熵来作为损失函数,对每一个类做一个线性预测,使用softmax操作子得到每一个类的预测概率
-
小批量的梯度下降模型既可以解决线性回归也可以解决线性分类
8.4 神经网络
神经网络就是将原来手工进行特征提取的部分换成了神经网络
几种神经网络架构:
-
多层感知机
-
卷积神经网络
-
循环神经网络
-
transformer(变形金刚) 近几年流行
多层感知机MLP
代码实例:
卷积神经网络
池化层/汇聚层
它每次去计算这个k*k的窗口的均值或者最大值,均值叫做平均汇聚,最大值叫做最大汇聚
卷积神经网络总结:
-
它是一个神经网络,用卷积层来抽取空间上的信息,只要此空间的信息满足本地性或者变换不变性。
-
激活层放置在卷积层之后,因为卷积层可以看做是一个特殊的全连接层,本质还是线性变换,如果没有使用激活层,那么它还是一个线性模型
-
卷积层对于位置十分敏感,可以使用池化层来得到一些对于位置没有那么敏感的输出
循环神经网络
最简单的RNN的实现:
总结三种神经网络模型
- 多层感知机:将多个全连接层堆叠起来,通过激活函数得到非线性的新模型
- 卷积神经网络:比较特殊的全连接层,它的卷积层使用到了空间上的本地性和平移不变性的特性做的简化版本的全连接层,它的参数更好更少,更适合处理空间信息
- 循环神经网络:在时序上在全连接层中假如了过去的信息得到了一条额外的边
9.评估指标
分类的常见指标
- 精确度/准确度(accuracy):假设给了很多样本,预测正确的类别样数是多少
- 精度(precision):对于某一个具体的类i,预测正确的是多少个,看在这个样本中将多少个预测成了类i
- 召回率:对于类1,分母是我们样本中本身真实存在的类1的个数,分子是预测是类1并且真实也是类1,和精度的分母一样
AUC和ROC
总结:
- 对于一个模型来说,我们通常回去考虑多个指标, 对于分类问题,可能会用到准确度、精度、召回度之类的问题,也可以使用AUC查看某个模型对正类和负类的区分程度
9.1 过拟合和欠拟合
误差:训练和泛化误差
训练误差:在训练数据上能看到一些错误率
泛化误差:是模型在新的数据上的错误率
过拟合和欠拟合
概念解释:
- 如果训练误差和泛化误差都低,那么说明这个模型的训练效果很好
- 如果训练误差很高但是泛化误差很低,那么可能是个bug,用了很难的数据集训练,实际的数据集很简单
- 训练误差很低但是泛化误差很高,这个就叫做过拟合,过多的去关注训练数据,而不是真正的去理解后面发生了什么
- 如果训练误差和泛化误差都很高,这个就叫做欠拟合,说明这个模型根本就没有抓住这个信息。
为了防止过拟合或者欠拟合的现象,模型和复杂度和数据的复杂度需要对等。
如果数据比较简单,那么就应该选取比较简单的模型,这样可以得到一个比较正常的现象;如果使用简单的数据,但是使用的是复杂的模型,很容易产生过拟合现象。
如果数据比较复杂,但是模型比较简单的话,模型就无法去拟合数据,产生欠拟合现象。
如果数据比较复杂,同时模型比较复杂的话,才会得到相对正常的现象。
模型的复杂度
-
模型的复杂度是可以去拟合各种各样函数的能力
-
低复杂度的模型很难去拟合数据,所谓的数据也是用某个函数生成出来的
-
高复杂度的模型可以去拟合更多的函数
-
比较两个不同的算法之间的复杂度,但是如果是同一种模型,可以进行相对比较,可学习参数多的模型通常比可学习参数少的模型复杂一些;同时这些可学习的参数的取值范围越大,模型越复杂,有值的限制的模型相对来说比较简单一些
数据的复杂度
-
有多少样本?样本里有多少元素?数据中有没有特殊的时间和空间的结构,有特殊结果的数据的复杂度高?多样性,样本个数的多个,多样?
-
当然也很难比较两个不同的数据之间的复杂性
模型复杂度VS数据复杂度
模型的选择
- 需要选择与你的数据复杂度相匹配的模型,用于降低你的泛化误差
9.2 模型的验证
数据集的挑选
一种验证集的划分方式:
10 方差和偏差
如何减小泛化误差
-
减少偏差
偏差不够说明模型不够复杂,假如是神经网络可以将隐藏单元的大小增加
-
减少方差
方差太大了说明模型特别复杂,那么需要一个比较简单的模型,或者限制模型参数能学习的值的范围
-
减少噪音
可以通过在数据采集时更精确更干净的数据来将其值降低
10.1 Bagging
概念:在做bagging的时候训练n个模型,每个模型是独立并行训练的,如果是一个回归模型,那么会将着n个模型得到的答案做平均,如果是做分类问题,每个模型都得到一个分类,得到分类的形式最多的就是结果
每一个训练集通过bootstrap采样后在上面得到的。
bagging采样n次取均值,下降的就是方差
bagging在学习模型不那么稳定的时候,将n个模型放在一起,它下降方差的效果比较好
10.2 Boosting
-
将多个弱一点的偏差比较大的模型组合起来变成一个比较强的模型,主要目的是去降低偏差。* *
-
按顺序的学习n个模型
训练一个简单的模型,看它的误差,然后将数据重新变换,采样,使得下一个模型hi+1会更加关注预测不正确的那些样本
10.3 Stacking
通过多个不同的learner组合降低方差
与bagging的区别:bagging是不同的数据训练相同的模型,stacking是用相同的数据训练不同的模型
stacking也可以通过另外的方式来降低偏差:多层的stacking
如何防止多层的Stacking的过拟合问题?
- 将训练集分成A和B,在第一层模型在A上训练好,用第一层的模型对B做预测,把预测的结果加上b本身,用来做第二层的训练
- k-fold 将训练集分成k份,每次在k-1份上训练,在k上做验证,训练k个模型 对于第i个模型,都在前面的i-1数据上做验证,然后在第i个数据上预测,得到预测数据。将所有的预测数据整合进入下一层,那么第二层的训练数据就是完整的训练数据了
- 对于n个训练模型,在每一层的模型是将第一步将前面的步骤重复n次,将得到的模型的预测值在做平均,进一步降低了方差,再放到下一层里