前言
提醒:
文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。
其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。
分类与回归算法
机器学习中的分类与回归算法是两种主要的监督学习任务,它们分别用于解决不同类型的问题。以下是这两种算法的总结:
分类算法:
分类算法用于将数据分成不同的类别,适用于输出为离散标签的问题。常见的分类算法包括:
- 逻辑回归:使用逻辑函数来估计概率,用于二分类问题,也可以扩展到多分类问题。
- 支持向量机(SVM):通过找到最优的决策边界来最大化样本的分类准确率,适用于高维数据。
- 决策树:通过树结构来进行决策,每个节点代表一个特征的选择,叶子节点代表分类结果。
- 随机森林:由多个决策树组成的集成学习方法,通过投票来决定最终分类结果。
- 梯度提升决策树(GBDT):通过构建和结合多个弱学习器来形成强学习器,适用于分类和回归问题。
- 朴素贝叶斯:基于贝叶斯定理,假设特征之间相互独立,适用于文本分类等场景。
- K近邻(KNN):根据样本之间的距离进行分类,适用于小规模数据集。
- 神经网络:通过多层感知机学习数据的复杂模式,适用于图像、语音等复杂分类问题。
回归算法:
回归算法用于预测连续数值输出,适用于输出为连续变量的问题。常见的回归算法包括:
- 线性回归:通过拟合一条直线来预测目标变量的值,是最简单的回归方法。
- 岭回归:线性回归的扩展,通过引入L2正则化项来防止过拟合。
- Lasso回归:线性回归的另一种扩展,通过引入L1正则化项来进行特征选择。
- 弹性网回归:结合了岭回归和Lasso回归,同时引入L1和L2正则化项。
- 决策树回归:使用决策树结构来进行回归预测,适用于非线性关系。
- 随机森林回归:由多个决策树组成的集成学习方法,通过平均来决定最终回归结果。
- 梯度提升决策树回归(GBDT回归):通过构建和结合多个弱学习器来形成强学习器,适用于回归问题。
- 支持向量回归(SVR):支持向量机在回归问题上的应用,通过找到最优的决策边界来最大化样本的回归准确率。
- 神经网络回归:通过多层感知机学习数据的复杂模式,适用于复杂的回归问题。
分类与回归算法的比较:
- 输出类型:分类算法输出离散标签,回归算法输出连续数值。
- 评估指标:分类算法常用准确率、召回率、F1分数等指标,回归算法常用均方误差(MSE)、均方根误差(RMSE)等指标。
- 问题类型:分类算法适用于类别预测问题,如垃圾邮件检测;回归算法适用于数值预测问题,如房价预测。 在实际应用中,选择分类还是回归算法取决于问题的性质和需求。有时,可以将回归问题转化为分类问题,或者将分类问题转化为回归问题,具体取决于问题的特点和目标。
随机森林回归算法与分类算法
随机森林分类算法可参见:python_随机森林
随机森林(RandomForest)是一种基于决策树的集成学习方法,既可以用于回归任务,也可以用于分类任务。尽管它们的基本思想相似,但在具体实现和应用上存在一些关键区别。以下是随机森林回归算法与随机森林分类算法的主要区别:
目标不同
- 随机森林回归:用于解决回归问题,目标是预测连续值(如房价、温度等)。
- 随机森林分类:用于解决分类问题,目标是预测离散类别(如邮件是否为垃圾邮件、图像属于哪个类别等)。
输出结果不同
- 随机森林回归:最终的输出是所有决策树预测值的平均值。
- 随机森林分类:最终的输出是通过投票机制决定的类别,即选择得票最多的类别作为预测结果。
决策树的构建方式不同
- 随机森林回归:在构建每棵决策树时,使用方差减少(Variance Reduction)作为分裂标准,选择能够最大程度减少目标变量方差的特征进行分裂。
- 随机森林分类:在构建每棵决策树时,通常使用基尼不纯度(Gini Impurity)或信息增益(Information Gain)作为分裂标准,选择能够最大程度减少类别不确定性的特征进行分裂。
评估指标不同
- 随机森林回归:常用的评估指标包括均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)等。
- 随机森林分类:常用的评估指标包括准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1分数等。
叶子节点的值不同
- 随机森林回归:叶子节点的值是训练样本目标变量的平均值。
- 随机森林分类:叶子节点的值是训练样本中多数类别的标签。
应用场景不同
- 随机森林回归:适用于需要预测连续值的场景,如股票价格预测、温度预测等。
- 随机森林分类:适用于需要预测离散类别的场景,如垃圾邮件分类、疾病诊断等。
参数设置不同
- 随机森林回归:某些参数(如分裂标准)可能与分类不同,需要根据回归任务的特点进行调整。
- 随机森林分类:参数设置通常针对分类任务进行优化,如类别权重、分类阈值等。
总结
随机森林回归和分类的核心思想相同,都是通过集成多棵决策树来提高模型的泛化能力。但由于任务性质不同,它们在分裂标准、输出结果、评估指标等方面存在显著差异。理解这些区别有助于在实际应用中选择合适的算法并优化模型性能。
随机森林回归算法
随机森林回归算法(Random Forest Regression)是一种基于决策树的集成学习方法,旨在通过构建多棵决策树并对其结果进行平均来预测连续值。以下是随机森林回归算法的原理,结合相关数学公式进行讲解。
- 基本思想
随机森林回归通过以下步骤构建模型: - 从训练数据中随机抽取多个样本子集(Bootstrap抽样)。
- 为每个样本子集构建一棵回归决策树。
- 在每棵树的分裂过程中,随机选择特征子集进行分裂。
- 对所有树的预测结果取平均值,作为最终的预测值。
- Bootstrap抽样
假设训练数据集为 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } D = \{(x_1, y_1), (x_2, y_2), \dots, (x_N, y_N)\} D={(x1,y1),(x2,y2),…,(xN,yN)},其中 x i x_i xi 是特征向量, y i y_i yi 是目标值。随机森林从 D D D 中进行有放回的随机抽样,生成 T T T 个样本子集 D 1 , D 2 , … , D T D_1, D_2, \dots, D_T D1,D2,…,DT。
- 回归决策树的构建
对于每个样本子集 D t D_t Dt,构建一棵回归决策树。回归树的分裂目标是最大化目标变量的方差减少。
分裂标准:方差减少
假设一个节点
S
S
S 包含
m
m
m 个样本,其目标变量的方差为:
Var
(
S
)
=
1
m
∑
i
=
1
m
(
y
i
−
y
ˉ
)
2
\text{Var}(S) = \frac{1}{m} \sum_{i=1}^m (y_i - \bar{y})^2
Var(S)=m1i=1∑m(yi−yˉ)2
其中,
y
ˉ
\bar{y}
yˉ 是节点
S
S
S 中目标变量的平均值:
y
ˉ
=
1
m
∑
i
=
1
m
y
i
\bar{y} = \frac{1}{m} \sum_{i=1}^m y_i
yˉ=m1i=1∑myi
在分裂过程中,选择一个特征
j
j
j 和一个分割点
s
s
s,将节点
S
S
S 分为左子节点
S
L
S_L
SL 和右子节点
S
R
S_R
SR。分裂的目标是选择
j
j
j 和
s
s
s 使得方差减少最大化:
VarReduction
(
S
,
j
,
s
)
=
Var
(
S
)
−
(
∣
S
L
∣
∣
S
∣
Var
(
S
L
)
+
∣
S
R
∣
∣
S
∣
Var
(
S
R
)
)
\text{VarReduction}(S, j, s) = \text{Var}(S) - \left( \frac{|S_L|}{|S|} \text{Var}(S_L) + \frac{|S_R|}{|S|} \text{Var}(S_R) \right)
VarReduction(S,j,s)=Var(S)−(∣S∣∣SL∣Var(SL)+∣S∣∣SR∣Var(SR))
其中,
∣
S
L
∣
|S_L|
∣SL∣ 和
∣
S
R
∣
|S_R|
∣SR∣ 分别是左子节点和右子节点的样本数。
- 随机特征选择
在每棵树的每个节点分裂时,随机选择一部分特征(而不是所有特征)作为候选特征。假设总特征数为 p p p,则随机选择的特征数为 m m m(通常 m = p m = \sqrt{p} m=p 或 m = log 2 ( p ) m = \log_2(p) m=log2(p))。这种随机性可以有效减少模型的方差,提高泛化能力。
- 预测
对于一个新的输入样本 x x x,每棵回归树会给出一个预测值 h t ( x ) h_t(x) ht(x)。随机森林的最终预测值是所有树预测值的平均值:
y ^ = 1 T ∑ t = 1 T h t ( x ) \hat{y} = \frac{1}{T} \sum_{t=1}^T h_t(x) y^=T1t=1∑Tht(x)
其中, T T T 是树的数量, h t ( x ) h_t(x) ht(x) 是第 t t t 棵树的预测值。
- 优点
- 降低过拟合:通过集成多棵树和随机特征选择,减少模型的方差。
- 鲁棒性强:对噪声和异常值不敏感。
- 可解释性:可以通过特征重要性评估特征的重要性。
- 数学公式总结
- 方差计算:
Var ( S ) = 1 m ∑ i = 1 m ( y i − y ˉ ) 2 \text{Var}(S) = \frac{1}{m} \sum_{i=1}^m (y_i - \bar{y})^2 Var(S)=m1i=1∑m(yi−yˉ)2 - 方差减少:
VarReduction ( S , j , s ) = Var ( S ) − ( ∣ S L ∣ ∣ S ∣ Var ( S L ) + ∣ S R ∣ ∣ S ∣ Var ( S R ) ) \text{VarReduction}(S, j, s) = \text{Var}(S) - \left( \frac{|S_L|}{|S|} \text{Var}(S_L) + \frac{|S_R|}{|S|} \text{Var}(S_R) \right) VarReduction(S,j,s)=Var(S)−(∣S∣∣SL∣Var(SL)+∣S∣∣SR∣Var(SR)) - 最终预测:
y ^ = 1 T ∑ t = 1 T h t ( x ) \hat{y} = \frac{1}{T} \sum_{t=1}^T h_t(x) y^=T1t=1∑Tht(x)
- 方差计算:
算法实现
手动实现
代码中的决策树部分使用函数库实现
决策树回归算法可参见:python回归算法_决策树回归
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
class RandomForestRegressor:
def __init__(self, n_trees=10, max_depth=None):
self.n_trees = n_trees
self.max_depth = max_depth
self.trees = []
def fit(self, X, y):
n_samples = X.shape[0]
for _ in range(self.n_trees):
# Bootstrap sampling
indices = np.random.choice(n_samples, n_samples, replace=True)
X_sample = X[indices]
y_sample = y[indices]
# Create and fit a decision tree
tree = DecisionTreeRegressor(max_depth=self.max_depth)
tree.fit(X_sample, y_sample)
self.trees.append(tree)
def predict(self, X):
# Aggregate predictions from all trees
predictions = np.zeros((X.shape[0], self.n_trees))
for i, tree in enumerate(self.trees):
predictions[:, i] = tree.predict(X)
return np.mean(predictions, axis=1)
# 生成示例数据
X = np.sort(5 * np.random.rand(80, 1), axis=0) # 生成80个随机数
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0]) # 加入噪声
# 拟合随机森林回归模型
rf = RandomForestRegressor(n_trees=100, max_depth=5)
rf.fit(X, y)
# 进行预测
X_test = np.arange(0, 5, 0.01).reshape(-1, 1)
y_pred = rf.predict(X_test)
# 可视化结果
plt.scatter(X, y, color='red', label='Data', s=20)
plt.plot(X_test, y_pred, color='blue', label='Random Forest Prediction', linewidth=2)
plt.title("Random Forest Regression")
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.show()
运行结果:
python函数库实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
# 生成示例数据
X = np.sort(5 * np.random.rand(80, 1), axis=0) # 生成80个随机数
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0]) # 加入噪声
# 拆分数据为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建随机森林回归模型
rf = RandomForestRegressor(n_estimators=100, max_depth=5, random_state=42)
# 拟合模型
rf.fit(X_train, y_train)
# 进行预测
X_grid = np.arange(0, 5, 0.01).reshape(-1, 1) # 用于绘制平滑曲线的细分点
y_pred = rf.predict(X_grid)
# 可视化结果
plt.figure(figsize=(10, 6))
plt.scatter(X_train, y_train, color='red', label='Training Data', s=20)
plt.scatter(X_test, y_test, color='green', label='Test Data', s=20)
plt.plot(X_grid, y_pred, color='blue', label='Random Forest Prediction', linewidth=2)
plt.title("Random Forest Regression")
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.grid()
plt.show()
运行结果: