原本想一次性写完关于J48,无奈整个weka关于J48的一套东西太多太多。
先从split开始分析~J48是参考的C4.5的决策树算法。
这一个部分和ID3有一些的区别,第一:C4.5使用信息增益率来选特征,第二:C4.5可以同时处理连续和离散的属性.(剪枝后面会加)
所以先看看weka的J48中,分裂是如何实现的。
BinC45Split
BuildClassify:
public void buildClassifier(Instances trainInstances)
throws Exception {
// Initialize the remaining instance variables.
m_numSubsets = 0;
m_splitPoint = Double.MAX_VALUE;
m_infoGain = 0;
m_gainRatio = 0;
// Different treatment for enumerated and numeric
// attributes.
if (trainInstances.attribute(m_attIndex).isNominal()){
handleEnumeratedAttribute(trainInstances);
}else{
trainInstances.sort(trainInstances.attribute(m_attIndex));
handleNumericAttribute(trainInstances);
}
}
m_attIndex就是选择的分裂属性的下标。 下面的if判断该属性值如果是离散(Nominal)的,那么调用handleEnumeratedAttribute,如果是连续的(numeric),那么调用handleNumericAttribute。
handleEnumeratedAttribute:
private void handleEnumeratedAttribute(Instances trainInstances)
throws Exception {
Distribution newDistribution,secondDistribution;
int numAttValues; //m_attIndex对应属性的取值个数
double currIG,currGR;
Instance instance;
int i;
numAttValues = tra