/***********************************************************************
This file is part of KEEL-software, the Data Mining tool for regression,
classification, clustering, pattern mining and so on.
Copyright (C) 2004-2010
F. Herrera (herrera@decsai.ugr.es)
L. S�nchez (luciano@uniovi.es)
J. Alcal�-Fdez (jalcala@decsai.ugr.es)
S. Garc�a (sglopez@ujaen.es)
A. Fern�ndez (alberto.fernandez@ujaen.es)
J. Luengo (julianlm@decsai.ugr.es)
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 keel.Algorithms.Neural_Networks.IRPropPlus_Regr;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import keel.Algorithms.Neural_Networks.NNEP_Common.data.DoubleTransposedDataSet;
import keel.Algorithms.Neural_Networks.NNEP_Common.data.IAttribute;
import keel.Algorithms.Neural_Networks.NNEP_Common.neuralnet.INeuralNet;
import keel.Algorithms.Neural_Networks.NNEP_Common.problem.ProblemEvaluator;
import keel.Algorithms.Neural_Networks.NNEP_Regr.problem.errorfunctions.MSEErrorFunction;
import keel.Algorithms.Neural_Networks.NNEP_Regr.problem.errorfunctions.SEPErrorFunction;
import keel.Algorithms.Neural_Networks.NNEP_Regr.problem.regression.IRegressor;
import keel.Algorithms.Neural_Networks.NNEP_Regr.problem.regression.RegressionProblemEvaluator;
import net.sf.jclec.IEvaluator;
import net.sf.jclec.base.AbstractIndividual;
/**
* <p>
* @author Written by Pedro Antonio Gutierrez Penia (University of Cordoba) 23/11/2007
* @version 0.1
* @since JDK1.5
* </p>
*/
public class IRPropPlusReporterRegr {
/**
* <p>
* Reporter for iRProp+ algorithm for regression
* </p>
*/
/////////////////////////////////////////////////////////////////
// --------------------------------------- Serialization constant
/////////////////////////////////////////////////////////////////
/**
* Generated by Eclipse
*/
private static final long serialVersionUID = 873929825900558241L;
/////////////////////////////////////////////////////////////////
// --------------------------------------------------- Properties
/////////////////////////////////////////////////////////////////
/** MSE Error function */
private MSEErrorFunction mseErrorFunction = new MSEErrorFunction();
/** SEP Error function */
private SEPErrorFunction sepErrorFunction = new SEPErrorFunction();
/** KEEL headers of output files */
private String header;
/** Train result file */
private String trainResultFile;
/** Test result file */
private String testResultFile;
/** Best model result file */
private String bestModelResultFile;
/** Metadata information of output attribute for generating output files */
private IAttribute outputAttribute;
/////////////////////////////////////////////////////////////////
// -------------------------------------------------- Constructor
/////////////////////////////////////////////////////////////////
/**
* <p>
* Empty constructor
* </p>
*/
public IRPropPlusReporterRegr() {
super();
}
/////////////////////////////////////////////////////////////////
// ------------------------------- Getting and setting properties
/////////////////////////////////////////////////////////////////
/**
* <p>
* Returns file name where the best model obtained will be written
*
* @return String File name
* </p>
*/
public String getBestModelResultFile() {
return bestModelResultFile;
}
/**
* <p>
* Sets file name where the best model obtained will be written
*
* @param bestModelResultFile File name
* </p>
*/
public void setBestModelResultFile(String bestModelResultFile) {
this.bestModelResultFile = bestModelResultFile;
}
/**
* <p>
* Returns file name where the testing results of best model
* obtained will be written
*
* @return String File name
* </p>
*/
public String getTestResultFile() {
return testResultFile;
}
/**
* <p>
* Sets file name where the testing results of best model
* obtained will be written
*
* @param testResultFile File name
* </p>
*/
public void setTestResultFile(String testResultFile) {
this.testResultFile = testResultFile;
}
/**
* <p>
* Returns file name where the training results of best model
* obtained will be written
*
* @return String File name
* </p>
*/
public String getTrainResultFile() {
return trainResultFile;
}
/**
* <p>
* Sets file name where the testing results of best model
* obtained will be written
*
* @param trainResultFile File name
* </p>
*/
public void setTrainResultFile(String trainResultFile) {
this.trainResultFile = trainResultFile;
}
/**
* <p>
* Returns KEEL file header
*
* @return String KEEL file header
* </p>
*/
public String getHeader() {
return header;
}
/**
* <p>
* Sets KEEL file header
*
* @param header KEEL file header
* </p>
*/
public void setHeader(String header) {
this.header = header;
}
/**
* <p>
* Returns output attribute metadata
*
* @return IAttribute Output attribute metadata
* </p>
*/
public IAttribute getOutputAttribute() {
return outputAttribute;
}
/**
* <p>
* Sets output attribute metadata
*
* @param outputAttribute New output attribute metadata
* </p>
*/
public void setOutputAttribute(IAttribute outputAttribute) {
this.outputAttribute = outputAttribute;
}
/////////////////////////////////////////////////////////////////
// ----------------------------------------------- Public Methods
/////////////////////////////////////////////////////////////////
/**
* <p>
* This method is called when the algorithm has finished its execution.
*
* @param resultIndividual Final resulting individual of iRProp+ algorithm.
* @param evaluator Evaluator used to obtain errors.
* </p>
*/
@SuppressWarnings("unchecked")
public void algorithmFinished(AbstractIndividual<INeuralNet> resultIndividual, ProblemEvaluator evaluator) {
try
{
PrintWriter print = new PrintWriter( new FileWriter ( trainResultFile ) );
print.write(header);
DoubleTransposedDataSet dataset = evaluator.getTrainData();
double[] observedOutput = evaluator.getUnscaledTrainData().getAllOutputs()[0];
IRegressor bestRegressor = (IRegressor) resultIndividual.getGenotype();
double[] predictedOutput = bestRegressor.operate(dataset.getAllInputs());
// Unscale the outputs
evaluator.getNormalizer().scale(predictedOutput, evaluator.getOutputInterval().getRight(), evaluator.getOutputInterval().getLeft(),
evaluator.getUnscaledMax()[dataset.getNofinputs()], evaluator.getUnscaledMin()[dataset.getNofinputs()]);
// Print train results
for(int i=0; i<dataset.getNofobservations(); i++){
print.write(outputAttribute.show(observedOutput[i]) + " ");
print.write(outputAttribute.show(predictedOutput[i]) + "\n");
}
print.close();
// Print test results
print = new PrintWriter( new FileWriter ( testResultFile ) );
print.write(header);
dataset = evaluator.getTestData();
observedOutput = evaluator.getUnscaledTestData().getAllOutputs()[0];
predictedOutput = bestRegressor.operate(dataset.getAllInputs());
// Unscale the outputs
evaluator.getNormalizer().scale(predictedOutput, evaluator.getOutputInterval().getRight(), evaluator.getOutputInterval().getLeft(),
evaluator.getUnscaledMax()[dataset.getNofinputs()], evaluator.getUnscaledMin()[dataset.getNofinputs()]);
for(int i=0; i<dataset.getNofobservations(); i++){
print.write(outputAttribute.show(observedOutput[i]) + " ");
print.write(outputAttribute.show(predictedOutput[i]) + "\n");
}
print.close();
// Print test results
print = new PrintWriter( new FileWriter ( bestModelResultFile ) );
print.write(renderNeuralNetIndividual(resultIndividual, evaluator));
print.close();
}
catch ( IOException e )
{
System.err.println( "Can not open the training output file: " + e.getMessage() );
}
}
/**
* <p>
* Renders a NeuralNetIndividual to a String
*
* @param nnind IGenotype<INeuralNet> to render
* @param evaluator NeuralNetEvaluator to use in individual evaluation
*
* @return String String with the render of a NeuralNetIndividual
* </p>
*/
@SuppressWarnings("unchecked")
public String renderNeuralNetIndividual(AbstractIndividual<INeuralNet> nnind, IEvaluator evaluator){
String result = nnind.toString();
result+="\n";
result+=("Number of hidden neurons: " + nnind.getGenotype().getNofhneurons());
result+=(" Number of effective links: "+ nnind.getGenotype().getNoflinks() + "\n");
IRegressor regressor = (IRegressor) nnind.getGenotype();
result+=("Train MSE: " + ((RegressionProblemEvaluator)evaluator).getTrainRegressionError( regressor, mseErrorFunction) + "\n");
result+=("Test MSE: " + ((RegressionProblemEvaluator)evaluator).getTestRegressionError( regressor, mseErrorFunction) + "\n");
result+=("Train SEP: " + ((RegressionProblemEvaluator)evaluator).getTrainRegressionError( regressor, sepErrorFunction) + "\n");
result+=("Test SEP: " + ((RegressionProblemEvaluator)evaluator).getTestRegressionError( regressor, sepErrorFunction) + "\n");
return result;
}
}