逻辑回归
理解
如果说线性回归是将特征利用正则公式,或梯度下降算出来的一个预测的值,那么,逻辑回归便是在此基础上更进一步,在线性回归的基础上,将值压缩在[0,1]这样的一个概率区间,然后在根据给定的某一特殊概率值判断是否为A,不满足为B。
(注:给定阈值后,当概率>阈值,即被判定为正确)
显然这是一个二分类算法。
与之有相似分类功能,便是KNN算法,KNN是通过投票投出来的分类,所以,KNN的分类一定会是一个确切的分类。
关联的算法
逻辑分类最重要的,便是混淆矩阵
| 预测标签(正例) | 预测标签(反例) | |
|---|---|---|
| 真实标签(正例) | 真正例(TP) | 伪反例(FN) |
| 真实标签(反例) | 伪正例(FP) | 真反例(TN) |
若真实标签为正,预测为正,就是真正例
若真实标签为正,预测为反,就是伪反例
相应的真实标签为反也是如此。
在这个矩阵下也产生了一些有意义的值:
- 精确率:真正例在预测正例中的占比 TP/TP+FP
- 召回率:真正例在真正例中的占比 TP/TP+FP
- F1值: 2*精确率*召回率/精确率+召回率
看上去有些绕,我们可以简要理解为:
精确率:对不对
召回率:全不全
(注:精确率是预测正例中对了多少,召回率是预测正例占样本正例多少)
精确不一定代表齐全,齐全不一定代表正确
(注:样本正例即使全部被预测对,但是还有伪正例,所以召回率100%的情况下,精确率不一定为100%)
AUC和ROC
相比于上面的数学计算,AUC和ROC类似于一个二维图形,在图形上解释含义。
X轴;FPR (False Positive Rate,假正例率)
Y轴:TPR (True Positive Rate,真正例率)
顾名思义,x表示预测错的比例,y则是预测正确的比例
显然的x越小,y越大越好。
但图像并不和X,Y轴有直接的关联,随X轴增加的其实是概率的阈值,
我们刚刚说过,逻辑回归是根据概率判断是否为A,否则为B。
ROC 曲线就是通过不断移动这个“阈值”(从 1 逐渐降到 0),计算出每一个阈值下对应的 点,然后将这些点连起来的曲线。
AUC 的定义就是 ROC 曲线下方的积分面积
(0,1)代表着完美模型,预测完全正确
(0,0)则代表模型全部判定案例为错
以下代表一个概率在0.9的正确案例:
| 预测 | 真实 | |
|---|---|---|
| 1.0 | 错 | 对 |
| 0.9 | 错 | 对 |
| 0.8 | 对 | 对 |
以下代表一个概率在0.5的错误案例:
| 预测 | 真实 | |
|---|---|---|
| 0.6 | 错 | 错 |
| 0.5 | 错 | 错 |
| 0.4 | 对 | 错 |
模型一开始为(0,1),我们可以参考之前讲过的召回率,代表模型中正确的案例被预测为正确,同样的,错误的也被预测为错误
不过当阈值被逐渐降低后,原先错误的也可能会被预测为伪正例,这就会使x逐渐开始平移,最后形成一个正方形。
会使用的包
from sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score,classification_report决策树
理解
要想了解决策树,首先需要了解熵的概念
在这里我们不需要把熵想的有多么高大上,可以先看作预测的难度。
举个例子,蓝色小球和红色小球各占50%的箱子,预测下一个球的概率,这就是最难预测的情况。
这里的最难预测,指的是预测的准确度,
如果蓝色小球多10%,那么预测准确的概率就是60%
如果蓝色小球占据全部的箱子,那么准确率便会来到100%,无论怎么预测,答案一定正确。
决策树便是根据特征逐步分类,然后进行预测
同样的举个例,预测一个程序员是否为南梁
在这里我们有三个特征,是否发可爱表情包,是否是二次元,以及是否吃雌二醇
显而易见的是,如果按照是否吃雌二醇的情况区分,预测的准确率一定是最大的。
决策树要做的是什么?
找到一个比较明显的特征,再然后区分为两类,在根据剩下的特征一个一个拆分。
把一个大箱子拆为多个小箱子,然后将小箱子拆成更小的箱子…
数学公式
首先便是信息熵
看着很复杂,其实我们可以翻译一下
(注:占比指:该标签/总标签)
在ID3决策树中,主要是通过信息增益判断
信息增益直白来说就是相对于前面不确定的箱子(你不能确定摸出来的是否为红球还是蓝球),准确率提升了多少。
条件熵直白来说,就是按照某个特征把箱子里的球分堆之后,这些小堆“平均下来”还有多乱?
(注:该取值占比指的是:该特征/总特征,该分支内的占比则是暂时先无视非该特征的行,在计算信息熵)
需要注意的是,如果按照每个小球独一无二的特征去划分,则显然做得到百分百的准确率
(比如用身份证去划分一群人,那么显然每个人都被分成了一个小块,这样过于详细的分类是对机器学习毫无作用的,因为标签的独一无二使得机器没办法预测未见过的值)
C4.5决策树
为了解决这个问题,我们引入了信息增益率和特征熵
特征熵就是看数据被切成怎么样的,切成两份(比如男女)和切成多份(幼儿青年中年老人),会获得不同的惩罚力度。
直观理解的话,就是把标签这一列求信息熵。
显然,标签越多,越杂,那么就越难以预测,对吧?
信息增益率就是一个权衡的值,为了信息增益提升,反而故意将信息零碎化需要对应的惩罚
CART决策树
理解
因为计算机本身是不擅长log函数运算的,在数据集过大的情况下,log运算会消耗大量的算力,这导致ID3和C4.5并不适合计算机。
因此,CART树便是一个广泛运用的算法,使用的是基尼指数:
同样只是看上去复杂,实际的计算其实和信息熵差不多:
基尼值越高,代表物品混乱程度越高,就像之前的一半红白球,基尼值便是0.5。
因此我们需要选择基尼值较低的进行分类,基尼值越低,代表物品预测正确的概率越高。
需要注意的是,CART决策树是二叉树,也就代表无论有多少特征,只能进行二分类,但可以多次二分类。
CART决策树既可以做分类,也可以做回归,但基本只用作分类。
在回归的时候,仍然使用的是最小二乘,也就是:
这个就不过多介绍了,就是预测值减损失值的平方。
需要注意的是,因为是二分类,所有左边和右边需要单独计算,先计算两边各自的平均值,接着相加。
不过分类一开始是不知道哪边最小的,需要对每个可能的分发依次计算,算出最小的平方损失。
当平方损失最小的时候,便是最优分法。
但需要注意的是,决策树的回归不是线性的。
因为回归树是分类算法,那么类和类之间一定会有一个跳跃的阶段,类似于一个阶梯。
显而易见的是,对于值的回归并不会有多么好的效果,在同一个区间上的数都会得到一个同样的值,除非将每个梯度无线分割为很小的块,这样便能从微积分的意义上趋近于一条曲线。
如果你理解了上述内容,就明白为什么需要剪枝了。
剪枝,是有利于植物的一种行为,具体原理跟顶端优势有关,这里只是先说个例子,让你对它的作用有一个了解。
毫无疑问的是,剪枝是对CART数有利的。
如果将每个值的特征都细分,那么我们可以得到一个在训练集上无比准确的CART数
只需要二分十次,我们便能区分2^10=1024个类,特征只要稍微不一样,得到的预测结果就会完全不同。
显而易见的是,细分为那么多类,过拟合了,模型过于复杂,对于新事物的预测力极差。
因此我们需要剪枝,剪枝也有两种方法:
预剪枝
这里有一些二叉树的术语,子树就是下面还有根系(节点)的树,去除上面的连接,也能局部的看作一棵树,叶节点则是下面没有东西的节点。
预就是提前,在子树分出节点的时候,进行准确率的判断,如果分出节点对准确率提升有帮助,就分类,如果对准确率提升没有帮助甚至下降,就不继续下分。
需要注意的是,子树分出的节点是有可能继续下分,接着可能对预测率有很大的提升。
预剪枝并不会看子树分出的节点,继续分出节点的情况,预剪枝只会处理当前情况下的最优解,这点很类似贪心算法,也就是局部最优解,并不会进行长远的规划。
会有欠拟合的风险,但是减少了决策树训练和测试时间的开销。
后剪枝
后剪枝便是树完全长成后再自下而上的依次判断,如果剪枝对准确率提升有帮助则剪,剪枝后准确率下降则留,是一个通过结果推过程的情况。
自然后剪枝是100%准确的,唯一的缺点就是自下而上遍历需要消耗的计算机资源很大,因为对于每个节点都需要进行运算,而二叉树显然是指数级增长,指数很容易爆炸,在进行计算就显得非常困难。
部分信息可能已经过时




