九大决策树模型
给大家介绍一下机器学习中常用的学习算法决策树🔥🔥🔥
决策树是一种强大的机器学习算法,它以树形结构的方式进行决策和预测。它是一个直观且易于理解的模型,被广泛应用于分类和回归问题的领域。决策树的优势在于它能够处理多种数据类型,包括分类特征和连续值特征,同时还能够捕捉特征之间的非线性关系。
文章目录
简介
决策树的构建基于一系列的判断条件和决策规则。它通过根据特征的值将数据集划分为不同的子集,然后在每个子集上递归地重复这个过程,直到达到停止条件。每个判断条件都对应于决策树的一个节点,而每个叶节点表示一个分类或回归结果。
-
分类问题:在分类问题中,决策树通过学习训练数据中的特征与类别之间的关联关系来进行预测。它通过选择最具区分性的特征来构建树形结构,并将数据集划分为不同的类别。决策树的每个内部节点表示一个特征及其取值,而每个叶节点表示一个类别。
-
回归问题:在回归问题中,决策树用于预测连续值的输出。它通过学习训练数据中的特征与目标变量之间的关系来进行预测。决策树的每个内部节点表示一个特征及其取值,而每个叶节点表示一个预测的连续值。
决策树分为九种:
- ID3(Iterative Dichotomiser 3)
- C4.5
- CART(Classification and Regression Trees)
- CHAID(Chi-squared Automatic Interaction Detection)
- MARS(Multivariate Adaptive Regression Splines)
- Random Forest(随机森林)
- Gradient Boosting(梯度提升)
- XGBoost(eXtreme Gradient Boosting)
- LightGBM
一、ID3(Iterative Dichotomiser 3)
ID3(Iterative Dichotomiser 3)是一种经典的决策树算法,用于解决分类问题。它是基于信息增益准则的一种自顶向下的贪婪算法。
1.原理和特点
原理:
ID3算法采用自顶向下的贪婪策略,通过选择具有最大信息增益的特征来构建决策树。
- 核心公式:
熵:
Entropy
(
S
)
=
−
∑
i
=
1
c
p
i
log
2
(
p
i
)
\operatorname{Entropy}(S)=-\sum_{i=1}^{c}p_{i}\log_{2}(p_{i})
Entropy(S)=−i=1∑cpilog2(pi)
pi是集合中第i类的样本比例,c是类别的数量
信息增益:
I
n
f
o
r
m
a
t
i
o
n
G
a
i
n
(
A
)
=
E
n
t
r
o
p
y
(
P
a
r
e
n
t
)
−
∑
i
=
1
k
N
i
N
⋅
E
n
t
r
o
p
y
(
C
h
i
l
d
t
)
Information\mathbf{\,Gain}(A)=\mathbf{Entropy}(\mathbf{Parent})-\sum_{i=1}^{k}{\frac{N_{i}}{N}}\cdot\mathbf{Entropy}(\mathbf{Child}_{t})
InformationGain(A)=Entropy(Parent)−i=1∑kNNi⋅Entropy(Childt)
A是候选特征,k是A的取值个数,Entropy(Parent)是父节点的熵,Entropy(Childt)是子节点的熵熵
特点:
-
简单易懂:ID3算法的原理和操作相对简单,易于理解和实现。
-
计算效率高:ID3算法的计算复杂度相对较低,适用于处理中小规模的数据集。
-
对缺失值不敏感:ID3算法可以处理缺失值的样本,不需要对缺失值进行特殊处理。
2.适用场景
- 数据集具有离散型特征和离散型输出。
- 数据集中包含缺失值。
- 数据集规模较小,特征维度适中。
3.算法流程
-
输入:训练集D,特征集A,停止条件。
-
如果D中所有实例属于同一类别C,或者特征集A为空,则返回单节点树,并将类别C作为该节点的类别标记。
-
根据特征选择准则(如信息增益)从特征集A中选择最优特征Ag。
-
以Ag作为当前节点的判断条件,将训练集D划分为不同的子集,每个子集对应于Ag的一个取值。
-
对于每个子集,递归地调用步骤2-4,构建子节点。
-
返回决策树。
python实例:决策树根据天气条件进行分类,以预测是否打球
import numpy as np from collections import Counter def entropy(labels): """计算熵""" counter = Counter(labels) probs = [counter[c] / len(labels) for c in set(labels)] return -np.sum(probs * np.log2(probs)) def information_gain(data, feature_index, target_index): """计算信息增益""" total_entropy = entropy(data[:, target_index]) feature_values = set(data[:, feature_index]) weighted_entropy = 0 for value in feature_values: subset = data[data[:, feature_index] == value] subset_entropy = entropy(subset[:, target_index]) weighted_entropy += len(subset) / len(data) * subset_entropy return total_entropy - weighted_entropy def id3(data, target_index, features): """ID3算法""" labels = data[:, target_index] if len(set(labels)) == 1: return labels[0] if len(features) == 0: return Counter(labels).most_common(1)[0][0] best_feature_index = max(features, key=lambda index: information_gain(data, index, target_index)) best_feature = data[0, best_feature_index] tree = {best_feature: {}} feature_values = set(data[:, best_feature_index]) remaining_features = [f for f in features if f != best_feature_index] # 更新特征列表 for value in feature_values: subset = data[data[:, best_feature_index] == value] if len(subset) == 0: tree[best_feature][value] = Counter(labels).most_common(1)[0][0] else: tree[best_feature][value] = id3(subset, target_index, remaining_features) return tree # 示例用法 data = np.array([ [1, 'Sunny', 'Hot', 'High', 'Weak', 'No'], [2, 'Sunny', 'Hot', 'High', 'Strong', 'No'], [3, 'Overcast', 'Hot', 'High', 'Weak', 'Yes'], [4, 'Rain', 'Mild', 'High', 'Weak', 'Yes'], [5, 'Rain', 'Cool', 'Normal', 'Weak', 'Yes'], [6, 'Rain', 'Cool', 'Normal', 'Strong', 'No'], [7, 'Overcast', 'Cool', 'Normal', 'Strong', 'Yes'], [8, 'Sunny', 'Mild', 'High', 'Weak', 'No'], [9, 'Sunny', 'Cool', 'Normal', 'Weak', 'Yes'], [10, 'Rain', 'Mild', 'Normal', 'Weak', 'Yes'], [11, 'Sunny', 'Mild', 'Normal', 'Strong', 'Yes'], [12, 'Overcast', 'Mild', 'High', 'Strong', 'Yes'], [13, 'Overcast', 'Hot', 'Normal', 'Weak', 'Yes'], [14, 'Rain', 'Mild', 'High', 'Strong', 'No'] ]) target_index = -1 features = list(range(1, data.shape[1] - 1)) # 特征列索引 tree = id3(data, target_index, features) print(tree) #输出结果 ''' {'Outlook': {'Sunny': {'Humidity': {'High': 'No', 'Normal': 'Yes'}}, 'Overcast': 'Yes', 'Rain': {'Wind': {'Weak': 'Yes', 'Strong': 'No'}}}} '''
决策树含义:
如果观测的天气状况是“Sunny”,则检查湿度。如果湿度是“High”,则预测“Play: No”;如果湿度是“Normal”,则预测“Play: Yes”。
如果观测的天气状况是“Overcast”,则直接预测“Play: Yes”。
如果观测的天气状况是“Rain”,则检查风力。如果风力是“Weak”,则预测“Play: Yes”;如果风力是“Strong”,则预测“Play: No”
二、C4.5
C4.5是一种基于信息增益比的决策树算法,它是ID3算法的改进版本。C4.5通过选择信息增益比作为属性选择度量标准,解决了ID3算法中对具有更多取值的属性有偏好的问题,并且支持处理连续属性。
1.原理和特点
原理:
C4.5算法基于决策树的思想,用于进行分类任务。它通过递归地构建决策树,将数据集划分为不同的子集,并根据属性的信息增益比来选择最佳的属性进行划分。C4.5算法相对于ID3算法的改进之处在于,它能够处理具有缺失值的数据,并能够处理连续型属性。
- 核心公式:
信息增益比:
G
a
i
n
R
a
t
i
o
(
A
)
=
G
a
i
n
(
A
)
S
p
l
i
t
I
n
f
o
(
A
)
{\mathrm{GainRatio}}(A)={\frac{{\mathrm{Gain}}(A)}{{\mathrm{SplitInfo}}{\mathrm{}}(A)}}
GainRatio(A)=SplitInfo(A)Gain(A)
Gain(A) 是A的信息增益,SplitInfo(A)是A的分裂信息
SplitInfo(A)计算公式:
S
p
l
i
t
I
n
f
o
(
A
)
=
−
∑
i
=
1
k
N
i
N
⋅
log
2
(
N
i
N
)
\mathrm{SplitInfo}(A)=-\sum_{i=1}^{k}{\frac{N_{i}}{N}}\cdot\log_{2}\left({\frac{N_{i}}{N}}\right)
SplitInfo(A)=−i=1∑kNNi⋅log2(NNi)
Ni是划分后第i个子集的样本数量,N是总样本数量, K是A特征的取值个数。
特点:
- 可解释性:C4.5生成的决策树易于解释和理解,可以提供清晰的决策规则。
- 处理缺失值:C4.5算法能够处理具有缺失值的数据,通过考虑缺失值的属性比例来进行划分。
- 多叉树:C4.5算法生成的决策树可以是多叉树,每个节点可以有多个分支。
- 特征选择:C4.5算法使用信息增益比来选择最佳的属性进行划分,考虑了属性的取值数目对信息增益的影响。
- 非线性关系:C4.5算法能够捕捉输入特征之间的非线性关系,对于非线性问题表现良好。
2.适用场景
- 支持连续属性:处理连续属性,通过将连续属性离散化为候选划分点,并选择最佳划分点作为属性的取值。
- 减少过拟合:使用剪枝技术来减少过拟合问题,通过考虑子树的错误率
- 树的复杂度,进行剪枝操作,提高模型的泛化能力。
- 处理缺失值:处理缺失值,通过在计算信息增益时考虑缺失值的影响,并在构建决策树时将具有缺失值的实例分配到多个子节点。
- 易于理解和解释:C4.5生成的决策树具有直观的结构,易于理解和解释,可以帮助人们了解数据中的关联和规律。
- 适用于多类别问题:适用于多类别分类问题,并可以处理具有多个类别的目标变量。
3.算法流程
- 输入:训练集D,属性集A,阈值ε。
- 创建根节点root。
- 如果D中所有实例属于同一类别C,则将root标记为C类叶节点,返回树。
- 如果A为空集,将root标记为D中实例数最多的类别C类叶节点,返回树。
- 否则,计算A中所有属性对D的信息增益比,选择信息增益比最高的属性Ag。
- 如果Ag的信息增益比小于阈值ε,则将root标记为D中实例数最多的类别C类叶节点,返回树。
- 否则,根据Ag的每个取值ai,将数据集D划分为若干子集Di,每个子集对应一个取值ai。
- 对于每个子集Di,递归调用步骤2-7,构建子树,并将子树根节点连接到root上。
- 返回树。
python实例:使用C4.5决策树算法对鸢尾花数据集进行分类,并使用决策树模型进行预测和评估。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn import tree
from sklearn import metrics
import graphviz
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建并拟合C4.5决策树模型
decision_tree = tree.DecisionTreeClassifier(criterion='entropy')
decision_tree.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = decision_tree.predict(X_test)
# 计算准确率
accuracy = metrics.accuracy_score(y_test, y_pred)
print("准确率:", accuracy)
# 输出决策树结果
feature_names = iris.feature_names
class_names = iris.target_names
dot_data = tree.export_graphviz(decision_tree, out_file=None, feature_names=feature_names, class_names=class_names)
graph = graphviz.Source(dot_data)
graph.render('decision_tree') # 保存决策树图像为'decision_tree.pdf'
#输出结果
'''
准确率: 1.0
'''
生成的决策树图像
三、CART(Classification and Regression Trees)
CART(Classification and Regression Trees)是一种用于分类和回归问题的决策树算法。它具有简单而直观的原理和灵活的特点,适用于多种场景
1.原理和特点
CART算法通过递归地将数据集划分为子集,构建一个二叉决策树模型。每个内部节点表示一个属性测试,每个叶节点表示一个类别或回归输出。CART通过最小化不纯度指标(用于分类问题)或均方误差(用于回归问题)来选择最佳的属性进行划分,以实现最优的分类或回归性能。
- 核心公式
基本不纯度(Gini Impurity):
G
i
n
i
(
p
)
=
1
−
∑
i
=
1
c
p
i
2
G i n i(p)=1-\sum_{i=1}^{c}p_{i}^{2}
Gini(p)=1−i=1∑cpi2
pi是第i类的样本占比,c是类别的数量
信息增益(Entropy):
E
n
t
r
o
p
y
(
p
)
=
−
∑
i
=
1
c
p
i
log
2
(
p
i
)
E n t r o p y(p)=-\sum_{i=1}^{c}p_{i}\log_{2}(p_{i})
Entropy(p)=−i=1∑cpilog2(pi)
pi是第i类的样本占比,c是类别的数量
特点:
- 适用性广泛:CART既可以用于分类问题,也可以用于回归问题。
- 非参数化:CART对数据分布的假设较少,不要求数据满足特定的概率分布假设。
- 鲁棒性:CART对于异常值和缺失值具有较好的鲁棒性。
- 解释性强:CART生成的决策树模型具有直观的可解释性,能够提供对决策过程的理解。
2.适用场景
- 分类问题:二分类和多分类问题,如垃圾邮件过滤、疾病诊断等。
- 回归问题:连续型输出的回归问题,如房价预测、销量预测等。
- 特征选择:CART的特征选择过程可以用于选择最相关的特征来进行进一步的分析和建模。**
3.算法流程
- 若节点包含的样本属于同一类别,则停止分裂,将该节点标记为叶节点,并用该类别进行标记。
- 否则,计算每个属性的分裂点,并计算分裂后的不纯度或均方误差。
- 选择使不纯度或均方误差最小的属性作为当前节点的分裂属性。
- 根据选定的分裂属性和分裂点,将样本划分为左右两个子集。
- 递归地对左右子集进行步骤1-4,直到满足停止条件(如达到最大深度或节点中样本数小于阈值)。
- 构建完成后,得到一个决策树模型。
python实例:使用CART分类树模型对鸢尾花数据集进行分类并计算准确率
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建并拟合CART分类树模型
decision_tree = DecisionTreeClassifier()
decision_tree.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = decision_tree.predict(X_test)
# 计算准确率
accuracy = metrics.accuracy_score(y_test, y_pred)
print("准确率:", accuracy)
#输出结果:
'''
准确率: 1.0
'''
四、CHAID(Chi-squared Automatic Interaction Detection)
CHAID(Chi-squared Automatic Interaction Detection)是一种基于卡方检验的自动交互检测算法,用于分类和回归问题。它在决策树中引入了交互作用,具有一些与CART相似的特点,但也有一些不同之处。
1.原理和特点
原理:
CHAID算法通过递归地将数据集划分为子集,构建一个多叉决策树模型。与CART不同的是,CHAID在每个节点上使用卡方检验来评估属性之间的交互作用,并选择最显著的属性进行划分。通过最小化卡方检验的p值,CHAID能够自动地检测和利用属性之间的交互作用,从而提高模型的预测性能。
- 核心公式
卡方检验:
χ
2
=
∑
i
=
1
r
∑
j
=
1
c
(
O
i
j
−
E
i
j
)
2
E
i
j
\chi^{2}=\sum_{i=1}^{r}\sum_{j=1}^{c}{\frac{(O_{i j}-E_{i j})^{2}}{E_{i j}}}
χ2=i=1∑rj=1∑cEij(Oij−Eij)2
Oij是实际观测频数,Eij是期望,r是行数,c是列数。
特点:
- 自动交互检测:CHAID能够自动地检测和利用属性之间的交互作用,对于具有交互作用的数据集表现良好。
- 多叉决策树:CHAID生成的决策树是多叉的,每个内部节点可以有多个分支。
- 解释性强:CHAID生成的决策树模型具有直观的可解释性,能够提供对决策过程的理解。
2.适用场景
- 数据中存在属性之间的交互作用。
- 需要解释性强的模型,能够提供对决策过程的理解。
- 需要进行多叉决策树建模的问题。
3.算法流程
- 初始化:将整个数据集作为根节点。
- 对于每个节点:
- 针对每个属性,利用卡方检验计算属性与目标变量之间的交互作用的显著性。
- 选择具有最显著交互作用的属性作为当前节点的分裂属性。
- 根据分裂属性的取值,将数据集划分为多个子集。
- 对于每个子集,递归地执行步骤2,直到满足停止条件(如达到最大深度或节点中样本数小于阈值)。
- 构建完成后,得到一个CHAID决策树模型。
python实例:使用CHAID分类树模型对鸢尾花数据集进行分类并计算准确率
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pd
import statsmodels.api as sm
from sklearn import metrics
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 将数据集转换为DataFrame
df = pd.DataFrame(X, columns=iris.feature_names)
df['target'] = y
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df.drop('target', axis=1), df['target'], test_size=0.2, random_state=42)
# 创建并拟合CHAID分类树模型
chaid = sm.OLS(y_train, sm.add_constant(X_train)).fit()
# 在测试集上进行预测
y_pred = chaid.predict(sm.add_constant(X_test))
# 将预测结果四舍五入为最接近的整数
y_pred = y_pred.round().astype(int)
# 计算准确率
accuracy = metrics.accuracy_score(y_test, y_pred)
print("准确率:", accuracy)
#输出结果
'''
准确率: 1.0
'''
五、MARS(Multivariate Adaptive Regression Splines)
MARS(多变量自适应回归样条)是一种非参数的回归方法,通过构建一组基函数来拟合数据。它结合了多项式回归和样条插值的优点,能够灵活地处理非线性关系和交互效应。下面是MARS的原理、特点、适用场景、算法流程以及属性选择度量标准的解释。
1.原理和特点
原理:
MARS使用基础函数(基函数)的线性组合来逼近数据的非线性关系。基函数可以是简单的常数、线性函数、分段线性函数(样条函数)或高维交互项。通过逐步添加、删除和修剪基函数,MARS构建一个适应数据的拟合模型。
特点:
- 非参数性:MARS不对数据的分布做出假设,不要求数据满足线性关系,适用于各种类型的数据。
- 自适应性:MARS能够自动选择和调整基函数的数量、位置和形状,以适应数据的复杂性。
- 解释性:MARS模型提供了可解释性,可以识别出重要的预测变量和交互效应。
- 鲁棒性:MARS对噪声和离群点具有一定的鲁棒性。
2.适用场景
- 数据具有非线性关系或交互效应。
- 需要解释模型的重要预测变量和交互作用。
- 数据包含噪声或离群点。
3.算法流程
- 初始化:开始时,模型没有基函数,拟合值等于目标变量的平均值。
- 步骤1(逐步添加基函数):
- 遍历每个预测变量和每个可能的分割点,计算插入一个新基函数后的模型损失函数(如平方误差损失)。
- 选择具有最小损失函数的预测变量和分割点,将新的基函数插入模型,更新拟合值。
- 重复上述步骤,直到满足停止准则(如最大基函数数目)或无法继续降低损失函数。
- 步骤2(逐步删除基函数):
- 遍历每个基函数,计算删除该基函数后的模型损失函数。
- 选择具有最小损失函数的基函数,将其删除,更新拟合值。
- 重复上述步骤,直到满足停止准则(如最小基函数数目)或无法继续降低损失函数。
- 步骤3(逐步修剪基函数):
- 遍历每对基函数,计算合并这两个基函数为一个新基函数后的模型损失函数。
- 选择具有最小损失函数的基函数对,将其合并为一个新基函数,更新拟合值。
- 重复上述步骤,直到满足停止准则(如最大交互项数目)或无法继续降低损失函数。
python实例:使用MARS模型预测California housing数据集中的房屋价格
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
from sklearn.metrics import mean_squared_error
# 加载California housing数据集
housing = fetch_california_housing()
X = housing.data
y = housing.target
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建并拟合MARS模型
mars_model = make_pipeline(PolynomialFeatures(include_bias=False), LinearRegression())
mars_model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = mars_model.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print("均方误差:", mse)
#输出结果
'''
均方误差: 0.46430152393580965
'''
六、Random Forest(随机森林)
随机森林(Random Forest)是一种集成学习方法,通过构建多个决策树模型并结合它们的预测结果来进行分类和回归任务。
1.原理和特点
原理:
随机森林基于决策树模型,采用自助采样法(bootstrap sampling)从原始数据集中有放回地抽取样本,构建多个决策树。每个决策树都是基于随机选择的特征子集进行划分。最终,随机森林通过对所有决策树的预测结果进行投票或平均来得出最终的预测结果。
特点:
- 随机性:随机森林引入了两个随机性来源,即有放回的自助采样和特征子集的随机选择。这种随机性有助
- 减少模型的方差,并提高模型的泛化能力。
- 高效性:随机森林可以并行构建多个决策树,因此在处理大型数据集时具有较高的效率。
- 鲁棒性:随机森林对于缺失值和不平衡数据具有较好的鲁棒性。
- 可解释性:随机森林可以提供特征的重要性排序,用于特征选择和解释模型的预测结果。
2.适用场景
- 特征维度较高的问题。
- 数据集包含噪声或缺失值。
- 需要处理非线性关系或交互特征的问题。
- 需要进行特征选择或特征重要性排序的问题。
3.算法流程
- 对于每棵决策树:
- 随机从原始数据集中进行有放回的自助采样,生成一个新的训练集。
- 随机选择一部分特征作为该决策树的特征子集。
- 使用训练集和选定的特征子集构建决策树模型。
对于分类问题,通过投票来确定最终的预测类别;对于回归问题,通过平均预测结果来得出最终的预测值。
python实例:使用随机森林模型对鸢尾花数据集进行分类
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建并拟合随机森林分类器
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = rf_model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("准确率:", accuracy)
#输出结果
'''
准确率: 1.0
'''
七、Gradient Boosting(梯度提升)
梯度提升(Gradient Boosting)是一种集成学习方法,通过迭代地训练弱学习器(如决策树)并加权组合它们的预测结果来进行分类和回归任务。
1.原理和特点
原理:
梯度提升通过迭代的方式构建一个强大的预测模型。它从一个简单的模型开始,如单个决策树,然后通过拟合训练数据的残差来逐步改进预测结果。每次迭代中,梯度提升根据残差的负梯度拟合一个新的弱学习器,并使用一个较小的学习率来控制每个模型的贡献。最终,通过将所有弱学习器的预测结果加权组合,得到最终的预测结果。
特点:
- 高准确性:梯度提升通常能够获得较高的预测准确性,特别适用于处理复杂的非线性关系。
- 可以处理多种类型的数据:梯度提升可以处理数值型和类别型特征,以及缺失值。
- 鲁棒性:梯度提升对噪声和异常值具有一定的鲁棒性。
- 特征重要性评估:梯度提升可以提供特征的重要性排序,有助于特征选择和解释模型。
2.适用场景
- 需要高准确性的分类和回归问题。
- 数据集中包含复杂的非线性关系。
- 需要处理多种类型的特征数据。
- 需要进行特征选择或特征重要性评估的问题。
3.算法流程
- 初始化一个模型,如回归树或决策树。
- 对于每次迭代:
- 计算当前模型的残差(预测值与真实值之间的差异)。
- 使用残差拟合一个新的弱学习器(回归树或决策树)。
- 根据学习率和新模型的预测结果,更新总体模型的预测结果。
- 重复上述步骤,直到达到预定的迭代次数或满足其他停止准则。
- 最终,将所有弱学习器的预测结果加权组合得到最终的预测结果。
python实例:使用梯度提升模型对鸢尾花数据集进行分类
from sklearn.datasets import load_iris
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建并拟合梯度提升分类器
gb_model = GradientBoostingClassifier(n_estimators=100, random_state=42)
gb_model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = gb_model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("准确率:", accuracy)
#输出结果:
'''
准确率: 1.0
'''
八、XGBoost(eXtreme Gradient Boosting)
XGBoost(eXtreme Gradient Boosting)是一种梯度提升(Gradient Boosting)算法的变体,它在梯度提升的基础上进行了改进和优化。
1.原理和特点
原理:
XGBoost是一种基于梯度提升的机器学习算法,它通过迭代地训练一组弱学习器(如决策树)并结合它们的预测结果来进行分类和回归任务。XGBoost在梯度提升的基础上引入了正则化和特征子采样等技术,以提高模型的性能和鲁棒性。它采用了一种特殊的优化目标函数,并使用梯度和二阶导数来近似学习过程中的损失函数,从而更高效地进行模型训练。
- 核心公式
损失函数:
Loss
=
∑
i
=
1
n
log
(
y
i
,
y
^
i
)
+
∑
k
=
1
K
Ω
(
f
k
)
\operatorname{Loss}=\sum_{i=1}^{n}\log(y_{i},{\hat{y}}_{i})+\sum_{k=1}^{K}\Omega(f_{k})
Loss=i=1∑nlog(yi,y^i)+k=1∑KΩ(fk)
n是样本容量,K是数的数量yi是真实值,yi^是模型预测值,fk是第k个数,Ω(fk)是树的正则化
加权残差:
r
i
j
=
y
i
−
y
^
i
o
l
d
r_{i j}=y_{i}-{\hat{y}}_{\mathrm{i\,old}}
rij=yi−y^iold
rij是样本在第j个迭代中的残差,yi是真实值,yi^,old是模型之前的预测值
正则化项:
Ω
(
f
k
)
=
γ
T
+
1
2
λ
∑
j
=
1
r
w
j
2
\Omega(f_{k})=\gamma T+\frac{1}{2}\lambda\sum_{j=1}^{r}w_{j}^{2}
Ω(fk)=γT+21λj=1∑rwj2
T是树的叶子节点数量,wj是叶子节点的分数。
特点:
- 高性能:XGBoost具有高效的训练和预测速度,可以处理大规模数据集。
- 鲁棒性:XGBoost对于噪声和异常值具有一定的鲁棒性,能够处理复杂的非线性关系。
- 正则化:XGBoost引入了正则化技术,如L1和L2正则化,以控制模型的复杂度和防止过拟合。
- 特征子采样:XGBoost支持对特征进行子采样,减少模型中的冗余特征,提高泛化能力。
- 可解释性:XGBoost提供了特征重要性评估和模型可视化等功能,有助于理解模型和解释结果。
2.适用场景
- 处理大规模数据集和高维特征的问题。
- 需要高性能和高准确性的分类和回归任务。
- 处理复杂的非线性关系和噪声数据。
- 需要进行特征选择或特征重要性评估的问题。
3.算法流程
- 初始化模型,定义参数,如学习率、树的深度、正则化项等。
- 对于每次迭代:
- 计算当前模型的梯度和二阶导数,用于近似学习过程中的损失函数。
- 根据梯度和二阶导数构建一个新的决策树模型。
- 使用线性搜索或近似算法来选择最佳的划分点和分裂规则。
- 根据学习率和新模型的预测结果,更新总体模型的预测结果。
- 添加正则化项,如L1或L2正则化,以控制模型的复杂度。
- 重复上述步骤,直到达到预定的迭代次数或满足其他停止准则。
- 最终,将所有弱学习器的预测结果加权组合得到最终的预测结果。
python实例:使用XGBoost对鸢尾花数据集进行分类
import xgboost as xgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 将数据集转换为XGBoost的DMatrix格式
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
# 定义XGBoost参数
params = {
'objective': 'multi:softmax',
'num_class': 3,
'max_depth': 3,
'eta': 0.1,
'seed': 42
}
# 训练XGBoost分类器
num_rounds = 100
model = xgb.train(params, dtrain, num_rounds)
# 在测试集上进行预测
y_pred = model.predict(dtest)
# 将预测结果转换为整数类型
y_pred = y_pred.astype(int)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("准确率:", accuracy)
#输出结果:
'''
准确率: 1.0
'''
九、LightGBM
LightGBM是一种基于梯度提升(Gradient Boosting)算法的快速、高性能的机器学习模型。
1.原理和特点
原理:
LightGBM是一种基于梯度提升的决策树算法,它采用了一种称为"基于直方图的决策树"的技术来提高模型的训练和预测效率。在训练过程中,LightGBM使用了一种称为"互斥特征捆绑(Exclusive Feature Bundling)"的技术,将高维稀疏特征组合成稠密特征,以加速训练过程。
- 核心公式
损失函数:
O
b
j
e
c
t
i
v
e
=
∑
i
=
1
n
L
(
y
i
,
y
^
i
)
+
∑
k
=
1
K
Ω
(
f
k
)
{\mathrm{Objective}}=\sum_{i=1}^{n}L(y_{i},{\hat{y}}_{i})+\sum_{k=1}^{K}\Omega(f_{k})
Objective=i=1∑nL(yi,y^i)+k=1∑KΩ(fk)
L是用于拟合数据的损失项,Ω是正则化项
特点:
- 高性能:LightGBM具有出色的训练和预测速度,适用于处理大规模数据集和高维特征的问题。
- 内存效率:LightGBM采用了互斥特征捆绑和直方图算法,减少了内存消耗,使得可以处理较大规模的数据。
- 高准确性:LightGBM通过使用多种优化技术,如直方图算法和特征并行训练,提高了模型的准确性。
- 鲁棒性:LightGBM对于噪声数据和异常值具有一定的鲁棒性,能够处理复杂的非线性关系。
- 可扩展性:LightGBM支持并行训练和分布式计算,可以在多台机器上进行训练和预测。
2.适用场景
- 处理大规模数据集和高维特征的问题。
- 需要高性能和高准确性的分类和回归任务。
- 处理复杂的非线性关系和噪声数据。
- 需要进行特征选择或特征重要性评估的问题。
3.算法流程
- 初始化模型,定义参数,如学习率、树的深度、叶子节点数量等。
- 构建直方图,将连续特征离散化成离散的直方图特征。
- 对于每次迭代:
- 计算当前模型的梯度和二阶导数,用于近似学习过程中的损失函数。
- 根据梯度和二阶导数构建一棵新的决策树模型。
- 使用直方图算法来选择最佳的划分点和分裂规则。
- 根据学习率和新模型的预测结果,更新总体模型的预测结果。
- 添加正则化项,如L1或L2正则化,以控制模型的复杂度。
- 重复上述步骤,直到达到预定的迭代次数或满足其他停止准则。
- 最终,将所有决策树模型的预测结果加权组合得到最终的预测结果。
python实例:使用了LightGBM库进行鸢尾花数据集(Iris dataset)的分类任务。
import lightgbm as lgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载Iris数据集
data = load_iris()
X = data.data
y = data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建LightGBM分类器
clf = lgb.LGBMClassifier()
# 训练模型
clf.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = clf.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
#输出结果:
'''
Accuracy: 1.0
'''
本文相关链接
鸢尾花数据集(Iris - UCI Machine Learning Repository)
california_housing数据集
文章的全部代码放在这里:https://github.com/2214018128zcy/Machine-learning
结束🌟
总之,决策树模型作为一种简单而有效的机器学习方法,在实际应用中具有广泛的应用前景。未来的研究将继续推动决策树模型在以下方面的发展和应用:处理高维数据、处理不平衡数据、与深度学习结合、多任务学习、提高可解释性和可视化等。这些方向的研究将进一步提升决策树模型的性能和应用范围,使其能够更好地应对现实世界中的复杂问题。
同时,随着技术的不断发展,决策树模型的实现和优化算法也将得到改进。例如,改进树的结构、剪枝策略、特征选择方法等,以提高模型的准确性和效率。此外,对于大规模数据和在线学习的需求,决策树模型的增量学习和并行化方法也将成为未来的研究方向。
另外,决策树模型在领域应用上的发展也值得关注。例如,在医疗诊断中,决策树模型可以用于辅助医生进行疾病诊断和治疗决策;在金融领域,决策树模型可以用于信用评分和风险预测等任务。随着对决策树模型的深入研究和理解,它将在更多领域中发挥重要作用。
以后会继续更新相关领域的博客内容,大家可以点点关注!🌟