什么是机器学习?为什么我们需要机器学习?
它使计算机能够在没有明确编程规则的情况下从经验中学习和改进。在传统程序中,规则被编码用于程序以做出决策,但是在机器学习中,程序基于数据来学习以做出决策。
传统解决方案需要长而复杂的规则并且需要经常进行手动调整的问题。此类问题的示例是垃圾邮件过滤器。你注意到一些词语,如4U,促销,信用卡,免费,惊人的等等,并发现该电子邮件是垃圾邮件。此列表可能非常长,并且一旦垃圾邮件发送者注意到你开始忽略这些单词,就可以更改此列表。用传统的编程方法来解决这个问题变得很困难。机器学习算法学会很好地检测垃圾邮件并且工作得更好。
机器学习非常利于:
- 不存在已知算法解决方案的复杂问题;
- 需要大量手动调整或是规则列表超长的问题,创建可以适应环境波动的系统;
- 以及帮助人类学习(比如数据挖掘)。深入了解复杂的大量数据。例如,你的企业从客户处收集大量数据。机器学习算法可以找到对这些数据的见解。
机器学习三要素?
数据、算法、模型
有监督和无监督学习有什么区别?
监督和非监督学习算法基于训练时所需的监督进行分类。 监督学习算法对标记的数据(被标记的训练集是指包含每个实例所期望的解决方案的训练集)起作用,即数据具有所需的解决方案或标签。无监督学习算法对未标记数据起作用,这意味着数据不包含算法学习所需的解决方案。
监督算法示例:
- 线性回归
- 神经网络/深度学习
- 决策树
- 支持向量机(SVM)
- K-最近邻居
其中最受欢迎和简单的监督学习算法是线性回归。假设我们需要根据一些历史数据预测一个县居民的收入。 线性回归可用于此问题。线性回归模型是输入特征的线性函数,其中权重定义模型,偏差项如下所示。
在该等式中,y_hat是预测结果,x_i是输入,并且theta_i是模型参数或权重。 theta_0是偏差。通过评估均方根误差(RMSE)来测量该模型的性能。MSE如下:
决策树是非线性模型,用来解决回归与分类问题。值得强调是:决策树对数据集旋转很敏感,决策树的决策边界都是正交直线(所有的切分都和某一个坐标轴垂直),这使得它们对数据集的旋转很敏感,采用PCA预处理。
无监督算法示例:
- 聚类算法 - K均值,层次聚类分析(HCA)
- 可视化和降维 - 主成分降低(PCA)
- 关联规则学习
过拟合和欠拟合:
过拟合是算法无法推广到新示例,但是该算法对于训练集合数据非常有效。
欠拟合指的是当模型没有捕获数据的基本趋势(训练数据和测试数据),欠拟合的模型是在训练和测试数据中都表现不佳的模型。一般来说,补救措施是选择更好(更复杂)的机器学习算法。
如何检测过度拟合和欠拟合?:观察模型在训练集和测试集上的表现。
有一位同事声称他已经建立了分类器99.99%的准确率? 你会相信他吗? (关键是不仅要看准确度,还要看召回率)
一般而言,99.99%的准确度非常高,应该被怀疑。。 例如:在一组手写字符中,其中有0到9的数字,如果建立一个模型来检测数字是否为5,一个总是将数字识别为8的错误模型也会给出90%的准确率。
只有当召回率和精度都很高时,分类器才能得到较高的F1 分数:
一般我们可以绘制召回率和精度的曲线,或者ROC曲线(虚警率-负样本中的错判率;和检测率(就是召回率)-正样本中的正确判断率)
避免欠拟合(刻画不够)
- 寻找更好,更多的特征-----具有代表性的
- 用更多的特征-----增大输入向量的维度
- 用更复杂的模型,减小正则化
避免过拟合(刻画太细,泛化太差)
- 使用更多的数据,减小噪声点比重减少
- 减少数据特征
- 正则化方法-----即在对模型的目标函数(objective function)或代价函数(cost function)加上正则项
- dropout和早期停止法
不平衡数据下的分类问题
当一个分类任务的数据集中来自不同类别的样本数目相差悬殊时,我们通常称该数据集为“类别不平衡”的,当某类数据少到难以观察结构的时候,我们可以考虑抛弃该类数据,转而学习更为明显的多数类模式,而后将不符合多数类模式的样本判断为异常/少数类,某些时候会有更好的效果。此时该问题退化为异常检测(anomaly detection)问题。
对于一般的机器学习方法,最常见的评价指标无疑是分类准确度,然而对于不平衡的分类任务,ACC并不能很好地反映分类器的性能。一般采用混淆矩阵,准确率与召回率。
已有的不平衡学习方法:
标准机器学习算法假设属于不同类别的样本数量大致相似。因此类别的不均匀分布给在不平衡数据集上应用标准学习算法带来了困难:这些学习算法的设计背后隐含的优化目标是数据集上的分类准确度,而这会导致学习算法在不平衡数据上更偏向于含更多样本的多数类。多数不平衡学习(imbalance learning)算法都是为了解决这种“对多数类的偏好”而提出。已有的不平衡学习算法划分为3类:数据级方法,算法级方法以及集成方法。
- 欠采样:一般是用来平衡数据集、去噪。平衡数据集的有随机欠采样/NearMiss,采样和训练速度都很快。随机欠采样在任何情况下都能用,但在数据集不平衡程度较高时会不可避免地丢弃大部分多数类样本造成信息损失。NearMiss对噪声极端敏感,有噪声基本就废掉。去噪方法有很多,如Tomeklink,AllKNN等,需要数据集上有良好定义的距离度量,在大规模数据集上计算量大。去噪之后对有的分类器有效,有的无效。
- 过采样:随机过采样任何情况下都不要用,及其容易造成过拟合。SMOTE、ADASYN在小规模数据上可以一试。当数据规模大且不平衡程度高时,过采样方法生成巨量的合成样本,需要很多额外计算资源。同时此类过采样基于少数类样本的结构信息,在少数类的表示质量很差时甚至会反向优化:过采样效果还不如直接训练。
- 混合采样:理论上加入了去噪类的欠采样算法来清洁过采样之后的数据集。实际使用起来我没感觉到有什么不同,唯一的区别是加了去噪方法之后更慢了。
- Cost-sensitive:在数据集不平衡程度不高时可用,训练分类器的效率跟使用原始数据训练没有什么区别。缺点是一般需要自己来设置cost matrix(多了个参数要调)
- 集成:随机降采样+集成,在不平衡比较高时需要较多的基学习器来达到较好的效果。注意Boosting容易被噪声影响,Bagging方法是真正的万金油,增加基学习器数量效果一般不会下降。高级降采样+集成,也可以尝试,运行会慢并且效果不能保证比随机方法好。
from:https://mp.weixin.qq.com/s/K1yyrTwqnN05F4F9_XrnCA
线性回归
公式推导:
初始化θ,设置学习率,迭代计算。
批量梯度下降:可以达到最优解;随机梯度下降:不是最优的,但可以跳出局部最优。特征缩放对梯度下降有帮助
岭回归:加入L2范数
α越大,那么所有的权重都将非常接近于零,正则程度越强,结果是一条穿过数据平均值的水平线。在执行岭回归之前,必须对数据进行缩放(例如使用StandardScaler),因为它对输入特征的大小非常敏感。大多数正则化模型都是如此。
对于梯度下降,只需要在MSE梯度向量上添加αw即可。
套索回归:加入L1范数
当=0,Lasso成本函数是不可微的,此时使用次梯度向量g作为替代,依旧可以让梯度下降正常运转。Lasso回归次梯度向量:
Lasso回归的一个重要特点是它倾向于完全消除掉最不重要特征的权重(也就是将它们设置为零)。例如所有高阶多项式的特征权重都等于零。换句话说,Lasso回归会自动执行特征选择并输出一个稀疏模型(即只有很少的特征有非零权重)。
弹性网络:其正则项就是岭回归和Lasso回归的正则项的混合
早期停止法:对于梯度下降这一类迭代学习的算法,还有一个与众不同的正则化方法,就是在验证误差达到最小值时停止训练,该方法叫作早期停止法。一旦验证误差达到最小值就立刻停止训练。这是一个非常简单而有效的正则化技巧
逻辑回归
属于监督,判别模型。sigmod导数好求计算
LR回归是一个线性的二分类模型,主要是计算在某个样本特征下事件发生的概率,LR的最终值是根据一个线性和函数再通过一个sigmod函数来求得,这个线性和函数权重与特征值的累加以及加上偏置求出来的,所以在训练LR时也就是在训练线性和函数的各个权重值w。关于这个权重值w一般使用最大似然法来估计。
推导,损失函数是交叉熵,加负号。偏导数:
计算出每个实例的预测误差,并将其乘以第j个特征值,然后再对所有训练实例求平均值。一旦你有了包含所有偏导数的梯度向量就可以使用梯度下降算法了。
逻辑回归模型可以用L1 或L2 惩罚函数来正则化。默认添加的是L2 函数。控制LogisticRegression模型正则化程度的超参数不是alpha,而是,其他线性模型使用alpha,alpha的值越大,则具有更强的正则化。
有点:适合需要得到一个分类概率的场景。2)计算代价不高,容易理解实现
缺点:logistic 回归不能解决非线性问题,因为它的决策面是线性的。容易欠拟合,分类精度不高。数据特征有缺失或者特征空间很大时表现效果并不好。
softmax回归
计算出每个类别的梯度向量,然后使用梯度下降(或任意其他优化算法)找到最小化成本函数的参数矩阵Θ
SVM
属于监督,判别模型。既可以分类,也回归(均方误差)SVM对特征缩放敏感,推导,KKT条件,硬边界,软边界(正则项,防止过拟合,通过超参数C来控制这个平衡:C值越小,则街道越宽)
线性SVM分类器成本函数:
成本函数中的第一项会推动模型得到一个较小的权重向量w,从而使间隔更大。第二项则计算全部的间隔违例。
合页损失max(0,1-t),在t=0处可以使用任意次导数(即-1到0之间的任意值),你还是可以使用梯度下降,就跟Lasso回归一样。
几种核函数:核函数事先在低维上进行计算,而将实质上的分类效果表现在了高维上,也就如上文所说的避免了直接在高维空间中的复杂计算。
首先尝试用线性核函数来做分类,其参数少速度快,对于线性可分数据,其分类效果很理想
多项式核:通常只用在已经大概知道一个比较小的阶数的情况
RBF核:特征的数量小,样本的数量正常,则选用高斯核函数;如果样本的特征数非常多,那么就不必使用RBF核将样本映射到高维空间
决策树
对数据旋转敏感。ID3,C4.5 ,CART的分割标准,
信息熵:
随机森林
基于Bagging(用不同数据子集训练多个同类型分类器,采用的是随机有放回采样,投票决策,并行运算,样本权值相同)的集成学习方法,可以用来做分类、回归。随机森林泛化性能一般比较好,减小方差,优点是可以很容易地测量每个特征对预测的相对重要性。
既可以分类也可以回归,分类用基尼指数,所有树投票决定最终分类结果,回归用均方误差,所有树预测值得平均值作为最后的回归值。
boosting
AdaBoost + 决策树 = 提升树
组合许多弱分类器(只比随机选择好一点)来产生一个强大的分类器组。大多数boosting算法都是改变训练数据的权值分布,针对不同的训练数据分布调用弱学习算法学习一系列弱分类器。
GBRT
gbdt通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。然而,它并不像 Adaboost 那样每一次迭代都更改实例的权重,这个方法是去使用新的分类器去拟合前面分类器预测的残差 。对于残差学习出来的结果,只累加一小部分(step*残差)逐步逼近目标,step一般都比较小,如0.01~0.001(注意该step非gradient的step),导致各个树的残差是渐变的而不是陡变的。这里仅仅是把”求残差“的逻辑替换为”求梯度“,可以这样想:梯度方向为每一步最优方向,累加的步数多了,总能走到局部最优点,若该点恰好为全局最优点,那和用残差的效果是一样的。
GBDT中的树是回归树(不是分类树),GBDT用来做回归预测,调整后也可以用于分类。
伪残差
每次迭代过程中,通过伪残差,拟合得到结果为 h_m(x) 。
得到:
,。
- gbdt 的算法的流程?
- gbdt 如何选择特征 ?
- gbdt 如何用于分类?
- gbdt 通过什么方式减少误差 ? 拟合残差
- gbdt的效果相比于传统的LR,SVM效果为什么好一些 ?
- gbdt 如何加速训练? xgboost
- gbdt的参数有哪些,如何调参 ?重要参数分为两类,第一类是Boosting框架的重要参数,第二类是弱学习器即CART回归树的重要参数。弱学习器的最大迭代次数、每个弱学习器的权重缩减系数、损失函数。。。
- gbdt的优缺点 ? 不能并行
from:https://www.cnblogs.com/ModifyRong/p/7744987.html
Xgboost
xgboost对应的模型是一堆CART树。我们希望建立K个回归树,将每棵树的预测值加到一起作为最终的预测值,我们用数学来准确地表示这个模型,如下所示:
这里的K就是树的棵数,F表示所有可能的CART树,f表示一棵具体的CART树。这个模型由K棵CART树组成。模型表示出来后,我们自然而然就想问,这个模型的参数是什么?第二,用来优化这些参数的目标函数又是什么?
模型的目标函数,如下所示:
这个目标函数同样包含两部分,第一部分就是损失函数,第二部分就是正则项,这里的正则化项由K棵树的正则化项相加而来,获取了xgboost模型和它的目标函数,那么训练的任务就是通过最小化目标函数来找到最佳的参数组。
树的复杂度定义:
XGBoost法对应的模型包含了多棵cart树,定义每棵树的复杂度:
其中T为叶子节点的个数,||w||为叶子节点向量的模 。γ表示节点切分的难度,λ表示L2正则化系数。
XGBoost在选取最佳切分点时可以开启多线程进行;
XGBoost是拟合上一轮损失函数的二阶导展开,GDBT是拟合上一轮损失函数的一阶导展开
xgboost在切分的时候就已经考虑了树的复杂度
XGBoost则采取了一种trade off,近似地找到best split。 既然样本数量太大,我们可不可以按比例来选择,从n个样本中抽取k个样本来进行计算,取k个样本中的最优值作为split value,这样就大大减少了运算数量。这就是k分位点选取的思想,即quantile sketch。
朴素贝叶斯
生成模型
当某个类别下某个特征项划分没有出现时。为了解决这个问题,我们引入Laplace校准,它的思想非常简单,就是对没类别下所有划分的计数加1,即,这样如果训练样本集数量充分大时,并不会对结果产生影响,并且解决了上述频率为0的尴尬局面。
分子分母个加上一个数:
条件概率:
先验概率 :
EM
极大似然估计求的是:假设样本服从一个分布,求出该分布的一个参数,使得当前样本出现的概率最大。
生成模型,对于完整的数据集Y,被分为可观测变量X,及隐变量Z,表示模型参数,与对其做最大似然估计,应最大化对数似然 L(
|X,Z)=ln P(X,Z|
)。Z是隐变量,无法直接求解,此时我们可通过对Z计算期望,来最大化X的对数“边际似然”
思想:若参数已知,则可根据训练数据推断最优隐变量Z的值(E步),Z值已知后,则可对参数进行极大似然估计。
步骤:先初始化,利用估计的参数来计算对数似然的期望值,即计算隐变量Z的期望
=E(Z|X,
),,然后基于X和
,就可以用极大似然概率求L(
|X,Z),更新
.
kmeans
无监督,如何选择K值,初始种子点;适用于凸数据集,kmean++,
K-Means的主要优点有:
1)原理比较简单,实现也是很容易,收敛速度快。
2)聚类效果较优。
3)算法的可解释度比较强。
4)主要需要调参的参数仅仅是簇数k。
K-Means的主要缺点有:
1)K值的选取不好把握
2)对于不是凸的数据集比较难收敛
3)如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。
4) 采用迭代方法,得到的结果只是局部最优。
5) 对噪音和异常点比较的敏感。
KNN
有监督算法,分类算法
优点有:
1) 理论成熟,思想简单,既可以用来做分类也可以用来做回归
2) 可用于非线性分类
3) 训练时间复杂度比支持向量机之类的算法低,仅为O(n)
4) 和朴素贝叶斯之类的算法比,对数据没有假设,准确度高,对异常点不敏感
5) 由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合
6)该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分
不足:
1、计算量大,分类速度慢。改进:浓缩训练样本集 ;加快K个最近邻的搜索速度
2、KNN在对属性较多的训练样本进行分类时,由于计算量大而使其效率大大降低效果。懒惰算法,对测试样本分类时的计算量大,内存开销大,评分慢
3、K值难以确定 。目前没有很好的方法,一般采用先定一个初始值,然后根据实验测试的结果调整K值。
4、对不平衡样本集比较敏感。当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。改进:采用权值的方法(增大距离小的邻居样本的权值)