📄 svmlightmodel.java
字号:
/* * YALE - Yet Another Learning Environment * Copyright (C) 2002, 2003 * Simon Fischer, Ralf Klinkenberg, Ingo Mierswa, * Katharina Morik, Oliver Ritthoff * Artificial Intelligence Unit * Computer Science Department * University of Dortmund * 44221 Dortmund, Germany * email: yale@ls8.cs.uni-dortmund.de * web: http://yale.cs.uni-dortmund.de/ * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */package edu.udo.cs.yale.operator.learner;import edu.udo.cs.yale.operator.UserError;import edu.udo.cs.yale.operator.parameter.*;import edu.udo.cs.yale.operator.learner.Model;import edu.udo.cs.yale.example.Attribute;import edu.udo.cs.yale.example.ExampleReader;import edu.udo.cs.yale.example.ExampleSet;import edu.udo.cs.yale.example.Example;import edu.udo.cs.yale.operator.Operator;import edu.udo.cs.yale.operator.OperatorException;import edu.udo.cs.yale.operator.FatalException;import edu.udo.cs.yale.tools.LogService;import edu.udo.cs.yale.tools.TempFileService;import edu.udo.cs.yale.tools.Tools;import edu.udo.cs.yale.tools.Ontology;import edu.udo.cs.yale.tools.ParameterService;import java.io.*;/** A <code>SVMLightModel</code> stores a classification model produced by a * <code>SVMLightLearner</code> and can apply this model to an <code>ExampleSet</code> * in order to label the examples of this example set with their predicted labels. * <p> * For applying a stored SVM<sup><i>light</i></sup> model to an example set, a * <code>SVMLightModel</code> invokes the external * <a TARGET="_top" HREF="http://svmlight.joachims.org/">SVM<i><sup>light</sup></i></a> * program by <a href="http://www.joachims.org/">Thorsten Joachims</a> * [Joachims/1999], an implementation of Vladimir Vapnik's Support Vector Machine (SVM) * learning method from statistical learning theory [Vapnik/1998]. * The SVM<sup><i>light</i></sup> parameters are the same that were previously used by the * <code>SVMLightLearner</code> to learn the model and that are stored in the model. * See the description of the <code>SVMLightLearner</code> for further information. * </p> * * <p><i>Bibliography:</i><br> * <b>[Joachims/1999]</b> * <a href="http://www.joachims.org/">Thorsten Joachims</a>: * <I>Making large-Scale SVM Learning Practical</I>. Chapter 11 in: * Advances in Kernel Methods - Support Vector Learning, * B. Schölkopf and C. Burges and A. Smola (editors), * MIT Press, 1999. <BR> * <a TARGET="_top" HREF="http://www.joachims.org/publications/joachims_99a.ps.gz">[Postscript (gz)]</a> * <a TARGET="_top" HREF="http://www.joachims.org/publications/joachims_99a.pdf">[PDF]</a> * <a TARGET="_top" HREF="http://svmlight.joachims.org/">[SVM<i><sup>light</sup></i>]</a> * <br> * <b>[Vapnik/1998]</b> Vladimir N. Vapnik. * <i>Statistical Learning Theory</i>. Wiley, Chichester, UK, 1998. * <br> * </p> * * @author Ingo Mierswa, Ralf Klinkenberg * @version $Id: SVMLightModel.java,v 2.13 2003/09/03 14:27:27 fischer Exp $ * @see edu.udo.cs.yale.operator.learner.SVMLightLearner * @see edu.udo.cs.yale.example.ExampleSet */public class SVMLightModel extends FileModel { private boolean classificationTask; public SVMLightModel() throws IOException { super(); } public SVMLightModel(File modelFile, boolean classificationTask) throws IOException { super(modelFile); this.classificationTask = classificationTask; } public void writeYaleData(ObjectOutputStream out) throws IOException { out.writeBoolean(classificationTask); } public void readYaleData(ObjectInputStream in) throws IOException { classificationTask = in.readBoolean(); } /** applies the SVM<i><sup>light</sup></i> model to a test set and sets the predicted labels for the examples of this test set. */ public void apply(ExampleSet exampleSet) throws OperatorException { LogService.logMessage("SVMLightModel '"+getName()+"': SVM^light starts predicting labels (" +exampleSet.getSize()+" examples).", LogService.TASK); if (!Ontology.ATTRIBUTE_VALUE_TYPE.isA(exampleSet.getLabel().getValueType(), Ontology.NOMINAL)) { LogService.logMessage("SVMLightModel '"+getName()+"': Example set does not have nominal labels!", LogService.ERROR); } // Prepare output and input files (Yale output = SVM^light input = test examples, // SVM^light output = Yale input = predicted labels for these test examples): File testFile = writeExamples(exampleSet); String command = ParameterService.getProperty("yale.svmlight.applycommand"); File outputFile = TempFileService.createTempFile(getName() + "_labels_"); // Start process: Process process = null; File modelFile = null; try { modelFile = writeModelToTmp(); } catch (IOException e) { TempFileService.deleteTempFile(modelFile); TempFileService.deleteTempFile(outputFile); throw new FatalException("SVMLightModel '"+getName()+"': Cannot create model file.", e); } String completeCommand = command + " " + testFile + " " + modelFile + " " + outputFile; LogService.logMessage("SVMLightModel '"+getName()+"': SVM^light called with command '" + completeCommand + "'", LogService.TASK); try { process = Runtime.getRuntime().exec(completeCommand); } catch (IOException e) { TempFileService.deleteTempFile(modelFile); TempFileService.deleteTempFile(outputFile); throw new FatalException("SVMLightModel '"+getName()+"': " +"Cannot find command for SVMlight!"); } // Read SVM^light output: BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); String output = null; try { output = Tools.readOutput(in); in.close(); } catch (IOException e) { TempFileService.deleteTempFile(modelFile); TempFileService.deleteTempFile(outputFile); throw new FatalException("SVMLightModel '"+getName()+"': "+ "Cannot stop reading from SVMlight", e); } try { Tools.waitForProcess(null, process, "svmlight"); } catch (OperatorException e) { LogService.logMessage("Output of svm_classify:\n"+output, LogService.ERROR); TempFileService.deleteTempFile(modelFile); TempFileService.deleteTempFile(outputFile); throw e; } LogService.logMessage("SVMlightModel '"+getName()+"' has succesfully "+ "predicted labels for the example set.", LogService.TASK); try { setPredictedLabels(exampleSet, outputFile); } catch (IOException e) { throw new UserError(null, 302, new Object[] { outputFile, e.getMessage() }); } finally { TempFileService.deleteTempFile(modelFile); TempFileService.deleteTempFile(outputFile); } } /** Creates the file with examples for the external SVM<i><sup>light</sup></i> process. */ private File writeExamples(ExampleSet exampleSet) throws OperatorException { File testFile = TempFileService.createTempFile(getName() + "_test_data_"); PrintWriter out = null; try { out = new PrintWriter(new FileWriter(testFile)); } catch (IOException e) { throw new FatalException("SVMLightModel '"+getName()+"': Cannot write input " + "file for SVM^light applier!", e); } ExampleReader r = exampleSet.getExampleReader(); int numberOfAttributes = exampleSet.getNumberOfAttributes(); while (r.hasNext()) { Example e = r.next(); out.println(e.getAttributesAsSparseString()); } out.close(); return testFile; } /** iterates all examples and the predicted label file and sets the predicted label of each example. */ private void setPredictedLabels(ExampleSet exampleSet, File labels) throws IOException { BufferedReader reader = null; reader = new BufferedReader(new FileReader(labels));; ExampleReader r = exampleSet.getExampleReader(); String line = ""; while (((line=reader.readLine())!=null) && (r.hasNext())) { double readLabel = Double.NaN; try { readLabel = Double.parseDouble(line); } catch (NumberFormatException e) { LogService.logMessage("SVMLightModel '"+getName()+"': "+ "Read 'NaN' (Not a Number) from SVM^light", LogService.WARNING); } double label; switch (getPredictionType()) { case PREDICT_CLASSIFICATION: if (classificationTask) { label = (readLabel >= 0) ? Attribute.FIRST_CLASS_INDEX : Attribute.FIRST_CLASS_INDEX + 1; } else { label = readLabel; } break; case PREDICT_CONFIDENCE: label = readLabel; break; default: throw new IllegalArgumentException("SVMLightModel '"+getName()+"': Illegal prediction type."); } r.next().setPredictedLabel(label); } } public boolean equals(Object o) { if (!super.equals(o)) return false; SVMLightModel other = (SVMLightModel)o; return this.classificationTask == other.classificationTask; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -