import weka.classifiers.rules.ZeroR; //导入方法依赖的package包/类
/**
* Build the classifier on the supplied data
*
* @param data the training data
* @throws Exception if the classifier could not be built successfully
*/
public void buildClassifier(Instances data) throws Exception {
super.buildClassifier(data);
// can classifier handle the data?
getCapabilities().testWithFail(data);
// remove instances with missing class
Instances newData = new Instances(data);
newData.deleteWithMissingClass();
double sum = 0;
double temp_sum = 0;
// Add the model for the mean first
m_zeroR = new ZeroR();
m_zeroR.buildClassifier(newData);
// only class? -> use only ZeroR model
if (newData.numAttributes() == 1) {
System.err.println(
"Cannot build model (only class attribute present in data!), "
+ "using ZeroR model instead!");
m_SuitableData = false;
return;
}
else {
m_SuitableData = true;
}
newData = residualReplace(newData, m_zeroR, false);
for (int i = 0; i < newData.numInstances(); i++) {
sum += newData.instance(i).weight() *
newData.instance(i).classValue() * newData.instance(i).classValue();
}
if (m_Debug) {
System.err.println("Sum of squared residuals "
+"(predicting the mean) : " + sum);
}
m_NumIterationsPerformed = 0;
do {
temp_sum = sum;
// Build the classifier
m_Classifiers[m_NumIterationsPerformed].buildClassifier(newData);
newData = residualReplace(newData, m_Classifiers[m_NumIterationsPerformed], true);
sum = 0;
for (int i = 0; i < newData.numInstances(); i++) {
sum += newData.instance(i).weight() *
newData.instance(i).classValue() * newData.instance(i).classValue();
}
if (m_Debug) {
System.err.println("Sum of squared residuals : "+sum);
}
m_NumIterationsPerformed++;
} while (((temp_sum - sum) > Utils.SMALL) &&
(m_NumIterationsPerformed < m_Classifiers.length));
}