数据挖掘分类竞赛

机器算法验证 爪哇 自习 机器学习 分类 威卡
2022-03-26 20:36:34

我目前正在学习数据挖掘课程,对于我们的一个项目,我们需要通过首先在已经提供类标签的训练数据集上构建分类器来预测未知数据集的类标签。

我们只需要获得 80% 的准确率即可在作业中获得满分。我已经使用 J48 决策树算法 (acc=84.08%) 实现了这一点。

还有一场关于谁能获得最高准确性的竞争(由我们看不到的裁判系统决定)。

我有两个问题:

  1. 我如何使用集成方法来做到这一点
  2. 有没有办法优化每个分类器的参数?

 import java.io.*;
 import weka.core.Instances;
 import weka.filters.Filter;
 import weka.filters.unsupervised.attribute.*;
 import weka.classifiers.trees.*;
 import weka.classifiers.Evaluation;

public class CompClassifier {
public static FileOutputStream Output;
public static PrintStream file;

public static void main(String[] args) throws Exception {
    // load training data
    weka.core.Instances training_data = new weka.core.Instances(new       
java.io.FileReader("/Users//Weka/training.arff"));

    //load test data
    weka.core.Instances test_data = new  weka.core.Instances(new 
java.io.FileReader("/Users//Weka/unknown.arff"));

    //Clean up training data
    ReplaceMissingValues replace = new ReplaceMissingValues();
    replace.setInputFormat(training_data);
    Instances training_data_filter1 = Filter.useFilter(training_data, replace); 

    //Normalize training data
    Normalize norm = new Normalize();
    norm.setInputFormat(training_data_filter1);
Instances processed_training_data = Filter.useFilter(training_data_filter1, norm);

    //Set class attribute for pre-processed training data
 processed_training_data.setClassIndex(processed_training_data.numAttributes() - 1);    

    //output to file
Output = new  FileOutputStream("/Users//Desktop/CLASSIFICATION/test.txt");
    file = new PrintStream(Output);

    //build classifier
    J48 tree = new J48();
    tree.buildClassifier(processed_training_data);

    //Clean up test data
    replace.setInputFormat(test_data);
    Instances test_data_filter1 = Filter.useFilter(test_data, replace); 

    //Normalize test data
    norm.setInputFormat(training_data_filter1);
    Instances processed_test_data = Filter.useFilter(test_data_filter1, norm);

    //Set class attribute for pre-processed training data
    processed_test_data.setClassIndex(processed_test_data.numAttributes() - 1);

    //int num_correct=0;
    for (int i = 0; i < processed_test_data.numInstances(); i++) {
        weka.core.Instance currentInst = processed_test_data.instance(i);
        int predictedClass = (int) tree.classifyInstance(currentInst);
        System.out.println(predictedClass);
        file.println("O"+ predictedClass);
    }


}
3个回答

构建集成的一种简单方法是使用随机森林。我相当肯定 weka 有一个随机森林算法,如果其他基于树的模型表现良好,那么值得一试。

您还可以通过训练多个(例如 50 或 100 个)J48 决策树并使用它们对每个对象的分类“投票”来构建自己的集成。例如,如果 60 根tress 说给定观察属于“A”类,而 40 根说它属于“B”类,则您将对象归类为“A”类。

您可以通过在训练数据的随机子样本上训练每棵树来进一步改进这种集成。这称为“装袋”,随机子样本通常是通过替换创建的。

最后,您还可以为每棵树提供训练集中变量的随机子集。这被称为“随机森林”。如果您编写自己的随机森林算法,您的教授可能会印象深刻,但最好使用现有的实现。

模型集成只是其输出组合的模型的集合(希望在此过程中产生卓越的性能)。显然,为了引起任何兴趣,基础模型必须以某种方式发生变化,并且有几种方法可以做到这一点:改变模型类型(树归纳、神经网络、判别函数等),改变模型训练的起始条件(例如前馈神经网络的不同权重初始化),改变使用的观察(通常是整个训练集的随机样本),改变候选输入变量(再次,通常是所有可用的随机样本)等。

有几种方法可以组合基本模型输出。最简单的是平均或投票,尽管这些可能需要一些校准。

您可以尝试名为 ML-Flex (http://mlflex.sourceforge.net) 的新机器学习库。它旨在执行各种集成方法,并且还可以在使用不同的算法参数时提供并排比较(尽管可能不完全符合您的要求)。如果您有兴趣,请尝试一下并提供您可能有的任何反馈。完全披露:我是这个包的作者。