mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
2984 字
8 分钟
2026-03-19学习
2026-03-19

逻辑回归#

理解#

如果说线性回归是将特征利用正则公式,或梯度下降算出来的一个预测的值,那么,逻辑回归便是在此基础上更进一步,在线性回归的基础上,将值压缩在[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,假正例率)

FPR=FPFP+TNFPR= \frac{FP}{FP + TN}

Y轴:TPR (True Positive Rate,真正例率)

TPR=TPTP+FNTPR = \frac{TP}{TP + FN}

顾名思义,x表示预测错的比例,y则是预测正确的比例

显然的x越小,y越大越好。

但图像并不和X,Y轴有直接的关联,随X轴增加的其实是概率的阈值,

我们刚刚说过,逻辑回归是根据概率判断是否为A,否则为B。

ROC 曲线就是通过不断移动这个“阈值”(从 1 逐渐降到 0),计算出每一个阈值下对应的 (FPR,TPR)(FPR, TPR) 点,然后将这些点连起来的曲线。

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 LogisticRegression
from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score,classification_report

决策树#

理解#

要想了解决策树,首先需要了解熵的概念

在这里我们不需要把熵想的有多么高大上,可以先看作预测的难度。

举个例子,蓝色小球和红色小球各占50%的箱子,预测下一个球的概率,这就是最难预测的情况。

这里的最难预测,指的是预测的准确度,

如果蓝色小球多10%,那么预测准确的概率就是60%

如果蓝色小球占据全部的箱子,那么准确率便会来到100%,无论怎么预测,答案一定正确。

决策树便是根据特征逐步分类,然后进行预测

同样的举个例,预测一个程序员是否为南梁

在这里我们有三个特征,是否发可爱表情包,是否是二次元,以及是否吃雌二醇

显而易见的是,如果按照是否吃雌二醇的情况区分,预测的准确率一定是最大的。

决策树要做的是什么?

找到一个比较明显的特征,再然后区分为两类,在根据剩下的特征一个一个拆分。

把一个大箱子拆为多个小箱子,然后将小箱子拆成更小的箱子…

数学公式#

首先便是信息熵

H(X)=i=1np(xi)log2p(xi)H(X) = -\sum_{i=1}^{n} p(x_i) \log_2 p(x_i)

看着很复杂,其实我们可以翻译一下

信息熵=所有可能的结果(该结果的占比×log2(该结果的占比))\text{信息熵} = - \sum_{所有可能的结果} \Big( \text{该结果的占比} \times \log_2(\text{该结果的占比}) \Big)

(注:占比指:该标签/总标签)

在ID3决策树中,主要是通过信息增益判断

信息增益直白来说就是相对于前面不确定的箱子(你不能确定摸出来的是否为红球还是蓝球),准确率提升了多少。

IG(D,A)=H(D)H(DA)IG(D, A) = H(D) - H(D|A)

信息增益=划分前的整体混乱度(信息熵)按某特征划分后的混乱度(条件熵)\text{信息增益} = \text{划分前的整体混乱度(信息熵)} - \text{按某特征划分后的混乱度(条件熵)}

条件熵直白来说,就是按照某个特征把箱子里的球分堆之后,这些小堆“平均下来”还有多乱?

H(YX)=xXp(x)H(YX=x)H(Y|X) = \sum_{x \in X} p(x) H(Y|X=x)

条件熵=该特征的每个取值(该取值的占比×该分支内部的信息熵)\text{条件熵} = \sum_{\text{该特征的每个取值}} \Big( \text{该取值的占比} \times \text{该分支内部的信息熵} \Big)

(注:该取值占比指的是:该特征/总特征,该分支内的占比则是暂时先无视非该特征的行,在计算信息熵)

需要注意的是,如果按照每个小球独一无二的特征去划分,则显然做得到百分百的准确率

(比如用身份证去划分一群人,那么显然每个人都被分成了一个小块,这样过于详细的分类是对机器学习毫无作用的,因为标签的独一无二使得机器没办法预测未见过的值)

C4.5决策树

为了解决这个问题,我们引入了信息增益率和特征熵

特征熵就是看数据被切成怎么样的,切成两份(比如男女)和切成多份(幼儿青年中年老人),会获得不同的惩罚力度。 IV(A)=v=1VDvDlog2DvDIV(A) = - \sum_{v=1}^{V} \frac{|D^v|}{|D|} \log_2 \frac{|D^v|}{|D|}

特征熵(内部值)=该特征的每个取值(该取值的占比×log2(该取值的占比))\text{特征熵(内部值)} = - \sum_{\text{该特征的每个取值}} \Big( \text{该取值的占比} \times \log_2(\text{该取值的占比}) \Big)

