机器学校入门(十三)C4.5 决策树,CART决策树

C4.5 决策树

C4.5 是 Ross Quinlan 在 1993 年提出的,作为 ID3 算法的改进版本。相当于对信息增益进行修正,增加一个惩罚系数。

ID3树的不足:偏向于选择种类多的特征作为分裂依据。(sklearn没有直接内置)

信息增益率

• 信息增益率 = 信息增益 /特征熵 (特征的信息种类多,信息增益大G(D,a),特征熵大IV

• 计算方法

例:

需求:求特征a、b的信息增益率。

• 特征a的信息增益率:

1 信息增益 :

2 IV信息熵:

3 信息增益率:信息增益/信息熵=0.46/0.92=0.5

• 特征b的信息增益率:

1 信息增益:

2 IV信息熵:

3 信息增益率:信息增益/信息熵=1/2.58=0.39

• 结论:特征a的信息增益率大于特征b的信息增益率,根据信息增益率,应该选择特征a作为分裂特征。

CART决策树

Cart模型是一种决策树模型,它即可以用于分类,也可以用于回归。

Cart回归树使用平方误差最小化策略, Cart分类生成树采用的基尼指数最小化策略。

公式:

基尼值Gini(D):从数据集D中随机抽取两个样本,其类别标记不一致的概率。 Gini(D)值越小,数据集D的纯度越高。

基尼指数Gini_index(D):选择使划分后基尼系数最小的属性作为最优化分属性。

注意:

1.信息增益(ID3)、信息增益率值越大(C4.5),则说明优先选择该特征。

2.基尼指数值越小(CART),则说明优先选择该特征。

• 已知:是否拖欠贷款数据。

• 需求:计算各特征的基尼指数,选择最优分裂点

是否有房

有房子的基尼值: 有房子有 1、4、7 共计三个样本,对应:3个no、0个yes

无房子的基尼值:无房子有 2、3、5、6、8、9、10 共七个样本,对应:4个no、3个yes

基尼系数:第一部分样本占了总样本的 3/10、第二部分样本占了总样本的 7/10

婚姻状况

1 计算 {married} 和 {single,divorced} 情况下的基尼指数

• 结婚的基尼值,有 2、4、6、9 共 4 个样本,并且对应目标值全部为 no:

• 不结婚的基尼值,有 1、3、5、7、8、10 共 6 个样本,并且对应 3 个 no,3 个 yes

• 以 married 作为分裂点的基尼指数:

2 计算 {single} | {married,divorced} 情况下基尼指数(单身4,结婚和离婚6, 一个离婚有拖欠)

3 计算 {divorced} | {single,married} 情况下基尼指数(离婚2,结婚和单身8, 两个单身有拖欠)

最终:该特征的基尼值为 0.3,并且预选分裂点为:{married} 和 {single,divorced}

年收入

1 先将数值型属性升序排列,以相邻中间值作为待确定分裂点:

2.计算:

分割点 65

左:60 (no) → N_left=1, yes=0, no=1 → Gini_left = 1 - (0² + 1²) = 0

右:70~220 (6 no + 3 yes) → N_right=9, yes=3, no=6 → Gini_right = 1 - (3/9)² - (6/9)² = 1 - 0.111 - 0.444 = 0.445

加权 Gini = (1/10)*0 + (9/10)*0.445 = 0.4005

分割点 72.5

左:60,70 (2 no) → Gini_left = 0

右:75~220 (5 no + 3 yes) → N_right=8, yes=3, no=5 → Gini_right = 1 - (3/8)² - (5/8)² = 1 - 0.1406 - 0.3906 = 0.4688

加权 Gini = (2/10)*0 + (8/10)*0.4688 = 0.3750

分割点 80

左:60,70,75 (3 no) → Gini_left = 0

右:85~220 (4 no + 3 yes) → N_right=7, yes=3, no=4 → Gini_right = 1 - (3/7)² - (4/7)² = 1 - 0.1837 - 0.3265 = 0.4898

加权 Gini = (3/10)*0 + (7/10)*0.4898 = 0.3429

,,,,,

3 以此类推计算所有分割点的基尼指数,最小的基尼指数为 0.3

第1轮结果

以是否有房作为分裂点的基尼指数为:0.343

以婚姻状况为分裂特征、以 married 作为分裂点的基尼指数为:0.3

以年收入作为分裂特征、以 97.5 作为分裂点的的基尼指数为:0.3

第2轮

1 样本 2、4、6、9 样本的类别都是 no,已经达到最大纯度 所以,该节点不需要再继续分裂。

2 样本 1、3、5、7、8、10 样本中仍然包含 4 个 no,2 个 yes 该节点并未达到要求的纯度,需要继续划分。

3 右子树的数据集变为: 1、3、5、7、8、10,在该数据集中计算 不同特征的基尼指数,选择基尼指数最小的特征继续分裂。

重复上述过程,直到构建完成整个决策树。

三种分类树的对比

代码

python 复制代码
# 1.导入依赖包
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
from sklearn.tree import export_graphviz
import graphviz


def dm01():
    # 2.读数据到内存并预处理
    # 2.1 读取数据
    taitan_df = pd.read_csv("./train.csv")
    print(taitan_df.head(2))  # 查看前2条数据
    print(taitan_df.info)  # 查看特性信息

    # 2.2 数据处理,确定x y
    x = taitan_df[['Pclass', 'Age', 'Sex']].copy()
    y = taitan_df['Survived'].copy()

    # 2.3缺失值处理
    x['Age'].fillna(x['Age'].mean(), inplace=True)
    print('x -->1', x.head(10))

    # 2.4 pclass类别型数据,需要转数值one-hot编码
    x = pd.get_dummies(x)
    print('x -->2', x.head(10))

    # 2.5 数据集划分
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.20, random_state=33)

    # 3.训练模型,实例化决策树模型
    estimator = DecisionTreeClassifier()
    estimator.fit(x_train, y_train)

    # 4.模型预测
    y_pred = estimator.predict(x_test)

    # 5.模型评估
    # 5.1 输出预测准确率
    myret = estimator.score(x_test, y_test)
    print('myret-->\n', myret)
    # 5.2 更加详细的分类性能
    myreport = classification_report(y_pred, y_test, target_names=['died', 'survived'])
    print('myreport-->\n', myreport)
    # 5.3 决策树可视化
    plt.figure(figsize=(50, 25))  # 设置图形大小
    plot_tree(
        estimator,
        max_depth=10,
        filled=True,
        feature_names=['Pclass', 'Age', 'Sex_female', 'Sex_male'],
        class_names=['died', 'survived'],
        fontsize=8,  # 增加字体大小
        rounded=True,  # 添加圆角,使图形更美观
    )
    plt.tight_layout()
    plt.savefig('tree_full.png', dpi=300, bbox_inches='tight')
    # plt.show()


