决策树算法实现及计算验证 - Python 代码示例
决策树算法实现及计算验证 - 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-3,直到所有子集的经验熵都为 0,或达到预设的停止条件,最终构建出完整的决策树。
决策树可视化

决策树的流程说明
- 选择 '年龄' 作为根节点,将数据集划分为三个子集:'青年'、'中年'、'老年'。
- 对于 '青年' 子集,继续选择 '有工作' 作为划分特征,将其划分为两个子集:'是'、'否'。
- 对于 '中年' 子集,选择 '信贷情况' 作为划分特征,将其划分为三个子集:'非常好'、'好'、'一般'。
- 对于 '老年' 子集,选择 '有自己的房子' 作为划分特征,将其划分为两个子集:'是'、'否'。
- 最终得到的决策树可以对新的样本进行分类。
计算验证
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 库实现决策树算法,并详细说明了决策树构建过程、计算信息增益以及验证决策树的准确率。 为了评估模型的泛化能力,还需要使用测试集进行验证,并根据实际情况调整模型参数。
原文地址: https://www.cveoy.top/t/topic/n6G7 著作权归作者所有。请勿转载和采集!