直观理解的话,就是把标签这一列求信息熵。

显然,标签越多,越杂,那么就越难以预测,对吧?

信息增益率就是一个权衡的值,为了信息增益提升,反而故意将信息零碎化需要对应的惩罚

IG_Ratio(D,A)=IG(D,A)IV(A)IG\_Ratio(D, A) = \frac{IG(D, A)}{IV(A)}

信息增益率=信息增益特征熵\text{信息增益率} = \frac{\text{信息增益}}{\text{特征熵}}

CART决策树#

理解#

因为计算机本身是不擅长log函数运算的,在数据集过大的情况下,log运算会消耗大量的算力,这导致ID3和C4.5并不适合计算机。

因此,CART树便是一个广泛运用的算法,使用的是基尼指数: Gini(D)=k=1Ypk(1pk)=1k=1Ypk2Gini(D) = \sum_{k=1}^{|Y|} p_k (1 - p_k) = 1 - \sum_{k=1}^{|Y|} p_k^2

同样只是看上去复杂,实际的计算其实和信息熵差不多:

基尼值(混乱度)=1所有的可能类别(该类的占比)2\text{基尼值(混乱度)} = 1 - \sum_{\text{所有的可能类别}} (\text{该类的占比})^2

基尼值越高,代表物品混乱程度越高,就像之前的一半红白球,基尼值便是0.5。

因此我们需要选择基尼值较低的进行分类,基尼值越低,代表物品预测正确的概率越高。

需要注意的是,CART决策树是二叉树,也就代表无论有多少特征,只能进行二分类,但可以多次二分类。

CART决策树既可以做分类,也可以做回归,但基本只用作分类。

在回归的时候,仍然使用的是最小二乘,也就是:

L(j,s)=xiR1(j,s)(yiy^1)2+xiR2(j,s)(yiy^2)2L(j, s) = \sum_{x_i \in R_1(j, s)} (y_i - \hat{y}_1)^2 + \sum_{x_i \in R_2(j, s)} (y_i - \hat{y}_2)^2

这个就不过多介绍了,就是预测值减损失值的平方。

需要注意的是,因为是二分类,所有左边和右边需要单独计算,先计算两边各自的平均值,接着相加。

不过分类一开始是不知道哪边最小的,需要对每个可能的分发依次计算,算出最小的平方损失。

当平方损失最小的时候,便是最优分法。

但需要注意的是,决策树的回归不是线性的。

因为回归树是分类算法,那么类和类之间一定会有一个跳跃的阶段,类似于一个阶梯。

显而易见的是,对于值的回归并不会有多么好的效果,在同一个区间上的数都会得到一个同样的值,除非将每个梯度无线分割为很小的块,这样便能从微积分的意义上趋近于一条曲线。

如果你理解了上述内容,就明白为什么需要剪枝了。

剪枝,是有利于植物的一种行为,具体原理跟顶端优势有关,这里只是先说个例子,让你对它的作用有一个了解。

毫无疑问的是,剪枝是对CART数有利的。

如果将每个值的特征都细分,那么我们可以得到一个在训练集上无比准确的CART数

只需要二分十次,我们便能区分2^10=1024个类,特征只要稍微不一样,得到的预测结果就会完全不同。

显而易见的是,细分为那么多类,过拟合了,模型过于复杂,对于新事物的预测力极差。

因此我们需要剪枝,剪枝也有两种方法:

预剪枝

这里有一些二叉树的术语,子树就是下面还有根系(节点)的树,去除上面的连接,也能局部的看作一棵树,叶节点则是下面没有东西的节点。

预就是提前,在子树分出节点的时候,进行准确率的判断,如果分出节点对准确率提升有帮助,就分类,如果对准确率提升没有帮助甚至下降,就不继续下分。

需要注意的是,子树分出的节点是有可能继续下分,接着可能对预测率有很大的提升。

预剪枝并不会看子树分出的节点,继续分出节点的情况,预剪枝只会处理当前情况下的最优解,这点很类似贪心算法,也就是局部最优解,并不会进行长远的规划。

会有欠拟合的风险,但是减少了决策树训练和测试时间的开销。

后剪枝

后剪枝便是树完全长成后再自下而上的依次判断,如果剪枝对准确率提升有帮助则剪,剪枝后准确率下降则留,是一个通过结果推过程的情况。

自然后剪枝是100%准确的,唯一的缺点就是自下而上遍历需要消耗的计算机资源很大,因为对于每个节点都需要进行运算,而二叉树显然是指数级增长,指数很容易爆炸,在进行计算就显得非常困难。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

2026-03-19学习
https://suifengstudy.tech/posts/2026-03-19学习/
作者
随风
发布于
2026-03-19
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00