上学期花了一个多月读完了李航老师的《统计学习方法》,如今带着新入团队的新同窗以读书会的形式读这本书,书里边全是干货,对于我理解基本的机器学习算法颇有帮助,也笔头作了一些总结(不彻底基于此书),现将其摘录于此做为在博客园的第一篇博客。由于并非为了扫盲,因此仅仅是抓出脉络以及关键点,方便之后快速温习,而不是预习。算法
机器学习不少时候也被称做统计机器学习,这是由于大部分机器学习方法或多或少基于统计的方法,或者有基于统计方法的版本,即使是早期不涉及统计方法的算法在后来也都有了统计学的解释。
统计学习的三要素:模型、策略、算法,决定了一个统计学习的方法。整本书的算法都可从这三个思路去思考,而且从这三个思路思考能够培养必定的统计建模的意识。机器学习
简单的说,整个学习就是要学习出一个模型,而策略决定了咱们所想要的模型,而算法是用来获得模型参数所采用的方法而已。
这本书讨论的是有监督学习,而对于有监督学习来讲,共有的一个问题就是过拟合问题(overfitting),简单地来说,这是模型过度“迎合”训练数据而致使模型在训练数据上表现良好,而对未知输入的泛化能力不好的现象。
首先,过拟合是没法避免的。毕竟统计学习在训练时避免不了要拟合训练数据,这是由于咱们的模型参数就是由训练数据训练而来的。这里的“过”指的是模型过于复杂(迎合数据),致使泛化能力急剧降低。这里举个例子:
这里有多少盒子在树后?按照咱们的直觉应该是只有一个盒子,然而事实上多是:
显然,根据咱们的直观认识,对于一个未知的参数(即这里的盒子数),越简单可能越符合咱们的先验知识。也即简单的模型对未知的状况泛化能力更高(更加多是对的)。因此“从贝叶斯估计的角度来看,正则化项对应于模型的先验几率”,模型越复杂,先验越小(经验告诉咱们如此复杂的状况不太可能)。
所以,一个天然的想法即是要在策略中限制这种复杂的模型,虽然其在训练数据上比简单模型的表现更好。最多见的思路的就是添加正则化项,此项表示了模型的复杂度。在策略中和原始目标求和,便可获得既能获得较大的目标函数值,又不使模型较为复杂的模型参数。一个最简单的例子就是线性回归。
另外一个经常使用的方法即交叉验证,意思是将训练数据分块,一部分做为训练数据,一部分做为测试数据,屡次不一样地分块之后取在测试数据上表现最优的模型参数。这种方法的缺点是计算开销太大,毕竟要多训练不少次模型。函数
这是一个线性的模型,意在用一条线(超平面)对训练数据进行二分。学习
前提是数据严格线性可分,即存在一条线(超平面)能将正负例完美分开。而学习的目的即为学出这个分离线(超平面)。
学习的策略为经验风险最小化,即误分类点数最少,而假设是线性可分,所以误分类点数必定能够降为0。可是,误分类点数并不能指导咱们如何修改模型(不能导出有效的算法),所以咱们修改了一下策略的表示,改成误分类点到分离平面的距离之和。所以损失函数为:
\begin{equation}
L(w, b) = -\sum\limits_{x_i\in M} y_i(w_i+b)
\end{equation}
其中,(M)为误分类点集,(w)和(b)为参数,(y_i)是标准类标,乘上(y_i)乘积保证为正。为求其极小,分别对参数求导并令其导数为0便可:
测试
\begin{align}\notag
&\nabla_w L(w, b) = -\sum\limits_{x_i\in M}y_ix_i \\
&\nabla_b L(w, b) = -\sum\limits_{x_i\in M}y_i
\end{align}
优化
\begin{align}\notag
&w_{new} = w_{old}+\eta y_{i}x_{i} \\
&b_{new} = b_{old}+\eta y_{i}
\end{align}
blog
\begin{align}\notag
&w = -\sum\limits_{i=1}^{N}\alpha_{i}y_{i}x_{i} \\
&b = -\sum\limits_{i=1}^{N}\alpha_{i}y{i}
\end{align}
递归
\begin{align}\notag
&\alpha_{i} = \alpha_{i}+\eta \\
&b = b+\eta y_{i}
\end{align}
博客
根据近邻来估计实例点的属性。有两种方式,一种是Top-K最近邻,一种是根据距离肯定近邻。前者算最近的k个邻居,然后者计算离实例的距离在必定范围之内的全部邻居。分别适用于分布密集和分布稀疏的状况。
KNN算法最大的问题在于计算pair之间的距离,这是(O(n^2))的问题,而每次增长点,都须要进行N次计算,这是不可接受的,因而对实例存在的特征空间进行切分,具体算法即kd树算法。按维度进行切分,思想相似于二分查找。it
模型为条件几率模型,即目的为学习一个条件几率分布(和一个先验分布)。
模型假设:对于任一实例,在已知类标时,各特征相互独立。这实际上是将指数级参数个数((2^n))的联合分布降为了线性参数个数((2n+1))的条件几率与先验之积。
\begin{equation}
P(c_k|x_1, x_2, \dots, x_n) = \frac{P(x_1, \dots, x_n|c_k)\cdot P(c_k)}{P(x_1,x_2, \dots, x_n)}
\end{equation}
因为分母是平凡的,对于相同实例不一样类标都是相同的。所以能够略去。分母中的条件几率由于模型假设,能够写为:
\begin{equation}
P(x_1, \dots, x_n | c_k) = \prod\limits_{i=1}^{n}P(x_i|c_k)
\end{equation}
策略是指望风险最小化,即分类正误的指望,可等价于后验几率最小化(证实略)。也即只用找到后验几率最大的类标赋给实例便可。这里模型未知参数为(P(x_i|c_k))和(P(c_k)),为了估计其值,使用的是极大似然估计,通俗的说就是用训练样本中对应项出现的频率来做为估计的几率(由于极大似然估计和强假设,所以被叫作朴素贝叶斯,或者傻瓜贝叶斯)。
全部涉及到共现矩阵,也即观测的频率,以及几率的算法,都须要考虑几率值为0的状况,或者分母为0的状况。朴素贝叶斯加入拉普拉斯平滑使避免出现0。
if-then结构的树,目的即为学习出这样一棵树,非叶子节点是特征,叶子节点是类标。
策略是特征选择,越靠近根的特征应该有更好的区分能力,然而这一条件没法直接指导算法优化,所以引入信息增益定义。
几个定义:
而后信息增益能够定义为:给定特征A时D上的经验熵与经验条件熵之差。
\begin{equation}
g(D, A) = H(D)-H(D|A)
\end{equation}
定义信息增益比:信息增益与数据集关于特征A的值的熵之比。
\begin{equation}
g_{R}(D, A) = \frac{g(D, A)}{H_A(D)},
\end{equation}
其中(H_{A}(D) = -\sum\limits_{i=1}^n\frac{|D_i|}{|D|}\log\frac{|D_i|}{|D|}),n是A可取的值的个数,(D_i)是根据特征A进行分类之后获得的子类,能够被看做是经验熵。
算法中,ID3算法递归建树,对每一个节点,选择当前使信息增益最大的特征。C4.5算法,用信息增益比来替代ID3中的信息增益。这是由于消息增益越大,代表该特征对全局熵减小得也就最大,也即能使全局不肯定性下降最大,若一个特征能够取的值越多,每一个分支下的实例数就越少,相应的不肯定程度就越低,换句话说,信息增益会偏向取值更多的特征,所以ID3算法偏向生成那种宽而浅的树,这实际上是不合理的。而信息增益比用经验熵作约束,惩罚了取值数多的特征,所以能够获得更好的树。
决策树模型为了防止过拟合,须要必定的剪枝,其作法是用节点个数做为正则化项。
CART算法(建树、剪枝),用即你最小化建二叉树,即对于全部可能的特征的全部可能取值,取基尼最大的做为当前节点特征。
基尼指数: \begin{equation} \text{Gini}(p) = \sum\limits_{k=1}^K p_{k}(1-p_{k})=1-\sum\limits_{k=1}^Kp_k^2 \end{equation}