预测分析(三):基于机器学习的分类预测

文章目录

基于机器学习的分类预测

分类任务

分类问题主要是分为三种类型:

  • 二元标签类问题:目标中有两个类别的问题。
  • 多元分类问题:目标多于两类的问题。
  • 多标签分类问题:对观测指派的类别或标签多于一个的问题。

我们在这一章的核心任务就是预测的分类:

  • 预测类别
  • 预测每种类别可能的概率

在模型输出每种类别的情况下,分类依据是最高概率的类别预测。这是默认的,但是在特定的问题情境中,也会随之改变。

逻辑回归

现在正在使用机器学习执行分类任务。对于二元分类问题,逻辑模型可以生成目标属于正类的条件概率。这个模型是参数化模型的另一个示例,学习算法将尽可能挖掘性能最佳的参数组合 ω \omega ω,参数 ω \omega ω按照以下等式计算估计概率:

P ( y = 1 ∣ X ) = 1 1 + e − ω T X P\left(y=1|X\right)=\frac{1}{1+e^{-\omega^TX}} P(y=1∣X)=1+e−ωTX1

当目标属于正类的时候,得到的值接近 1 1 1;当目标属于负类的时候,得到的值接近 0 0 0。

分类树

分类树生成预测的方法是创建一些规则,连续运用这些规则,最终达到叶节点。

分类树的工作原理

我们深入研讨一下,分类树模型中的一系列规则是如何生成的?从本质上来说,分类树就是将特征空间划分为矩阵区域来生成预测。在分类的情形下,要尽量分割区域均匀。通常使用的方法是递归二元分割。假设有两个特征需要进行分割,我们要搞清楚:

  • 应该选择哪个特征进行分割?
  • 应该选择哪个点完成分割?

这种递归式的分割数据空间的方法一直持续到抵达某种停止准则。我们给出scikit-learn个简单参数用于控制分类的大小:

  • max_depth
  • min_samples_split
  • min_samples_leaf

scikit-learn库中,是基于基尼指数或者熵来确定划分的。

随机森林

随机森林(Random Forest)是一种基于决策树的集成学习模型,通过构建多棵决策树并结合它们的预测结果来提高泛化能力。

核心原理

  • 集成学习
    • 自助采样(Bootstrap):从原始数据中随机抽取多个子集(有放回抽样),训练多棵决策树。
    • 随机特征子集 :每棵树在划分节点时,随机选择部分特征(如max_features参数),降低树之间的相关性。
  • 投票机制
    • 分类任务:通过多数投票确定最终类别;回归任务:取所有树预测值的平均值。

关键优势

  • 抗过拟合:多棵树的平均效应减少了单棵树的噪声影响。
  • 鲁棒性强:对缺失值、异常值不敏感,无需特征缩放。
  • 天然支持多分类:直接通过投票处理多类别问题。
  • 可解释性 :通过特征重要性分析(feature_importances_)解释模型决策。

核心参数

参数名 作用
n_estimators 树的数量,越多模型越稳定,但计算成本越高(建议100+)。
max_depth 单棵树的最大深度,控制复杂度(默认None,可能导致过拟合)。
max_features 划分节点时随机选择的特征数(默认sqrt,适合分类;log2适合回归)。
min_samples_split 节点分裂所需最小样本数,防止过拟合(与决策树参数类似)。
class_weight 处理类别不平衡(如balanced自动调整权重)。

与决策树的对比

对比项 决策树 随机森林
模型复杂度 单棵树易过拟合 多棵树平均,泛化能力强
特征选择 全部特征 随机选择部分特征
预测稳定性 方差大 方差小
可解释性 直观(树结构) 需通过特征重要性分析

多元分类

多元分类(Multi-class Classification)是指将样本分配到三个或更多互斥类别的任务。
常用策略
(1) One-vs-Rest (OvR)

  • 原理:为每个类别训练一个二分类器(区分该类别与其他所有类别),预测时选择概率最高的类别。
  • 优缺点
    • 优点:实现简单,适合类别较多的场景。
    • 缺点:可能忽略类别间的细微差异,对噪声敏感。

