Support Vector Machine,希望求得每没类元素最近的距离最远,
感知机利用误分类最小的策略,求得分离超平面,不过这时的解有无穷多个。线性可分支持向量机利用间隔最大化求解最优分离超平面。
一个点距离分离平面的远近可以表示分类预测的确信程度,在超平面wx+b=0确定的情况下,|wx+b|能够相对的表示点x距离超平面的远近,而wx+b的符号与标记y的符号是否一致能够表示分类是否正确。
函数间隔就是y(wx+b),但是随着w的改变,可能平面不变,但是函数间隔会变,因此几何间隔提取出了真正的距离,除以一个权重的值。
逻辑回归是一种分类的方法,主要用于二分类,从训练数据特征学习出一个0/1分类模型,以一个线性组合作为自变量,使用逻辑函数将自变量映射到(0,1)上,LR分类器实际上就是求解一组权值,带入逻辑函数中,得到一个类别为1和类别为0的概率。
可以用梯度下降求解
调整正、负样本在求cost时的权重,比如按比例加大正样本cost的权重。然而deep learning的训练过程是on-line的因此你需要按照batch中正、负样本的比例调整。
做训练样本选取:如hard negative mining,只用负样本中的一部分。
做训练样本选取:如通过data augmentation扩大正样本数量。
两个都是线性分类器
1、LR和SVM都可以处理分类问题,且一般都用于处理线性二分类问题(在改进的情况下可以处理多分类问题)
2、两个方法都可以增加不同的正则化项,如l1、l2等等。所以在很多实验中,两种算法的结果是很接近的。
1、LR是参数模型,SVM是非参数模型。
2、从目标函数来看,区别在于逻辑回归采用的是logistical loss,SVM采用的是hinge loss,这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。
3、SVM的处理方法是只考虑support vectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重。
4、逻辑回归相对来说模型更简单,好理解,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算。
5、logic 能做的 svm能做,但可能在准确率上有问题,svm能做的logic有的做不了。
优点:
缺点:
SVM多分类的问题:
时间A和B同时发生的概率为A发生的情况下发生B或者B发生的情况下发生A,对于给出的待分类项,求解在此项目条件下各个目标类别出现的概率,哪个最大就认为此待分类项属于哪个类别。
假如现在有样本x=(a1,a2,a3…,an),有分类目标Y={y1,y2,…,yn}
那么max(P(y1|x),P(y2|x)…)就是分类结果
P(yi|x)=P(x|yi)*P(yi)/P(x),而样本可以看成由特征组成,因此可以把x换成对特征求相同值以后的求和
相当于从样本中统计出来
P(ai|yi)代表该类别下该特征出现的概率
P(yi)代表全部类别中,该类别出现的概率
优点:对小规模数据表现好,适合多分类任务,适合增量训练
缺点:对于输入的数据很敏感
逻辑回归是一个线性的二分类问题,主要是计算在某个样本特征下事件发生的概率
线性函数+sigmoid函数求得,这个线性和函数权重的特征值的累加以及加上偏置求出来的,所以训练其实就是在训练这个权重。
所以求解问题就变成了这个最大似然函数的最优化问题,这里通常会采样随机梯度下降法和拟牛顿迭代法来进行优化
如果类别之间是否互斥(比如音乐只能属于古典音乐、乡村音乐、摇滚月的一种)就用softmax 否则类别之前有联系(比如一首歌曲可能有影视原声,也可能包含人声,或者是舞曲),这个时候使用k个LR更为合适
优缺点:
Logistic回归优点:
缺点:
三要素:
k值的选择
所以一般k会取一个较小的值,然后用过交叉验证来确定
这里所谓的交叉验证就是将样本划分一部分出来为预测样本,比如95%训练,5%预测,然后k分别取1,2,3,4,5之类的,进行预测,计算最后的分类误差,选择误差最小的k
KNN算法的优点:
缺点:
KNN中的K值选取对K近邻算法的结果会产生重大影响。如李航博士的一书「统计学习方法」上所说:
在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是一部分样本做训练集,一部分做测试集)来选择最优的K值。
KD树是一个二叉树,表示对K维空间的一个划分,可以进行快速检索(那KNN计算的时候不需要对全样本进行距离的计算了)
KD树更加适用于实例数量远大于空间维度的KNN搜索
构建过程:根据样本的每一个特征的中位数作为且分点,将举行区域划分成两个区域,再对下一个特征两两划分,不断重复2的操作,直到两个子区域没有实例的时候停止。
ID3:计算信息增益,选择信息增益最大的特征作为当前节点的决策特征,信息增益表示分类目标的熵减去当前属性的熵,增益越大,分类能力越强
C4.5:使用信息增益率来进行属性的选择,准确率高,但是子构造树的过程中需要进行多次的扫描和排序,所以它的运算效率较低
cart:根据当前特征计算他们的基尼增益,选择基尼增益最小的特征作为划分特征,总体的类别越杂乱,GINI指数越大
好的决策树
解决过拟合
优点:
缺点:
随机森林是有很多随机得决策树构成,它们之间没有关联。得到RF以后,在预测时分别对每一个决策树进行判断,最后使用Bagging的思想进行结果的输出(也就是投票的思想)
使用oob(out-of-bag)进行泛化误差的估计,将各个树的未采样样本作为预测样本(大约有36.8%),使用已经建立好的森林对各个预测样本进行预测,预测完之后最后统计误分得个数占总预测样本的比率作为RF的oob误分率。
GBDT的精髓在于训练的时候都是以上一颗树的残差为目标,这个残差就是上一个树的预测值与真实值的差值。
Boosting的好处就是每一步的参加就是变相了增加了分错instance的权重,而对已经对的instance趋向于0,这样后面的树就可以更加关注错分的instance的训练了
Shrinkage认为,每次走一小步逐步逼近的结果要比每次迈一大步逼近结果更加容易避免过拟合。
优点:
精度高
能处理非线性数据
能处理多特征类型
适合低维稠密数据
缺点:
并行麻烦(因为上下两颗树有联系)
多分类的时候 复杂度很大
最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。
使误差「所谓误差,当然是观察值与实际真实值的差量」平方和达到最小以寻求估计值的方法,就叫做最小二乘法,用最小二乘法得到的估计,叫做最小二乘估计。当然,取平方和作为目标函数只是众多可取的方法之一。
是一种数学的优化技术,通过求最小化平方误差来寻找最佳的函数匹配 假设现在有二维的观测数据(x1,y1),(x2,y2)…(xn,yn)(x1,y1),(x2,y2)…(xn,yn),求y=a+bxy=a+bx的拟合。
训练串行,运行并行
区别:
(1)取样方式
(2)预测时,RF多数投票,GBDT加权累加
(3)样本的关系—>并行和串行
(4)学期器的种类,GBDT只能用CART回归树 (因为要计算连续梯度)
(5)对异常值的敏感性
(6)通过减少方差/偏差提高性能
EM用隐含变量的概率模型的极大似然估计,一般分为两步:第一步求期望,第二步求极大
如果概率模型的变量都是观测变量,那么给定数据之后就可以直接使用极大似然法或者贝叶斯估计模型参数。
但是当模型含有隐含变量的时候就不能简单的用这些方法来估计,EM就是一种含有隐含变量的概率模型参数的极大似然估计法。
应用到的地方:混合高斯模型、混合朴素贝叶斯模型、因子分析模型
boosting在训练的时候会给样本加一个权重,然后使loss function尽量去考虑那些分错类的样本(比如给分错类的样本的权重值加大)
在机器学习中往往是最终要求解某个函数的最优值,但是一般情况下,任意一个函数的最优值求解比较困难,但是对于凸函数来说就可以有效的求解出全局最优值。
一个集合C是,当前仅当任意x,y属于C且0≤Θ≤10≤Θ≤1,都有Θ∗x+(1−Θ)∗yΘ∗x+(1−Θ)∗y属于C
用通俗的话来说C集合线段上的任意两点也在C集合中
一个函数f其定义域(D(f))是凸集,并且对任意x,y属于D(f)和0≤Θ≤10≤Θ≤1都有
f(Θ∗x+(1−Θ)∗y)≤Θ∗f(x)+(1−Θ)∗f(y)f(Θ∗x+(1−Θ)∗y)≤Θ∗f(x)+(1−Θ)∗f(y)
常见的凸函数有:
凸函数的判定:
凸优化应用举例
daBoost的优缺点 优点:(1)容易理解、实现简单 (2)易编码 (3)分类精度高 (4)可以使用各种回归模型构建基分类器,非常灵活 (5)作为二元分类器是,构造简单、结果可理解、少参数 (6)相对来说,不宜过拟合
缺点:(1)只能串行 (2)对异常值敏感 boosting对异常值敏感
定量输出称为回归,或者说是连续变量预测;
定性输出称为分类,或者说是离散变量预测。
判别方法:由数据直接学习决策函数 Y = f(X),或者由条件分布概率 P(Y|X)作为预测模型,即判别模型。
生成方法:由数据学习联合概率密度分布函数 P(X,Y),然后求出条件概率分布P(Y|X)作为预测的模型,即生成模型。
由生成模型可以得到判别模型,但由判别模型得不到生成模型。
常见的判别模型有:K近邻、SVM、决策树、感知机、线性判别分析(LDA)、线性回归、传统的神经网络、逻辑斯蒂回归、boosting、条件随机场
常见的生成模型有:朴素贝叶斯、隐马尔可夫模型、高斯混合模型、文档主题生成模型(LDA)、限制玻尔兹曼机
有监督机器学习方法可以分为生成方法和判别方法(常见的生成方法有混合高斯模型、朴素贝叶斯法和隐形马尔科夫模型等,常见的判别方法有SVM、LR等),生成方法学习出的是生成模型,判别方法学习出的是判别模型。
监督学习,预测时,一般都是在求p(Y|X)生成模型: 从数据中学习联合概率分布p(X,Y),然后利用贝叶斯公式求:
判别模型:直接学习P(Y|X), 它直观输入什么特征X,就直接预测出最可能的Y; 典型的模型包括:LR, SVM,CRF,Boosting,Decision tree…
生成方法的特点:生成方法可以还原联合概率分布,而判别方法则不能;生成方法的学习收敛速度更快,即当样本容量增加的时候,学习的模型可以更快的收敛于真实的模型;当存在隐变量时,仍可以用生成方法学习,此时判别方法就不能用。
判别方法的特点:判别方法直接学习的是条件概率或者决策函数,直接面对预测,往往学习的准确率更高;由于直接学习或者,可以对数据进行各种程度上的抽象、定义特征并使用特征,因此可以简化学习问题。
精确率(Precision)为TP/(TP+FP)
召回率(Recall)为TP/(TP+FN)
F1值是精确率和召回率的调和均值,即F1=2PR/(P+R)
所以AUC表征的是模型的分类能力。
解决方法
交叉验证法
减少特征
正则化
权值衰减
验证数据
L2正则化:目标函数中增加所有权重w参数的平方之和, 逼迫所有w尽可能趋向零但不为零. 因为过拟合的时候, 拟合函数需要顾忌每一个点, 最终形成的拟合函数波动很大, 在某些很小的区间里, 函数值的变化很剧烈, 也就是某些w非常大. 为此, L2正则化的加入就惩罚了权重变大的趋势.
L1正则化:目标函数中增加所有权重w参数的绝对值之和, 逼迫更多w为零(也就是变稀疏. L2因为其导数也趋0, 奔向零的速度不如L1给力了). 大家对稀疏规则化趋之若鹜的一个关键原因在于它能实现特征的自动选择。一般来说,xi的大部分元素(也就是特征)都是和最终的输出yi没有关系或者不提供任何信息的,在最小化目标函数的时候考虑xi这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的特征权重反而会被考虑,从而干扰了对正确yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些无用的特征,也就是把这些特征对应的权重置为0。
在训练的运行的时候,让神经元以超参数p的概率被激活(也就是1-p的概率被设置为0), 每个w因此随机参与, 使得任意w都不是不可或缺的, 效果类似于数量巨大的模型集成。
这个方法给每层的输出都做一次归一化(网络上相当于加了一个线性变换层), 使得下一层的输入接近高斯分布. 这个方法相当于下一层的w训练时避免了其输入以偏概全, 因而泛化效果非常好.
理论上可能的局部极小值数量随参数的数量呈指数增长, 到达某个精确的最小值是不良泛化的一个来源. 实践表明, 追求细粒度极小值具有较高的泛化误差。这是直观的,因为我们通常会希望我们的误差函数是平滑的, 精确的最小值处所见相应误差曲面具有高度不规则性, 而我们的泛化要求减少精确度去获得平滑最小值, 所以很多训练方法都提出了提前终止策略. 典型的方法是根据交叉叉验证提前终止: 若每次训练前, 将训练数据划分为若干份, 取一份为测试集, 其他为训练集, 每次训练完立即拿此次选中的测试集自测. 因为每份都有一次机会当测试集, 所以此方法称之为交叉验证. 交叉验证的错误率最小时可以认为泛化性能最好, 这时候训练错误率虽然还在继续下降, 但也得终止继续训练了.
常见的线性分类器有:LR,贝叶斯分类,单层感知机、线性回归
常见的非线性分类器:决策树、RF、GBDT、多层感知机
SVM两种都有(看线性核还是高斯核)
线性分类器速度快、编程方便,但是可能拟合效果不会很好
非线性分类器编程复杂,但是效果拟合能力强
特征比数据量还大时,选择什么样的分类器?
线性分类器,因为维度高的时候,数据一般在维度空间里面会比较稀疏,很有可能线性可分
对于维度很高的特征,你是选择线性还是非线性分类器?
理由同上
对于维度极低的特征,你是选择线性还是非线性分类器?
非线性分类器,因为低维空间可能很多特征都跑到一起了,导致线性不可分
主要三个方面,数据,模型和评估方法。
数据上重采样和欠采样,使之均衡;
模型上选对样本不均衡问题不敏感的模型,和算法集成技术,如决策树,不能用KNN;
评估方法,用查全率,查准率之类
与浅层学习的区别
深度学习实质:多隐层+海量数据——>学习有用特征—–>提高分类或预测准确性 区别:(1)DL强调模型深度 (2)DL突出特征学习的重要性:特征变换+非人工
卷积层:特征提取 子采样层/池化层:缩减输入数据的规模
(1)sigmoid:易饱和(梯度消失),非0均值
(2)tanh,改进了sigmoid的第二个缺点,即它是0均值的
(3)ReLU,收敛快(不容易饱和),求梯度简单(没有指数计算,只需要阈值就可以),有稀疏特性。缺点是神经元容易坏死。
由于ReLU在x<0时梯度为0,这样就导致负的梯度在这个ReLU被置零,而且这个神经元有可能再也不会被任何数据激活。如果这个情况发生了,那么这个神经元之后的梯度就永远是0了,也就是ReLU神经元坏死了,不再对任何数据有所响应。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都坏死了
leaky-relu
不是0
Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
Embedded:集成方法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。
朴素 贝叶斯垃圾邮件分类器是在对邮件关键字进行统计分析到基础上利用贝叶斯公式进行分类到方法。相比其他模型,朴素贝叶斯模型到搭建比较简单,并且具有良好到分类效果。
朴素真贝叶斯分类器通过对邮件关键字进行统计,然后使用贝叶斯推理来计算一封电子邮件是或不是垃圾邮件的概率。
1.特征量的选择
对于文本信息而言,文本中的关键字更能代表文本到内容,因此在此分类器中我们对邮件内容进行分词处理,选取邮件中出现频率最高的10个词作为这封邮件到特征量。
2.样本分类
对于垃圾邮件分类器而言样本到分类比较简单,垃圾邮件类和非垃圾邮件类。
3.训练
词分类器中到样本数据来源于
SpamAssassin公共语料库。对语料库中的垃圾邮件和非垃圾邮件做分词然后统计对应到词频,对相关数据进行统计计算关键字后验概率形成分类器。
实现细节
1)分词
英文分词主要以空格作为分词到手段从中提取关键字,但是此方法对中文并不适用。因为中文词之间没有明确到分隔,并且中文的词大部分都是有多字词构成这就无法从字的角度进行分词。
此处的分词我们选择了“庖丁解牛”这个中文分词工具对邮件文本进行分词。分词之前先做了一些预处理,去掉了文本中的非中文字符。
2)训练中数据的平滑处理
在非类器训练过程中可能会遇到待评估邮件中包含到关键字在非类器中不存在到情况,为了防止零概率情况到发生我们把不存在到关键字的词频设为0.5。然后再放入分类器中进行相关计算。
3)假设条件
假设特征变量之间相互。
假设邮件为垃圾或者非垃圾邮件到概率各为50%。
在微积分中,对多元函数的参数求偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。几何意义上来说,梯度就是函数变化增加最快的地方。沿着梯度相反的方向,就是梯度减少最快的地方,最容易找到最小值。
在最小化损失函数时,可以通过梯度下降法来一步步迭代求解,得到最小化的损失函数,和模型参数值。
步长:步长决定了在梯度下降迭代的过程中,每一步沿着梯度负方向前进的长度。用上面下山的例子,步长就是在当前这一步所在位置沿着最陡峭最容易下山的位置走得那一步的长度
特征:样本中输入部分
假设函数:监督学习中,为了拟合输入样本,而使用的假设函数
损失函数:为了评估模型拟合的好坏,通常用损失函数来度量拟合的成都。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。
算法过程:
算法调优:
批梯度下降:更新参数使用所有样本进行更新
随机梯度下降:求梯度时没有用所有的m个样本的数据,而仅仅选取一个样本来求梯度。
小批量梯度下降:对于m各样本,采用x个样子来迭代。
和最小二乘法比较:
不同:梯度下降是迭代求解,最小二乘法是解析求解
缺点:需要选择步长,如果样本少的时候,最小二成计算速度块
优点:样本量很大的时候,最小二乘需要去一个超级大的逆矩阵,这时候求解很慢,使用迭代的梯度下降法比较有优势
梯度下降法和牛顿法/拟牛顿法相比,两者都是迭代求解,不过梯度下降法是梯度求解,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。相对而言,使用牛顿法/拟牛顿法收敛更快。但是每次迭代的时间比梯度下降法长。
牛顿-拉弗森方法:
切线是曲线的线性逼近。
随便找一个曲线上的点做切线,找到与x周的交点做垂线,然后继续做切线,重复刚才的过程
如果f二阶可导,那么待求的零点x周围存在一个区域,只要起始点位于这个邻近域内,那么牛顿-拉弗森方法必定收敛
但是因为我们不知道根点在哪里,所以起始点的选择就不一定在这个区域内。
应用牛顿-拉弗森方法,要注意以下问题:
L2正则化:目标函数中增加所有权重w参数的平方之和, 逼迫所有w尽可能趋向零但不为零. 因为过拟合的时候, 拟合函数需要顾忌每一个点, 最终形成的拟合函数波动很大, 在某些很小的区间里, 函数值的变化很剧烈, 也就是某些w非常大. 为此, L2正则化的加入就惩罚了权重变大的趋势.
L1正则化:目标函数中增加所有权重w参数的绝对值之和, 逼迫更多w为零(也就是变稀疏. L2因为其导数也趋0, 奔向零的速度不如L1给力了). 大家对稀疏规则化趋之若鹜的一个关键原因在于它能实现特征的自动选择。一般来说,xi的大部分元素(也就是特征)都是和最终的输出yi没有关系或者不提供任何信息的,在最小化目标函数的时候考虑xi这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的特征权重反而会被考虑,从而干扰了对正确yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些无用的特征,也就是把这些特征对应的权重置为0。
L1是拉普拉斯分布,L2是高斯分布。
高斯核,这个核就是最开始提到过的会将原始空间映射为无穷维空间的那个家伙。不过,如果选得很大的话,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似一下)相当于一个低维的子空间;反过来,如果选得很小,则可以将任意的数据映射为线性可分——当然,这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题。不过,总的来说,通过调控参数,高斯核实际上具有相当高的灵活性,也是使用最广泛的核函数之一。下图所示的例子便是把低维线性不可分的数据通过高斯核函数映射到了高维空间:
线性核,这实际上就是原始空间中的内积。这个核存在的主要目的是使得“映射后空间中的问题”和“映射前空间中的问题”两者在形式上统一起来了(意思是说,咱们有的时候,写代码,或写公式的时候,只要写个模板或通用表达式,然后再代入不同的核,便可以了,于此,便在形式上统一了起来,不用再分别写一个线性的,和一个非线性的)。
逻辑回归的模型本质上是一个线性回归模型,逻辑回归都是以线性回归为理论支持的。但线性回归模型无法做到sigmoid的非线性形式,sigmoid可以轻松处理0/1分类问题。
学习器间不存在强依赖关系, 学习器可并行训练生成, 集成方式一般为投票;
Random Forest属于Bagging的代表, 放回抽样, 每个学习器随机选择部分特征去优化;
学习器之间存在强依赖关系、必须串行生成, 集成方式为加权和;
Adaboost属于Boosting, 采用指数损失函数替代原本分类任务的0/1损失函数;
GBDT属于Boosting的优秀代表, 对函数残差近似值进行梯度下降, 用CART回归树做学习器, 集成为回归模型;
xgboost属于Boosting的集大成者, 对函数残差近似值进行梯度下降, 迭代时利用了二阶梯度信息, 集成模型可分类也可回归. 由于它可在特征粒度上并行计算, 结构风险和工程实现都做了很多优化, 泛化, 性能和扩展性都比GBDT要好。
有时候因为样本的产生和隐含变量有关(隐含变量是不能观察的),而求模型的参数时一般采用最大似然估计,由于含有了隐含变量,所以对似然函数参数求导是求不出来的,这时可以采用EM算法来求模型的参数的(对应模型参数个数可能有多个),EM算法一般分为2步:
E步:选取一组参数,求出在该参数下隐含变量的条件概率值;
M步:结合E步求出的隐含变量条件概率,求出似然函数下界函数(本质上是某个期望函数)的最大值。
重复上面2步直至收敛。
1)归一化后加快了梯度下降求最优解的速度;2)归一化有可能提高精度。
这种归一化方法比较适用在数值比较集中的情况。这种方法有个缺陷,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。实际使用中可以用经验常量值来替代max和min。
经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:
其中μ为所有样本数据的均值,σ为所有样本数据的标准差。
经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V, 2)还是log(V, 10)等。
1 抽象成数学问题
明确问题是进行机器学习的第一步。机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。 这里的抽象成数学问题,指的我们明确我们可以获得什么样的数据,目标是一个分类还是回归或者是聚类的问题,如果都不是的话,如果划归为其中的某类问题。
2 获取数据
数据决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。 数据要有代表性,否则必然会过拟合。 而且对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。 而且还要对数据的量级有一个评估,多少个样本,多少个特征,可以估算出其对内存的消耗程度,判断训练过程中内存是否能够放得下。如果放不下就得考虑改进算法或者使用一些降维的技巧了。如果数据量实在太大,那就要考虑分布式了。
3 特征预处理与特征选择
良好的数据要能够提取出良好的特征才能真正发挥效力。 特征预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。 筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法。
4 训练模型与调优
直到这一步才用到我们上面说的算法进行训练。现在很多算法都能够封装成黑盒供人使用。但是真正考验水平的是调整这些算法的(超)参数,使得结果变得更加优良。这需要我们对算法的原理有深入的理解。理解越深入,就越能发现问题的症结,提出良好的调优方案。
5 模型诊断
如何确定模型调优的方向与思路呢?这就需要对模型进行诊断的技术。 过拟合、欠拟合 判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘制学习曲线等。过拟合的基本调优思路是增加数据量,降低模型复杂度。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度。 误差分析 也是机器学习至关重要的步骤。通过观察误差样本,全面分析误差产生误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题…… 诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断,这是一个反复迭代不断逼近的过程,需要不断地尝试, 进而达到最优状态。
6 模型融合 一般来说,模型融合后都能使得效果有一定提升。而且效果很好。 工程上,主要提升算法准确度的方法是分别在模型的前端(特征清洗和预处理,不同的采样模式)与后端(模型融合)上下功夫。因为他们比较标准可复制,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。
7 上线运行 这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。 不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。 这些工作流程主要是工程实践上总结出的一些经验。并不是每个项目都包含完整的一个流程。这里的部分只是一个指导性的说明,只有大家自己多实践,多积累项目经验,才会有自己更深刻的认识。 故,基于此,七月在线每一期ML算法班都特此增加特征工程、模型调优等相关课。比如,这里有个公开课视频《特征处理与特征选择》。
关键字值不同的元素可能会映象到哈希表的同一地址上就会发生哈希冲突。解决办法:
1)开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的 地址则表明表中无待查的关键字,即查找失败。
2) 再哈希法:同时构造多个不同的哈希函数。
3)链地址法:将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
4)建立公共溢出区:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。
一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。所以说,信息熵可以被认为是系统有序化程度的一个度量。
对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。
3.1 卷积层
卷积层是一种线性的、平移不变性的运算。
卷积的kernel本质
池化,简言之,即取区域平均或最大
上图所展示的是取区域最大,即上图左边部分中 左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,所以得到上图右边部分的结果:6 8 3 4。
池化
扔掉周边长得差不多那些像素
本质:降采样,提升统计效率,局部特征不变性降维
在pooling的终结点, 我们得到的是一个降低维度了的图像,这个图像的含义是告诉你在原有的图像的每个区域里是含有1还是不含有1, 又叫做特征图。
缺点:
答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制
一、对象的引用计数机制 Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。
引用计数增加的情况:
1,一个对象分配一个新名称
2,将其放入一个容器中(如列表、元组或字典)
引用计数减少的情况:
1,使用del语句对对象别名显示的销毁
2,引用超出作用域或被重新赋值 sys.getrefcount( )函数可以获得对象的当前引用计数 多数情况下,引用计数比你猜测得要大得多。
对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。
二、垃圾回收
1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。
2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。
三、内存池机制
Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。
3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
( 1) 虽然在投递的时候有看到职位描述但很抽象,您能否具体描述一下,如果这个岗位具体需要是完成什么工作的,具体分工大概是怎样的?比如您可以说说您平时的工作大致是什么呢?
(2) 刚才问的那个技术问题某个细节我还不太明白,能解释下吗?
(3) 您可以对我刚刚的表现做一个评价,指出我有哪些不足吗?
(4) 如果我有机会被录用,接下来半年有哪些优先度比较高的任务需要我处理?
(5) 如果我很幸运被被录用,我能不能提前来实习?如果不能来,接下来的一年在学校,我学习什么可以对我今后的工作有帮助?