Pregunta

En encog 3.x, ¿cómo normalizar datos, usarlo para el entrenamiento y denormalizar ¿resultados?

No hay buena documentación sobre esto y un ejemplo simple que aplica cada uno de estos contribuiría en gran medida a reducir la curva de aprendizaje en Encog. Todavía no lo he descubierto todo, pero aquí hay algunos recursos.

(1) *¿Cómo se normaliza Encog 3.0?*

Este código está bien para guardar un nuevo CSV normalizado. Sin embargo, no está claro cómo tomar el analstnormalizeCSV y convertirlo en una mldataSet para usarlo realmente.

EncogAnalyst analyst = new EncogAnalyst();
AnalystWizard wizard = new AnalystWizard(analyst);
wizard.wizard(sourceFile, true, AnalystFileFormat.DECPNT_COMMA);
final AnalystNormalizeCSV norm = new AnalystNormalizeCSV();
norm.analyze(sourceFile, true, CSVFormat.ENGLISH, analyst);
norm.setOutputFormat(CSVFormat.ENGLISH);
norm.setProduceOutputHeaders(true);
norm.normalize(targetFile)

(2) *¿Cómo normalizo un archivo CSV con encog (Java)?*

Este código está, nuevamente, bien para producir una salida CSV normalizada. Pero no está claro cómo tomar los datos normalizados y realmente aplicarlos. Existe un método para establecer el objetivo como MLData, pero supone que todas las columnas son entradas y no deja espacio para ningún ideal. Además, ambas opciones son difíciles de usar cuando el archivo tiene cabezales y/o columnas no utilizadas.

try {
            File rawFile = new File(MYDIR, "iris.csv");

            // download Iris data from UCI
            if (rawFile.exists()) {
                System.out.println("Data already downloaded to: " + rawFile.getPath());
            } else {
                System.out.println("Downloading iris data to: " + rawFile.getPath());
                BotUtil.downloadPage(new URL("http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"), rawFile);
            }

            // define the format of the iris data

            DataNormalization norm = new DataNormalization();
            InputField inputSepalLength, inputSepalWidth, inputPetalLength, inputPetalWidth;
            InputFieldCSVText inputClass;

            norm.addInputField(inputSepalLength = new InputFieldCSV(true, rawFile, 0));
            norm.addInputField(inputSepalWidth = new InputFieldCSV(true, rawFile, 1));
            norm.addInputField(inputPetalLength = new InputFieldCSV(true, rawFile, 2));
            norm.addInputField(inputPetalWidth = new InputFieldCSV(true, rawFile, 3));
            norm.addInputField(inputClass = new InputFieldCSVText(true, rawFile, 4));
            inputClass.addMapping("Iris-setosa");
            inputClass.addMapping("Iris-versicolor");
            inputClass.addMapping("Iris-virginica");

            // define how we should normalize

            norm.addOutputField(new OutputFieldRangeMapped(inputSepalLength, 0, 1));
            norm.addOutputField(new OutputFieldRangeMapped(inputSepalWidth, 0, 1));
            norm.addOutputField(new OutputFieldRangeMapped(inputPetalLength, 0, 1));
            norm.addOutputField(new OutputFieldRangeMapped(inputPetalWidth, 0, 1));
            norm.addOutputField(new OutputOneOf(inputClass, 1, 0));

            // define where the output should go
            File outputFile = new File(MYDIR, "iris_normalized.csv");
            norm.setCSVFormat(CSVFormat.ENGLISH);
            norm.setTarget(new NormalizationStorageCSV(CSVFormat.ENGLISH, outputFile));

            // process
            norm.setReport(new ConsoleStatusReportable());
            norm.process();
            System.out.println("Output written to: " + rawFile.getPath());

        } catch (Exception ex) {
            ex.printStackTrace();
        }

(3) *Denormalizante*

Tengo una pérdida total sobre cómo tomar todo esto y desnormalizar de acuerdo con los MAX y los MIN de tipo de datos apropiados.

¿Fue útil?

Solución

Aquí hay pocos recursos, donde puede obtener información más detallada sobre la normalización y la desnormalización utilizando el marco Encog.

Estos grandes libros electrónicos escritos por el propio Jeff Heaton, 1. Programación de redes neuronales con encog3 en C#, 2ª edición de Heaton, Jeff (2 de octubre de 2011)2. Introducción a redes neuronales para C#, 2ª edición de Jeff Heaton (2 de octubre de 2008) Estos deben tener libros electrónicos para usuarios de Encog.

También puede echar un vistazo al curso pluralsight en "Introducción al aprendizaje automático con encog", esto también incluye pocos ejemplos de normalización y desnormalización.

