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