de.fub.maps.project.detector.model.inference.impl.J48InferenceModel.java Source code

Java tutorial

Introduction

Here is the source code for de.fub.maps.project.detector.model.inference.impl.J48InferenceModel.java

Source

/*
 * Copyright (C) 2013 Serdar
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package de.fub.maps.project.detector.model.inference.impl;

import de.fub.maps.project.detector.model.inference.AbstractInferenceModel;
import de.fub.maps.project.detector.model.xmls.InferenceModelDescriptor;
import de.fub.maps.project.detector.model.xmls.Property;
import de.fub.maps.project.detector.model.xmls.Section;
import de.fub.maps.project.detector.utils.DetectorUtils;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JToolBar;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle;
import org.openide.util.lookup.ServiceProvider;
import weka.classifiers.Classifier;
import weka.classifiers.trees.J48;

/**
 *
 * @author Serdar
 */
@NbBundle.Messages({ "CLT_J48InferenceModel_Name=J48 Inference Model",
        "CLT_J48InferenceModel_Description=Inference Model which uses a J48 classifier that generates an unpruned or a pruned C4.5 decision tree." })
@ServiceProvider(service = AbstractInferenceModel.class)
public class J48InferenceModel extends AbstractInferenceModel {

    private static final Logger LOG = Logger.getLogger(J48InferenceModel.class.getName());
    protected static final String PROPERTY_UNPRUNED = "j48.unpruned";
    protected static final String PROPERTY_CONFIDENCE = "j48.confidence";
    protected static final String PROPERTY_MINIMUM_INSTANCES = "j48.minimum.instances.per.leaf";
    protected static final String PROPERTY_REDUCED_ERROR_PRUNING = "j48.reduced.error.pruning";
    protected static final String PROPERTY_FOLDS = "j48.folds";
    protected static final String PROPERTY_BINARY_SPLITS = "j48.binary.splits";
    protected static final String PROPERTY_NO_SUBTREE_RAISING = "j48.no.subtree.raising";
    protected static final String PROPERTY_NO_CLEAN_UP = "j48.no.clean.up";
    protected static final String PROPERTY_SEED = "j48.seed";
    private JToolBar toolbar = null;
    private J48 classifierJ48 = null;

    public J48InferenceModel() {
    }

    private void initToolBar() {
        toolbar.setFloatable(false);
        toolbar.add(new JButton(new ShowGraphAction(J48InferenceModel.this)));
    }

    @Override
    public JToolBar getToolbarRepresenter() {
        if (toolbar == null) {
            toolbar = new JToolBar();
            initToolBar();
        }
        return toolbar;
    }

    @Override
    protected final synchronized Classifier createClassifier() {
        classifierJ48 = new J48();
        configureClassifier();
        return classifierJ48;
    }

    protected void configureClassifier() {
        InferenceModelDescriptor inferenceModelDescriptor = getInferenceModelDescriptor();
        if (inferenceModelDescriptor != null) {
            for (Section propertySection : inferenceModelDescriptor.getPropertySection().getSectionList()) {
                if (OPTIONS_PROPERTY_SECTION.equals(propertySection.getId())) {
                    ArrayList<String> optionList = new ArrayList<String>();
                    for (Property property : propertySection.getPropertyList()) {
                        try {
                            if (PROPERTY_BINARY_SPLITS.equals(property.getId())) {
                                boolean splits = Boolean.parseBoolean(property.getValue());
                                if (splits) {
                                    optionList.add("B");
                                }
                            } else if (PROPERTY_CONFIDENCE.equals(property.getId())) {
                                optionList.add(String.format(Locale.ENGLISH, "-C {0}", property.getValue()));
                            } else if (PROPERTY_FOLDS.equals(property.getId())) {
                                optionList.add(MessageFormat.format("-N {0}", property.getValue()));
                            } else if (PROPERTY_MINIMUM_INSTANCES.equals(property.getId())) {
                                optionList.add(MessageFormat.format("-M {0}", property.getValue()));
                            } else if (PROPERTY_NO_CLEAN_UP.equals(property.getId())) {
                                boolean parseBoolean = Boolean.parseBoolean(property.getValue());
                                if (parseBoolean) {
                                    optionList.add("-L");
                                }
                            } else if (PROPERTY_NO_SUBTREE_RAISING.equals(property.getId())) {
                                boolean parseBoolean = Boolean.parseBoolean(property.getValue());
                                if (parseBoolean) {
                                    optionList.add("-S");
                                }
                            } else if (PROPERTY_REDUCED_ERROR_PRUNING.equals(property.getId())) {
                                boolean parseBoolean = Boolean.parseBoolean(property.getValue());
                                if (parseBoolean) {
                                    optionList.add("-R");
                                }
                            } else if (PROPERTY_SEED.equals(property.getId())) {
                                optionList.add(MessageFormat.format("-Q {0}", property.getValue()));
                            } else if (PROPERTY_UNPRUNED.equals(property.getId())) {
                                boolean parseBoolean = Boolean.parseBoolean(property.getValue());
                                if (parseBoolean) {
                                    optionList.add("-U");
                                }
                            }
                        } catch (IllegalArgumentException ex) {
                            LOG.log(Level.FINE, ex.getMessage(), ex);
                        }
                    }
                    try {
                        classifierJ48.setOptions(optionList.toArray(new String[optionList.size()]));
                    } catch (Exception ex) {
                        LOG.log(Level.SEVERE, ex.getMessage(), ex);
                    }
                    break;
                }
            }
        }
    }

    @Override
    public String getName() {
        if (getInferenceModelDescriptor() != null) {
            return getInferenceModelDescriptor().getName();
        }
        return Bundle.CLT_J48InferenceModel_Name();
    }

    @Override
    public String getDescription() {
        if (getInferenceModelDescriptor() != null) {
            return getInferenceModelDescriptor().getDescription();
        }
        return Bundle.CLT_J48InferenceModel_Description();
    }

    @Override
    protected InferenceModelDescriptor createDefaultDescriptor() {
        InferenceModelDescriptor xmlDescriptor = null;
        try {
            xmlDescriptor = DetectorUtils.getXmlDescriptor(InferenceModelDescriptor.class, getClass());
        } catch (IOException ex) {
            Exceptions.printStackTrace(ex);
        }
        return xmlDescriptor;
    }
}