机器学习之决策树
一、决策树定义:
决策树是一种基于树结构的机器学习算法,用于建立一系列的规则来对数据进行分类或预测。
二、决策树特征选择
2.1 特征选择问题
在决策树的构建过程中,特征选择是一个关键的步骤,它决定了每个节点应该选择哪个特征来进行分裂。
2.2 信息增益
信息增益是一种常用的特征选择准则,它衡量了在特征给定的条件下,分类结果的不确定性减少的程度。
2.2.1 熵
熵是信息论中用来表示随机变量不确定性的度量,它的计算公式为:
[H(X) = -\sum_{i=1}^{n} P(x_i) \log_2 P(x_i)]
其中,(P(x_i)) 表示随机变量 (X) 取值为 (x_i) 的概率。
2.2.2 信息增益
信息增益表示在特征 (A) 给定的条件下,分类结果的熵减少的程度,它的计算公式为:
[Gain(A) = H(D) - H(D|A)]
其中,(H(D)) 表示数据集 (D) 的熵,(H(D|A)) 表示在特征 (A) 给定的条件下,数据集 (D) 的条件熵。
三、决策树的生成
决策树的生成是指根据训练数据集生成决策树的过程,常用的算法包括ID3算法和C4.5算法。
3.1 ID3算法
ID3算法是一种基于信息增益准则的决策树生成算法
选择最佳特征:对于当前节点,计算每个特征的信息增益,选择信息增益最大的特征作为节点的分裂特征。
划分数据集:根据选定的特征进行数据集的划分,生成子节点。
递归建树:对于每个子节点,重复步骤1和2,直到满足停止条件(如节点中的样本属于同一类别,或者达到预先设定的树深度)。
生成决策树:递归地建立决策树,直到所有的样本都被正确分类或者满足停止条件。
在实际应用中,ID3算法通常会面临着过拟合的问题,因为它倾向于选择特征取值较多的特征进行分裂,导致决策树过于复杂。为了解决这个问题,C4.5算法对ID3进行了改进,使用信息增益比来代替信息增益,从而更加平衡地选择特征进行分裂。
3.2 C4.5算法
C4.5算法的主要特点和步骤:
信息增益比: C4.5算法使用信息增益比来选择最佳的特征进行节点分裂,而不是像ID3算法那样简单地使用信息增益。信息增益比解决了ID3算法对于特征取值数目较多时的偏好问题,因为它考虑了特征取值数目对信息增益的影响。
处理缺失值: C4.5算法能够处理缺失值,它会根据已知特征值的权重来估计缺失值,而不是简单地将包含缺失值的样本丢弃。
剪枝: C4.5算法引入了剪枝策略,用于减少决策树的复杂度并提高泛化能力,避免过拟合。
连续型特征处理: C4.5算法能够处理连续型特征,它会将连续型特征离散化,然后按照离散化后的取值进行处理。
C4.5算法的基本步骤与ID3算法类似,但在特征选择、处理缺失值和剪枝方面有所不同。它是一种广泛应用于分类问题的经典算法,具有较好的性能和可解释性。
四、决策树的剪枝
决策树的剪枝是为了防止过拟合,常用的剪枝算法包括预剪枝和后剪枝。
4.1 原理
剪枝的原理是通过降低树的复杂度来提高泛化能力,从而减少过拟合的风险。
4.2 算法思路:
预剪枝在决策树构建过程中,在每次进行分裂前先进行判断,若判断结果表明分裂会导致过拟合,则停止分裂。
五、CART算法
CART算法的主要特点和步骤如下:
二叉树结构: CART算法生成的决策树是二叉树结构,每个非叶节点有两个子节点。这使得CART算法的决策树更加简洁和易于理解。
基尼不纯度: 对于分类问题,CART算法使用基尼不纯度来选择最佳的特征进行节点分裂。基尼不纯度衡量了一个集合中的样本被错误分类的概率,因此选择能够最大程度减少基尼不纯度的特征进行分裂。
最优分裂点: 对于连续型特征,CART算法会尝试所有可能的分裂点,选择使得基尼指数最小的分裂点进行分裂。
剪枝: CART算法也支持剪枝操作,用于减少决策树的复杂度并提高泛化能力。
回归树: 对于回归问题,CART算法使用平方误差最小化准则来选择最佳的特征进行节点分裂,并生成回归树。
CART算法在分类和回归问题上都有良好的性能,并且能够处理混合型的特征(既包含连续型特征又包含离散型特征)。由于其简洁的二叉树结构和高效的特征选择方法,CART算法在实际应用中得到了广泛的应用。
CART生成算法包括分类树的生成和回归树的生成。
六、代码
6.1 代码
以下用分类树举例
以下是决策树的简单代码示例:
`#数据准备
from sklearn.datasets import load_breast_cancer
breast_cancer = load_breast_cancer()
分离数据
breast_cancer
x=breast_cancer.data
y=breast_cancer.target
训练数据
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=33,test_size=0.3)
数据标准化
from sklearn.preprocessing import StandardScaler
breast_cancer_ss = StandardScaler()
x_train = breast_cancer_ss.fit_transform(x_train)
x_test = breast_cancer_ss.transform(x_test)
分类树
from sklearn.tree import DecisionTreeClassifier
dtc = DecisionTreeClassifier()
dtc.fit(x_train,y_train)
dtc_y_predict = dtc.predict(x_test)
from sklearn.metrics import classification_report
k=0
j=0
for i in y_test:
if i!=dtc_y_predict[j]:
k=k+1
j=j+1
print(k)
print('预测结果:\n:',dtc_y_predict)
print('真是结果:\n:',y_test)
print('Accuracy:',dtc.score(x_test,y_test))
print(classification_report(y_test,dtc_y_predict,target_names=['benign','malignant']))`
6.2结果

浙公网安备 33010602011771号