Ahora, con respecto a sus consultas: "No está claro aquí cómo tomar el AnalystNormalizeCSV y convertirlo en un MlDataSet para usarlo realmente".

Bueno, puede usar AnalystNormalizeCSV para normalizar su archivo de entrenamiento. Y luego puede usar LoadCSV2Memory de la clase Encogutilidad para cargar el archivo de entrenamiento normalizado para obtener el conjunto de datos ML. Aquí hay un código de muestra en C#,

var trainingSet = EncogUtility.LoadCSV2Memory(Config.NormalizedTrainingFile.ToString(), network.InputCount, network.OutputCount,true, CSVFormat.English,false);

Se necesita el archivo de entrenamiento normalizado como primer parámetro, la neuronada de entrada de red cuenta como segundo, el recuento de neuronas de salida de red como tercero, el cuarto parámetro es booleano si tiene encabezado en su archivo CSV, entonces puede mencionar el formato como el quinto parámetro y el sexto lugar El parámetro es para importancia.

Entonces, una vez que tenga este conjunto de datos en la memoria, puede usarlo para capacitación. Se puede adoptar un enfoque similar en el paso de validación y evaluación cruzada también.

Con respecto a la denormalización, primero puede persistir el archivo de analistas, y luego puede usar el archivo de analistas para desnormalizar las columnas individuales también. Por ejemplo :

var denormlizedOutput = analyst.Script.Normalize.NormalizedFields[index].DeNormalize(item.Input[index]);

Se puede utilizar un enfoque similar en los campos de desnormalización para obtener etiquetas de clase también. Por ejemplo

var predictedClass = analyst.Script.Normalize.NormalizedFields[index].Classes[predictedClassInt].Name;

Otros consejos

El analista Encog es fantástico para normalizar los datos. Puede tomar la información almacenada en un archivo CSV y determinar automáticamente los campos normalizados y su tipo de codificación (incluida 1 de n codificación equilibrada).

El único inconveniente de esto es que la lógica está estrechamente combinada con la clase ReadCSV.

Favoreciendo la extensión en lugar de la modificación, decidí crear métodos de extensión y clases alternativas para crear un analista que normalice un conjunto de datos .NET genérico.

También agregué una nueva clase de prueba que le muestra cómo usarla (es muy similar a la implementación estándar de Encog).

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
using Encog.ML.Data.Market;
using Encog.ML.Data.Market.Loader;
using Encog.App.Analyst;
using Encog.App.Analyst.Wizard;
using EncogExtensions.Normalization; //<- This is my extension lib
using System.Data;
using System.Linq;     
[TestMethod]
    public void Normalize_Some_In_Memory_Data()
    {
        // Download some stock data
        List<LoadedMarketData> MarketData = new List<LoadedMarketData>();
        MarketData.AddRange(DownloadStockData("MSFT",TimeSpan.FromDays(10)));
        MarketData.AddRange(DownloadStockData("AAPL", TimeSpan.FromDays(10)));
        MarketData.AddRange(DownloadStockData("YHOO", TimeSpan.FromDays(10)));

        // Convert stock data to dataset using encog-extensions
        DataSet dataSet = new DataSet().Convert(MarketData, "Market DataSet");

        // use encog-extensions to normalize the dataset 
        var analyst = new EncogAnalyst();
        var wizard = new AnalystWizard(analyst);
        wizard.Wizard(dataSet);

        // DataSet Goes In... 2D Double Array Comes Out... 
        var normalizer = new AnalystNormalizeDataSet(analyst);
        var normalizedData = normalizer.Normalize(dataSet);

        // Assert data is not null and differs from original
        Assert.IsNotNull(normalizedData);
        Assert.AreNotEqual(normalizedData[0, 0], dataSet.Tables[0].Rows[0][0]);

    }

    private static List<LoadedMarketData> DownloadStockData(string stockTickerSymbol,TimeSpan timeSpan)
    {
        IList<MarketDataType> dataNeeded = new List<MarketDataType>();
        dataNeeded.Add(MarketDataType.AdjustedClose);
        dataNeeded.Add(MarketDataType.Close);
        dataNeeded.Add(MarketDataType.Open);
        dataNeeded.Add(MarketDataType.High);
        dataNeeded.Add(MarketDataType.Low);
        dataNeeded.Add(MarketDataType.Volume);

        List<LoadedMarketData> MarketData =
            new YahooFinanceLoader().Load(
                new TickerSymbol(stockTickerSymbol),
                dataNeeded,
                DateTime.Now.Subtract(timeSpan),
                DateTime.Now).ToList();

        return MarketData;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top