目录
决策树(Decision Tree)是一种常见的机器学习算法,用于分类和回归任务。它通过对数据集进行反复的二分划分,构建一棵树状结构,每个非叶节点代表一个特征属性上的决策,每个叶节点代表一个类别标签或回归值。
ID3(Iterative Dichotomiser 3)算法是由Ross Quinlan在1986年提出的一种决策树构建算法,主要用于数据分类问题。ID3算法基于信息论中的信息增益准则来选择最佳的特征进行决策树的分裂,其目的是在每次划分时,最大程度地减少数据集中的不确定性,或者说,最大化信息增益。
ID3是最早的决策树生成算法之一,其基本思想是通过选择能够最大程度地减少不确定性(或熵)的特征来进行划分。具体步骤如下:
1.选择最优划分特征:计算每个特征的信息增益,选择信息增益最大的特征作为当前节点的划分特征。
2.根据划分特征划分数据集:将数据集按照选定的特征值进行划分,生成相应的子集。
3.递归生成子树:对每个子集递归地应用上述步骤,生成子树。ID3算法存在的问题是对取值较多的特征容易偏向,可能导致生成的树过于复杂,容易过拟合。
1.信息论基础
在深入ID3算法之前,我们需要理解几个信息论中的基本概念:熵(Entropy)、信息增益(Information Gain)和信息增益比(Gain Ratio)。
2.熵(Entropy)
熵是衡量信息不确定性的度量,对于一个数据集D,如果类别分布均匀,则熵越高;反之,若某类别占绝大多数,熵就越低。熵的公式为:
其中,n是类别总数,P(ci)是类别ci在数据集D中出现的概率。
3.信息增益
信息增益表示的是特征划分前后熵的减少量,即通过某一特征划分数据集后,不确定性减少的程度。信息增益越大,说明该特征对分类的贡献越大。信息增益的计算公式为:
其中,H(D∣A)是特征A给定条件下数据集D的条件熵,表示在已知特征A的值后,数据集的不确定性:
这里,V是特征A的取值数目,P(av)是特征A取值av的概率,Dav是特征A取值为av的数据子集。
4.ID3算法原理
ID3算法的主要步骤如下:
1.计算信息增益:对于数据集D中的每个特征,计算其信息增益IG(A)。
2.选择最佳特征:选择信息增益最大的特征作为当前节点的分裂特征。
3.分裂数据集:根据选定的特征将数据集D分成若干子集。
4.递归构建子树:对每个子集重复步骤1至3,直到所有特征的信息增益都很小(接近0),或者子集中所有实例都属于同一类别,或者达到预设的树深度等停止条件。
5.生成叶节点:若子集中的所有实例属于同一类别,则将该子集标记为该类别的叶节点。
5.MATLAB程序
...............................................
for j=SETS
% 对每个分箱运行100次
for i=1:MTKL
% 准备朴素贝叶斯分类器的概率
Nclass.PrepareProbabilities(DH1.Data_Training);
% 朴素贝叶斯分类器识别结果
ResultsNBC = Nclass.Identify(DH1.Data_Testing);
% 计算正确识别的索引
MatResultsTree = cell2mat(ResultsTree);
MatResultsNBC = cell2mat(ResultsNBC);
TreeSuccessIndices = ((MatResultsTree(:, 6) == 1) & (MatResultsTree(:, 5) == 1)) | ((MatResultsTree(:, 6) == 0) & ~(MatResultsTree(:, 5) == 1));
BayesSuccessIndices = ((MatResultsNBC(:,5) == 1) & (MatResultsNBC(:,6) == 1)) | ((MatResultsNBC(:,5) ~= 1) & (MatResultsNBC(:,6) == 0));
% 计算两种方法的成功数量
Ntree = length(TreeSuccessIndices(TreeSuccessIndices~=0));
Nnbc = length(BayesSuccessIndices(BayesSuccessIndices~=0));
% 计算准确度
AccuracyTree = Ntree/75*100;
AccuracyNBC = Nnbc/75*100;
% 存储准确度到向量中
Acc_tree2(i) = AccuracyTree;
Acc_nbc2(i) = AccuracyNBC;
end
% 计算并存储每个分箱的最小、最大、平均准确度
Acc_tree(j/5, Acc_min) = min(Acc_tree2);
Acc_tree(j/5, Acc_max) = max(Acc_tree2);
Acc_tree(j/5, Acc_mean) = mean(Acc_tree2);
Acc_nbc(j/5, Acc_min) = min(Acc_nbc2);
Acc_nbc(j/5, Acc_max) = max(Acc_nbc2);
Acc_nbc(j/5, Acc_mean) = mean(Acc_nbc2);
end
% 绘制决策树的准确度曲线图
hFig1 = figure('Name', '决策树在不同分箱数下的最小/最大/平均准确度(10次运行)');
TreePlotHandle = plot(SETS, Acc_tree(:, Acc_min), '-rs', ...
SETS, Acc_tree(:, Acc_max), '-bs', ...
SETS, Acc_tree(:, Acc_mean), '-gs');
title('决策树在不同分箱数下的最小/最大/平均准确度(10次运行)');
legend({'最小准确度', '最大准确度', '平均准确度'}, 'Position', [0.4, 0.65, 0, 0]);
ylim([60 105]);
ylabel('准确度');
xlabel('分箱数');
% 绘制朴素贝叶斯分类器的准确度曲线图
hFig2 = figure('Name', '朴素贝叶斯分类器在不同分箱数下的最小/最大/平均准确度(10次运行)');
NBCPlotHandle = plot(SETS, Acc_nbc(:, Acc_min), '--ro', ...
SETS, Acc_nbc(:, Acc_max), '--bo', ...
SETS, Acc_nbc(:, Acc_mean), '--go');
title('朴素贝叶斯分类器在不同分箱数下的最小/最大/平均准确度(10次运行)');
legend({'最小准确度', '最大准确度', '平均准确度'}, 'Position', [0.84, 0.65, 0, 0]);
ylim([60 105]);
ylabel('准确度');
xlabel('分箱数');
up4095
6.仿真结果
ID3算法简单直观,尽管ID3算法简单有效,但它也存在一些局限性,如不能处理连续特征、对具有大量可能取值的属性偏好、以及没有考虑数据集的大小对信息增益的影响等。这些问题促使了后续算法如C4.5和CART的发展,这些算法通过引入信息增益比或基尼不纯度等概念,对ID3进行了改进和扩展。