- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(Weka22REPTree源代码分析1
Weka[22] REPTree 源代码分析
作者:Koala++/屈伟
如果你分析完了ID3,还想进一步学习,最好还是先学习REPTree,它没有牵扯到那么
多类,两个类完成了全部的工作,看起来比较清楚,J48虽然有很强的可扩展性,但是初看
起来还是有些费力,REPTree也是我卖算法时(为了买一台运算能力强一点的计算机,我也
不得不赚钱),顺便分析的,但因为我以前介绍过J48了,重复的东西不想再次介绍了,如
果有什么不明白的,就把我两篇写的结合起来看吧。
我们再次从buildClassifier开始。
Random random = new Random(m_Seed);
m_zeroR = null;
if (data.numAttributes() == 1) {
m_zeroR = new ZeroR();
m_zeroR.buildClassifier(data);
return;
}
如果就只有一个属性,也就是类别属性,就用 ZeroR 分类器学习,ZeroR 分类器返回训
练集中出现最多的类别值,已经讲过了 Weka 开发[15]。
// Randomize and stratify
data.randomize(random);
if (data.classAttribute().isNominal()) {
data.stratify(m_NumFolds);
}
randomize 就是把 data 中的数据重排一下,如果类别属性是离散值,那么用 stratify 函
数,stratify 意思是分层,现在把这个函数列出来:
public void stratify(int numFolds) {
if (classAttribute().isNominal()) {
// sort by class
int index = 1;
while (index numInstances()) {
Instance instance1 = instance(index - 1);
for (int j = index; j numInstances(); j++) {
Instance instance2 = instance(j);
if ((instance1.classValue() == instance2.classValue())
|| (instance1.classIsMissing() instance2
.classIsMissing())) {
swap(index, j);
index++;
}
}
index++;
}
stratStep(numFolds);
}
}
上面这两重循环,就是根据类别值进行冒泡。下面有调用了 stratStep 函数:
protected void stratStep(int numFolds) {
FastVector newVec = new FastVector(m_Instances.capacity());
int start = 0, j;
// create stratified batch
while (newVec.size() numInstances()) {
j = start;
while (j numInstances()) {
newVec.addElement(instance(j));
j = j + numFolds;
}
start++;
}
m_Instances = newVec;
}
这里我举一个例子说明:j=0 时,numFolds 为 10 时,newVec 加入的 instance 下标就为
0,10,20…。这样的好处就是我们把各种类别的样本类似平均分布了。
// Split data into training and pruning set
Instances train = null;
Instances prune = null;
if (!m_NoPruning) {
train = data.trainCV(m_NumFolds, 0, random);
prune = data.testCV(m_NumFolds, 0);
} else {
train = data;
}
关于 trainCV 这个就不讲了,就是 crossValidation 的第 0 个训练集作为这次的训练集(train)。
而作为剪枝的数据集 prune 为第 0 个测试集。
// Create array of sorted indices and weights
int[][] sortedIndices = new int[train.numAttr
文档评论(0)