分类问题主要是分为三种类型:
我们在这一章的核心任务就是预测的分类:
在模型输出每种类别的情况下,分类依据是最高概率的类别预测。这是默认的,但是在特定的问题情境中,也会随之改变。
现在正在使用机器学习执行分类任务。对于二元分类问题,逻辑模型可以生成目标属于正类的条件概率。这个模型是参数化模型的另一个示例,学习算法将尽可能挖掘性能最佳的参数组合 ω \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)是一种基于决策树的集成学习模型,通过构建多棵决策树并结合它们的预测结果来提高泛化能力。
核心原理
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)
(3) 直接多分类算法
** 评估指标**
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 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
朴素贝叶斯是一种基于贝叶斯定理的概率分类模型,其核心思想是通过特征的条件概率来预测类别。
核心公式:
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)
其中:
关键假设:
特征之间条件独立(即 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))。
这一假设简化了计算,但可能牺牲部分准确性。
根据数据类型的不同,朴素贝叶斯分为以下三类:
优点 | 缺点 |
---|---|
计算效率高,适合大规模数据。 | 对特征条件独立假设敏感,若假设不成立则性能下降。 |
无需复杂调参。 | 对缺失值敏感。 |
能有效处理高维数据(如文本)。 | 无法捕捉特征间的交互关系。 |
与其他分类模型类似,常用:
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))