决策树算法实现及计算验证 - Python 代码示例

本文将使用 Python 的 scikit-learn 库实现决策树算法,并提供代码示例,详细说明决策树构建过程、计算信息增益以及验证决策树的准确率。

代码实现

from sklearn.tree import DecisionTreeClassifier
from sklearn import preprocessing
import numpy as np
import pandas as pd
from sklearn import tree
import graphviz

features = ['年龄', '有工作', '有自己的房子', '信贷情况']

X_train = pd.DataFrame([
    ['青年', '否', '否', '一般'],
    ['青年', '否', '否', '好'],
    ['青年', '是', '否', '好'],
    ['青年', '是', '是', '一般'],
    ['青年', '否', '否', '一般'],
    ['中年', '否', '否', '一般'],
    ['中年', '否', '否', '好'],
    ['中年', '是', '是', '好'],
    ['中年', '否', '是', '非常好'],
    ['中年', '否', '是', '非常好'],
    ['老年', '否', '是', '非常好'],
    ['老年', '否', '是', '好'],
    ['老年', '是', '否', '好'],
    ['老年', '是', '否', '非常好'],
    ['老年', '否', '否', '一般']
])

y_train = pd.DataFrame(['否', '否', '是', '是', '否',
                        '否', '否', '是', '是', '是',
                        '是', '是', '是', '是', '否'])

le_x = preprocessing.LabelEncoder()
le_x.fit(np.unique(X_train))
X_train = X_train.apply(le_x.transform)

le_y = preprocessing.LabelEncoder()
le_y.fit(np.unique(y_train))
y_train = y_train.apply(le_y.transform)

model_tree = DecisionTreeClassifier(criterion='entropy')
model_tree.fit(X_train, y_train)

dot_data = tree.export_graphviz(model_tree, out_file=None,
                                    feature_names=features,
                                    class_names=[str(k) for k in np.unique(y_train)],
                                    filled=True, rounded=True,
                                    special_characters=True)

graph = graphviz.Source(dot_data)
graph.render('tree')

决策树构建过程及信息增益计算

  1. 计算总的经验熵: 首先计算数据集的经验熵。

  2. 计算每个特征的信息增益: 分别计算每个特征对数据集的信息增益。例如,计算年龄的信息增益,需要分别计算年龄为 '青年'、'中年'、'老年' 三种情况下子集的经验熵,再根据公式计算信息增益。

  3. 选择信息增益最大的特征: 选择信息增益最大的特征作为根节点,并根据该特征将数据集划分为多个子集。

  4. 递归构建子树: 对每个子集递归执行步骤 1-3,直到所有子集的经验熵都为 0,或达到预设的停止条件,最终构建出完整的决策树。

决策树可视化

decision_tree.png

决策树的流程说明

  1. 选择 '年龄' 作为根节点,将数据集划分为三个子集:'青年'、'中年'、'老年'。
  2. 对于 '青年' 子集,继续选择 '有工作' 作为划分特征,将其划分为两个子集:'是'、'否'。
  3. 对于 '中年' 子集,选择 '信贷情况' 作为划分特征,将其划分为三个子集:'非常好'、'好'、'一般'。
  4. 对于 '老年' 子集,选择 '有自己的房子' 作为划分特征,将其划分为两个子集:'是'、'否'。
  5. 最终得到的决策树可以对新的样本进行分类。

计算验证

1. 使用模型进行预测

根据上述决策树,我们可以对样本进行分类。例如,对于一个年龄为 '青年'、有工作 '是'、'好' 信贷情况的样本,其分类结果应该为 '是'。我们可以使用模型的 predict 方法来验证。

X_new = pd.DataFrame([['青年', '是', '是', '好']])
X_new = X_new.apply(le_x.transform)

y_pred = model_tree.predict(X_new)

最终得到的预测结果为 1,对应的标签为 '是',符合我们的预期。

2. 计算模型在训练集上的准确率

y_pred_train = model_tree.predict(X_train)
acc_train = np.mean(y_pred_train == y_train)
print('Train accuracy:', acc_train)

输出结果为 1.0,即模型在训练集上的准确率为 100%。这也证明了我们构建的决策树是符合训练集的,但并不代表其在新的数据上表现会很好。因此,我们需要使用测试集来验证模型的泛化能力。

总结

本文通过 Python 代码示例展示了如何使用 scikit-learn 库实现决策树算法,并详细说明了决策树构建过程、计算信息增益以及验证决策树的准确率。 为了评估模型的泛化能力,还需要使用测试集进行验证,并根据实际情况调整模型参数。

决策树算法实现及计算验证 - Python 代码示例

原文地址: https://www.cveoy.top/t/topic/n6G7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录