dm01()

执行结果

python 复制代码
   PassengerId  Survived  Pclass                                               Name     Sex   Age  SibSp  Parch     Ticket     Fare Cabin Embarked
0            1         0       3                            Braund, Mr. Owen Harris    male  22.0      1      0  A/5 21171   7.2500   NaN        S
1            2         1       1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1      0   PC 17599  71.2833   C85        C
<bound method DataFrame.info of      PassengerId  Survived  Pclass                                               Name     Sex   Age  SibSp  Parch            Ticket     Fare Cabin Embarked
0              1         0       3                            Braund, Mr. Owen Harris    male  22.0      1      0         A/5 21171   7.2500   NaN        S
1              2         1       1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1      0          PC 17599  71.2833   C85        C
2              3         1       3                             Heikkinen, Miss. Laina  female  26.0      0      0  STON/O2. 3101282   7.9250   NaN        S
3              4         1       1       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1      0            113803  53.1000  C123        S
4              5         0       3                           Allen, Mr. William Henry    male  35.0      0      0            373450   8.0500   NaN        S
..           ...       ...     ...                                                ...     ...   ...    ...    ...               ...      ...   ...      ...
886          887         0       2                              Montvila, Rev. Juozas    male  27.0      0      0            211536  13.0000   NaN        S
887          888         1       1                       Graham, Miss. Margaret Edith  female  19.0      0      0            112053  30.0000   B42        S
888          889         0       3           Johnston, Miss. Catherine Helen "Carrie"  female   NaN      1      2        W./C. 6607  23.4500   NaN        S
889          890         1       1                              Behr, Mr. Karl Howell    male  26.0      0      0            111369  30.0000  C148        C
890          891         0       3                                Dooley, Mr. Patrick    male  32.0      0      0            370376   7.7500   NaN        Q

[891 rows x 12 columns]>
x -->1    Pclass        Age     Sex
0       3  22.000000    male
1       1  38.000000  female
2       3  26.000000  female
3       1  35.000000  female
4       3  35.000000    male
5       3  29.699118    male
6       1  54.000000    male
7       3   2.000000    male
8       3  27.000000  female
9       2  14.000000  female
x -->2    Pclass        Age  Sex_female  Sex_male
0       3  22.000000       False      True
1       1  38.000000        True     False
2       3  26.000000        True     False
3       1  35.000000        True     False
4       3  35.000000       False      True
5       3  29.699118       False      True
6       1  54.000000       False      True
7       3   2.000000       False      True
8       3  27.000000        True     False
9       2  14.000000        True     False
myret-->
 0.8491620111731844
myreport-->
               precision    recall  f1-score   support

        died       0.93      0.84      0.88       118
    survived       0.74      0.87      0.80        61

    accuracy                           0.85       179
   macro avg       0.83      0.85      0.84       179
weighted avg       0.86      0.85      0.85       179
相关推荐
I_LPL14 分钟前
hot100 栈专题
算法·
2401_8795034126 分钟前
C++中的观察者模式变体
开发语言·c++·算法
阿贵---1 小时前
C++中的备忘录模式
开发语言·c++·算法
setmoon2141 小时前
C++中的观察者模式实战
开发语言·c++·算法
2403_835568471 小时前
C++代码规范化工具
开发语言·c++·算法
tankeven1 小时前
HJ138 在树上游玩
c++·算法
lihihi2 小时前
P1209 [USACO1.3] 修理牛棚 Barn Repair
算法
weixin_387534222 小时前
Ownership - Rust Hardcore Head to Toe
开发语言·后端·算法·rust
庞轩px2 小时前
MinorGC的完整流程与复制算法深度解析
java·jvm·算法·性能优化
Queenie_Charlie2 小时前
Manacher算法
c++·算法·manacher