(2) One-vs-One (OvO)

  • 原理:为每对类别训练一个二分类器,预测时通过投票决定最终类别。
  • 优缺点
    • 优点:训练更精细,避免类别不平衡问题。
    • 缺点:计算成本高(需训练( \frac{C(C-1)}{2} )个模型,( C )为类别数)。

(3) 直接多分类算法

  • Softmax回归:扩展逻辑回归,使用Softmax函数输出多类别概率。
  • 决策树/随机森林:通过树结构直接划分多类别,天然支持多分类。
  • 神经网络:使用Softmax激活函数和交叉熵损失函数。

** 评估指标**

  • 准确率(Accuracy):正确分类的样本比例。
  • 混淆矩阵:可视化各类别预测结果的交叉分布。
  • 宏平均(Macro-average):各类别指标的平均值(适用于类别均衡场景)。
  • 加权平均(Weighted-average):按类别样本数加权的平均值(适用于类别不平衡场景)。
  • F1分数:综合精确率与召回率,衡量模型对少数类的识别能力。
python 复制代码
from sklearn.datasets import load_digits
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

# 加载多分类数据集(手写数字识别)
data = load_digits()
X, y = data.data, data.target

# 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化模型
clf = RandomForestClassifier(n_estimators=200, max_depth=5, random_state=42)

# 训练与预测
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)

# 评估
print(classification_report(y_test, y_pred))

朴素贝叶斯分类器

贝叶斯公式

P ( d e f a u l t ∣ m a l e ) = P ( m a l e ∣ d e f a u l t ) P ( d e f a u l t ) P ( m a l e ) P\left(default | male\right)=\frac{P\left(male|default \right)P\left(default\right)}{P\left(male\right)} P(default∣male)=P(male)P(male∣default)P(default)

  • P ( d e f a u l t ∣ m a l e ) P\left(default | male\right) P(default∣male):后验概率
  • P ( d e f a u l t ) P\left(default\right) P(default):先验概率
  • P ( m a l e ∣ d e f a u l t ) P\left(male|default \right) P(male∣default) :似然,"逆"条件概率,即目标为真,信息为真的概率
  • P ( m a l e ) P\left(male\right) P(male):信息概率

P o s t e r i o r = L i k e l i h o o d × P r i o r E v i d e n c e Posterior=\frac{Likelihood \times Prior}{Evidence} Posterior=EvidenceLikelihood×Prior

回到分类问题

1. 算法原理

朴素贝叶斯是一种基于贝叶斯定理的概率分类模型,其核心思想是通过特征的条件概率来预测类别。
核心公式
P ( C ∣ X ) = P ( X ∣ C ) ⋅ P ( C ) P ( X ) P(C|X) = \frac{P(X|C) \cdot P(C)}{P(X)} P(C∣X)=P(X)P(X∣C)⋅P(C)

其中:

  • C C C 是类别, X X X 是特征向量。
  • P ( C ∣ X ) P(C|X) P(C∣X) 是后验概率(类别给定特征的概率)。
  • P ( X ∣ C ) P(X|C) P(X∣C) 是似然度(特征给类别定的概率)。
  • P ( C ) P(C) P(C) 是先验概率(类别本身的概率)。
  • P ( X ) P(X) P(X) 是证据因子(特征的全概率)。

关键假设

特征之间条件独立 (即 P ( X 1 , X 2 , ... , X n ∣ C ) = ∏ i = 1 n P ( X i ∣ C ) P(X_1,X_2,\dots,X_n|C) = \prod_{i=1}^n P(X_i|C) P(X1,X2,...,Xn∣C)=∏i=1nP(Xi∣C))。

这一假设简化了计算,但可能牺牲部分准确性。

2. 主要类型

根据数据类型的不同,朴素贝叶斯分为以下三类:

(1) 高斯朴素贝叶斯
  • 适用数据:连续型特征(如身高、体重)。
  • 假设:特征服从高斯分布(正态分布)。
  • 公式
    P ( X i ∣ C ) = 1 2 π σ C , i 2 exp ⁡ ( − ( X i − μ C , i ) 2 2 σ C , i 2 ) P(X_i|C) = \frac{1}{\sqrt{2\pi\sigma_{C,i}^2}} \exp\left(-\frac{(X_i - \mu_{C,i})^2}{2\sigma_{C,i}^2}\right) P(Xi∣C)=2πσC,i2 1exp(−2σC,i2(Xi−μC,i)2)
    其中 μ C , i \mu_{C,i} μC,i 和 σ C , i 2 \sigma_{C,i}^2 σC,i2 是类别 C C C 下第 i i i 个特征的均值和方差。
