赞
踩
目录
3.1 ID3算法(Iterative Dichotomiser 3):
3.3 CART(Classification and Regression Trees)算法
sklearn.tree.DecisionTreeClassifier
sklearn.tree.DecisionTreeRegressor
决策树算法(Decision Tree)是一种常用的监督学习算法,用于分类和回归任务。核心思想是将整个数据集按照某种属性进行划分,形成类似于树的结构,每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。
ID3算法(Iterative Dichotomiser 3)是一种决策树学习算法,由Ross Quinlan在1986年提出。该算法的核心思想是使用信息增益(Information Gain)作为选择划分属性的度量标准,从而构建一棵决策树来分类实例。
准备数据集:数据集需要是离散的,并且包含特征和类别标签。
计算信息增益:对于数据集中的每个非类别特征(属性),计算其作为划分属性的信息增益。
选择最佳划分属性:选择信息增益最大的特征作为当前节点的划分属性。
划分数据集:根据选择的最佳划分属性,将数据集划分为若干个子集,每个子集对应该属性的一个可能取值。
递归构建决策树:对每个划分后的子集,重复步骤2至4,直到满足停止条件(如子集的所有实例都属于同一类别,或者没有特征可供划分)。
形成决策树:将递归过程中生成的节点和分支连接起来,形成一棵决策树。
信息增益是衡量一个特征划分数据集能力的指标。假设数据集D有m个类别,第i个类别有个样本,那么数据集D的信息熵(Entropy)定义为:
其中,() 是第i个类别在数据集D中出现的概率。
假设特征A有n个不同的取值(),使用特征A对数据集D进行划分,可以得到n个子集()。使用特征A划分数据集D后的信息熵为:
那么,特征A的信息增益为:
信息增益越大,表示使用特征A划分数据集D后,数据集的纯度提升越大,因此应该选择信息增益最大的特征作为划分属性。
C4.5算法是一种经典的决策树学习算法,由Ross Quinlan在ID3算法的基础上进行改进和扩展。其核心原理是基于信息论的概念,通过计算每个属性的信息增益率(而不是ID3算法中的信息增益),来选择最佳划分属性,并以此构建决策树。
C4.5算法通过递归地选择最佳划分属性来构建决策树。具体步骤如下:
1 选择最佳划分属性
2 划分数据集
3 递归构建子树
4 剪枝
信息增益率
在C4.5算法中,信息增益率被用作选择最佳划分属性的标准。信息增益率考虑了属性值的数量和不同取值对分类效果的影响,从而避免了ID3算法倾向于选择取值较多的属性的问题。
信息增益率的计算公式如下:
其中,Gain(A) 是属性A的信息增益,SplitInfo(A) 是属性A的分裂信息(Split Information)。
信息增益(Gain):表示按照属性A划分数据集前后,信息熵的减少量。它衡量了属性A对于分类任务的重要性。
分裂信息(SplitInfo):表示根据属性A的不同取值对数据集进行划分时所需的信息熵。它用于衡量属性A的取值数量对分类效果的影响。
CART(Classification and Regression Trees)算法原理主要包括分类树的构建和回归树的构建。
CART分类树算法使用基尼系数(Gini Index)作为选择最优特征的标准。基尼系数代表了模型的不纯度,基尼系数越小,不纯度越低,特征越好。CART算法通过递归地将数据集划分为两个子集来构建决策树。
1.计算基尼系数:对于给定的样本集合D,其基尼系数为
其中,K是类别的数量,是样本属于第k个类别的概率。
2.选择最优特征:对于数据集中的每个非类别特征(属性),计算其作为划分属性的基尼系数。选择基尼系数最小的特征作为当前节点的划分属性。
3.划分数据集:根据选定的最优特征及其阈值,将数据集划分为两个子集,并递归地在每个子集上重复步骤2和3,直到满足停止条件(如子集的所有实例都属于同一类别,或者没有特征可供划分)。
4.构建决策树:将递归过程中生成的节点和分支连接起来,形成一棵决策树。
当CART用作回归树时,其目标是通过递归地将数据集划分为两个子集来最小化平方误差。
选择最优特征:对于数据集中的每个特征,计算其作为划分属性的平方误差之和。选择平方误差之和最小的特征作为当前节点的划分属性。
划分数据集:根据选定的最优特征及其阈值,将数据集划分为两个子集,并递归地在每个子集上重复步骤1和2,直到满足停止条件(如子集的平方误差之和小于预定的阈值,或者没有特征可供划分)。
构建决策树:将递归过程中生成的节点和分支连接起来,形成一棵回归树。
在CART算法中,生成的决策树通常是二叉树,即每个节点最多有两个子节点。此外,CART算法还包括剪枝策略,以避免过拟合现象。剪枝策略可以在决策树构建过程中进行(预剪枝),也可以在决策树构建完成后进行(后剪枝)。
决策树的剪枝是避免过拟合现象、提升模型泛化效果的重要手段。剪枝的基本思想是将决策树的某些内部节点或子树剪掉,使得决策树变得更加简单,从而降低过拟合的风险。
在决策树构建过程中进行剪枝,通过设定一些规则,提前停止树的生长。例如,可以设定决策树的深度、当前节点的样本数量阈值、信息增益或信息增益率阈值、测试集准确性提升阈值等。当达到这些阈值时,就停止对当前节点的划分,并将其标记为叶节点。预剪枝方法能有效提升模型性能,并减少训练时间和测试时间,但采用的是贪心本质,存在欠拟合风险。
在决策树构建完成后进行剪枝,从底部向上对内部节点进行考察。如果将某个内部节点替换为叶节点能带来泛化性能的提升,那么就进行替换。后剪枝的具体操作是,先构造一颗完整的决策树,然后自底向上的对非叶节点进行考察。如果将该节点对应的子树替换为叶节点后,能够提升模型的泛化能力,那么就进行替换。
在scikit-learn库中,决策树的剪枝通常是通过设置决策树生成器的参数来实现的,特别是通过max_depth
、min_samples_split
、min_samples_leaf
、min_weight_fraction_leaf
、max_leaf_nodes
等参数来控制树的生长,从而达到剪枝的效果。
max_depth
: 树的最大深度。设置为一个整数,可以防止树过深。min_samples_split
: 分割内部节点所需的最小样本数。设置为一个整数,可以确保节点在进一步分割之前具有足够的样本。min_samples_leaf
: 叶节点所需的最小样本数。设置为一个整数,可以防止树产生过小的叶子节点。min_weight_fraction_leaf
: 叶节点所需的最小加权样本分数的阈值。这用于处理带权重的样本。max_leaf_nodes
: 最大叶子节点数。设置为一个整数,可以直接限制树的叶子节点数量。这些参数可以在构建决策树时通过DecisionTreeClassifier
或DecisionTreeRegressor
类的初始化函数来设置。
另外,scikit-learn也提供了DecisionTreeClassifier.cost_complexity_pruning_path
和DecisionTreeRegressor.cost_complexity_pruning_path
方法,用于计算不同复杂度参数下的剪枝路径,但这通常需要更高级的用户进行手动剪枝。
主要参数:
criterion
: 字符串,可选 'gini' 或 'entropy'(默认='gini')。用于分割特征的准则。'gini' 代表基尼不纯度(即cart算法),'entropy' 代表信息增益(即id3算法)。splitter
: 字符串,可选 'best' 或 'random'(默认='best')。用于在每个节点选择分割的特征的策略。'best' 选择最佳分割,'random' 则随机选择。max_depth
: 整数或None(默认=None)。树的最大深度。如果为None,则树会生长到所有叶子都是纯的或者所有叶子都包含少于min_samples_split的样本。min_samples_split
: 整数或浮点数,在节点分割前所需的最小样本数(默认=2)。min_samples_leaf
: 整数或浮点数,一个叶子节点所需的最小样本数(默认=1)。max_features
: 整数、浮点数、字符串或None(默认=None)。用于在每次分割时考虑的特征的最大数量。random_state
: 整数、RandomState实例或None(默认=None)。控制随机性的参数,用于在特征选择和样本划分时的随机性。主要方法:
fit(X, y)
: 使用输入数据X和标签y来训练模型。predict(X)
: 使用训练好的模型对输入数据X进行预测。score(X, y)
: 返回给定测试数据和标签上的平均准确度。predict_proba(X)
: 对于分类问题,返回每个样本属于每个类别的概率。主要参数(大部分与DecisionTreeClassifier
相同):
criterion
: 字符串,可选 'mse'、'friedman_mse'、'mae'(默认='mse')。用于分割特征的准则。'mse' 代表均方误差,'friedman_mse' 是改进版的均方误差,'mae' 代表平均绝对误差。主要方法(与DecisionTreeClassifier
相同):
fit(X, y)
: 使用输入数据X和目标值y来训练模型。predict(X)
: 使用训练好的模型对输入数据X进行预测。score(X, y)
: 返回给定测试数据和目标值上的R^2得分。- # 导包
- import pandas as pd
- import matplotlib.pyplot as plt
- from sklearn.model_selection import train_test_split
- from sklearn.tree import DecisionTreeClassifier,plot_tree
- from sklearn.metrics import classification_report
-
- # 1.导入数据
- tatan_data = pd.read_csv('data/train.csv')
- print(tatan_data.info())
-
-
- # 2.数据预处理
- x = tatan_data[['Pclass', 'Age', 'Sex']]
- y = tatan_data['Survived']
- x = pd.get_dummies(x)
- print(x.info)
- x.fillna(x['Age'].mean(),inplace=True)
- x_trian,x_test,y_train,y_test = train_test_split(x,y,train_size=0.8,random_state=1)
-
- # 4。模型训练
- dt = DecisionTreeClassifier(criterion='gini')
- dt.fit(x_trian,y_train)
- # 5. 模型评估
- print(dt.score(x_test, y_test))
-
- # 6.模型预测
- y_ptedict = dt.predict(x_test)
- print(classification_report(y_true=y_test, y_pred=y_ptedict))
- # 7。可视化-可视化树结构
- plt.figure(figsize=(30,20))
- plot_tree(dt,filled=True,max_depth= 5,feature_names=['Pclass', 'Age', 'Sex_female', 'Sex_male'],
- class_names=['died', 'survived'])
- plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。