/* Copyright 2003, Carnegie Mellon, All Rights Reserved */ package edu.cmu.minorthird.classify; import java.io.File; import java.io.Serializable; import java.util.Collections; import java.util.Iterator; import edu.cmu.minorthird.classify.experiments.Expt; import edu.cmu.minorthird.classify.experiments.Tester; import edu.cmu.minorthird.util.IOUtil; import edu.cmu.minorthird.util.gui.ViewerFrame; import edu.cmu.minorthird.util.gui.Visible; /** * Trains a ClassifierLearner using the information in a labeled Dataset. * * @author William Cohen * */ public class DatasetClassifierTeacher extends ClassifierTeacher{ private Dataset dataset; private boolean activeLearning=false; public DatasetClassifierTeacher(Dataset dataset){ this(dataset,false); } /** * @param activeLearning if true, all learning is active - ie nothing is * pushed at the learner, everything must be 'pulled' via queries. * if false, all examples fron the dataset are 'pushed' at the learner * via addExample. */ public DatasetClassifierTeacher(Dataset dataset,boolean activeLearning){ this.dataset=dataset; this.activeLearning=activeLearning; } @Override public ExampleSchema schema(){ return dataset.getSchema(); } @Override public Iterator<Example> examplePool(){ if(activeLearning){ return Collections.<Example>emptySet().iterator(); } else{ return dataset.iterator(); } } @Override public Iterator<Instance> instancePool(){ if(activeLearning){ return Util.toInstanceIterator(dataset.iterator()); }else if(dataset instanceof BasicDataset){ // (Edoardo Airoldi) this itearator is empty whenever there are no // unlabeled examples available for semi-supervised learning. return ((BasicDataset)dataset).iteratorOverUnlabeled(); }else{ return Collections.<Instance>emptySet().iterator(); } } @Override public Example labelInstance(Instance query){ // the label was hidden by just hiding the type if(query instanceof Example) return (Example)query; else return null; } @Override public boolean hasAnswers(){ return activeLearning; } static public void main(String[] argv){ try{ Dataset dataset=Expt.toDataset(argv[0]); ClassifierLearner learner=Expt.toLearner(argv[1]); Classifier c=new DatasetClassifierTeacher(dataset).train(learner); if(c instanceof Visible){ new ViewerFrame("from "+argv[0]+" and "+argv[1],((Visible)c).toGUI()); }else{ System.out.println("Learnt classifier: "+c); } System.out.println("Training error: "+Tester.errorRate(c,dataset)); if(c instanceof BinaryClassifier){ System.out.println("Average log loss: "+ Tester.logLoss(((BinaryClassifier)c),dataset)); } if(argv.length>=3&&(c instanceof Serializable)){ IOUtil.saveSerialized(((Serializable)c),new File(argv[2])); } }catch(Exception e){ e.printStackTrace(); System.out.println("usage: dataset learner [classifierFile]"); } } }