(2) 多项式朴素贝叶斯
  • 适用数据:离散型特征(如文本分类中的词频)。
  • 假设:特征服从多项式分布。
  • 公式
    P ( X i ∣ C ) = N C , i + α N C + α ⋅ n P(X_i|C) = \frac{N_{C,i} + \alpha}{N_C + \alpha \cdot n} P(Xi∣C)=NC+α⋅nNC,i+α
    其中 N C , i N_{C,i} NC,i 是类别 C C C 中特征 i i i 出现的次数, N C N_C NC 是类别 C C C 的总特征数, α \alpha α 是平滑参数(防止零概率)。
(3) 伯努利朴素贝叶斯
  • 适用数据:二值特征(如文本中的单词是否出现)。
  • 假设:特征服从伯努利分布(二项分布)。
  • 公式
    P ( X i ∣ C ) = p C , i ⋅ X i + ( 1 − p C , i ) ⋅ ( 1 − X i ) P(X_i|C) = p_{C,i} \cdot X_i + (1 - p_{C,i}) \cdot (1 - X_i) P(Xi∣C)=pC,i⋅Xi+(1−pC,i)⋅(1−Xi)
    其中 p C , i p_{C,i} pC,i 是类别 C C C 中特征 i i i 为 1 1 1的概率。

3. 优缺点

优点 缺点
计算效率高,适合大规模数据。 对特征条件独立假设敏感,若假设不成立则性能下降。
无需复杂调参。 对缺失值敏感。
能有效处理高维数据(如文本)。 无法捕捉特征间的交互关系。

4. 应用场景

  • 文本分类(如垃圾邮件过滤、情感分析)。
  • 实时预测(因计算速度快)。
  • 推荐系统(基于用户行为的概率预测)。
  • 医学诊断(基于症状的概率推断)。

5. 评估指标

与其他分类模型类似,常用:

  • 准确率(Accuracy)
  • 混淆矩阵
  • 精确率(Precision)、召回率(Recall)、F1分数
  • ROC曲线与AUC值(针对二分类问题)。

6. 示例代码(Python)

python 复制代码
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

# 加载文本分类数据集
data = fetch_20newsgroups(subset='all', remove=('headers', 'footers', 'quotes'))
X, y = data.data, data.target

# 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 文本向量化(TF-IDF)
vectorizer = TfidfVectorizer(max_features=5000)
X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)

# 初始化模型
clf = MultinomialNB(alpha=0.1)  # alpha为平滑参数

# 训练与预测
clf.fit(X_train_vec, y_train)
y_pred = clf.predict(X_test_vec)

# 评估
print(classification_report(y_test, y_pred))
相关推荐
阿坡RPA14 小时前
手搓MCP客户端&服务端:从零到实战极速了解MCP是什么?
人工智能·aigc
用户277844910499315 小时前
借助DeepSeek智能生成测试用例:从提示词到Excel表格的全流程实践
人工智能·python
机器之心15 小时前
刚刚,DeepSeek公布推理时Scaling新论文,R2要来了?
人工智能
算AI17 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
凯子坚持 c18 小时前
基于飞桨框架3.0本地DeepSeek-R1蒸馏版部署实战
人工智能·paddlepaddle
你觉得20518 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
8K超高清18 小时前
中国8K摄像机:科技赋能文化传承新图景
大数据·人工智能·科技·物联网·智能硬件
hyshhhh19 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
薛定谔的猫-菜鸟程序员19 小时前
零基础玩转深度神经网络大模型:从Hello World到AI炼金术-详解版(含:Conda 全面使用指南)
人工智能·神经网络·dnn
币之互联万物19 小时前
2025 AI智能数字农业研讨会在苏州启幕,科技助农与数据兴业成焦点
人工智能·科技