Matlab:递归获取决策树
Posted
技术标签:
【中文标题】Matlab:递归获取决策树【英文标题】:Matlab: Recursion to get decision tree 【发布时间】:2012-10-18 08:39:27 【问题描述】:我正在尝试使用递归实现决策树:到目前为止,我已经编写了以下内容:
-
从给定的数据集中,找到最佳拆分并返回分支,为了提供更多详细信息,假设我的数据具有矩阵列的特征,最后一列表示数据 1、-1 的类别。
基于 1。我有一个最佳特征与该拆分下的分支一起拆分,假设基于信息增益,我得到特征 9 是最佳拆分,特征 9 1,3,5 中的唯一值是9的分支
我已经想出了如何获取与每个分支相关的数据,然后我需要遍历每个分支的数据以获得下一组拆分。我在计算这种递归时遇到了麻烦。
这是我到目前为止的代码,我现在正在做的递归看起来不正确:我该如何解决这个问题?
function [indeces_of_node, best_split] = split_node(X_train, Y_train)
%cell to save split information
feature_to_split_cell = cell(size(X_train,2)-1,4);
%iterate over features
for feature_idx=1:(size(X_train,2) - 1)
%get current feature
curr_X_feature = X_train(:,feature_idx);
%identify the unique values
unique_values_in_feature = unique(curr_X_feature);
H = get_entropy(Y_train); %This is actually H(X) in slides
%temp entropy holder
%Storage for feature element's class
element_class = zeros(size(unique_values_in_feature,1),2);
%conditional probability H(X|y)
H_cond = zeros(size(unique_values_in_feature,1),1);
for aUnique=1:size(unique_values_in_feature,1)
match = curr_X_feature(:,1)==unique_values_in_feature(aUnique);
mat = Y_train(match);
majority_class = mode(mat);
element_class(aUnique,1) = unique_values_in_feature(aUnique);
element_class(aUnique,2) = majority_class;
H_cond(aUnique,1) = (length(mat)/size((curr_X_feature),1)) * get_entropy(mat);
end
%Getting the information gain
IG = H - sum(H_cond);
%Storing the IG of features
feature_to_split_cellfeature_idx, 1 = feature_idx;
feature_to_split_cellfeature_idx, 2 = max(IG);
feature_to_split_cellfeature_idx, 3 = unique_values_in_feature;
feature_to_split_cellfeature_idx, 4 = element_class;
end
%set feature to split zero for every fold
feature_to_split = 0;
%getting the max IG of the fold
max_IG_of_fold = max([feature_to_split_cell:,2:2]);
%vector to store values in the best feature
values_of_best_feature = zeros(size(15,1));
%Iterating over cell to get get the index and the values under best
%splited feature.
for i=1:length(feature_to_split_cell)
if (max_IG_of_fold == feature_to_split_celli,2);
feature_to_split = i;
values_of_best_feature = feature_to_split_celli,4;
end
end
display(feature_to_split)
display(values_of_best_feature(:,1)')
curr_X_feature = X_train(:,feature_to_split);
best_split = feature_to_split
indeces_of_node = unique(curr_X_feature)
%testing
for k = 1 : length(values_of_best_feature)
% Condition to stop the recursion, if clases are pure then we are
% done splitting, if both classes have save number of attributes
% then we are done splitting.
if (sum(values_of_best_feature(:,2) == -1) ~= sum(values_of_best_feature(:,2) == 1))
if((sum(values_of_best_feature(:,2) == -1) ~= 0) || (sum(values_of_best_feature(:,2) == 1) ~= 0))
mat1 = X_train(X_train(:,5)== values_of_best_feature(k),:);
[indeces_of_node, best_split] = split_node(mat1, Y_train);
end
end
end
end
这是我的代码:在我的递归中看起来像一些我只深入一个分支,之后我再也不会回到其他分支
feature_to_split =
5
ans =
1 2 3 4 5 6 7 8 9
feature_to_split =
9
ans =
3 5 7 8 11
feature_to_split =
21
feature_to_split =
21
feature_to_split =
21
feature_to_split =
21
如果您有兴趣运行此代码:git
【问题讨论】:
你说“看起来不太对劲”,具体遇到什么问题?也许您可以提供一个输出样本并将其与预期输出进行比较? How to Convert to Recursive decision tree classifier的可能重复 请不要粘贴重复的问题 @slayton 您要求关闭另一个问题,所以我清除了问题并放置了步骤并再次询问。如果您不想通过回答问题来帮助某人,请让其他人帮助。这是社区论坛的目标是找到某人无法解决的问题的答案。人们通过回答问题来帮助社区。人们离开论坛只是因为这样的事情。 @Null-Hypothesis *** 不是消息论坛。它是一个问答网站。重复的问题总是被关闭,即使它们是由不同的作者发布的。如果你觉得你的旧问题很糟糕并且没有得到答案,你应该编辑你的旧问题。如果您认为有必要提出一个新问题,那么请务必发布一个新问题,但要么删除旧问题,要么解释为什么您认为值得提出一个新问题。 SO 社区(不仅仅是我)认为重新提出关于 SO 的问题是非常糟糕的形式 【参考方案1】:经过多轮调试,我想出了答案,希望有人能从中受益:
for k = 1 : length(values_of_best_feature)
% Condition to stop the recursion, if clases are pure then we are
% done splitting, if both classes have save number of attributes
% then we are done splitting.
if((sum(values_of_best_feature(:,2) == -1) ~= 0) || (sum(values_of_best_feature(:,2) == 1) ~= 0))
X_train(:,feature_to_split) = [];
mat1 = X_train(X_train(:,5)== values_of_best_feature(k),:);
%if(level >= curr_level)
split_node(mat1, Y_train, 1, 2, level-1);
%end
end
end
return;
【讨论】:
以上是关于Matlab:递归获取决策树的主要内容,如果未能解决你的问题,请参考以下文章
决策树ID3,C4.5,CART算法中某一属性分类后,是不是能运用该属性继续分类
Matlab基于决策树算法实现多分类预测(源码可直接替换数据)