Question

Dans Encog 3.x, comment faites-vous normaliser Les données, utilise le pour la formation, et dénormaliser résultats?

Il n'y a pas de bonne documentation à ce sujet et un exemple simple qui applique que chacun d'eux contribuerait grandement à réduire la courbe d'apprentissage sur Encog. Je n'ai pas encore tout compris, mais voici quelques ressources.

(1) *Comment Encog 3.0 se normalise-t-il?*

Ce code est OK pour enregistrer un nouveau CSV normalisé. Il n'est pas clair ici, mais comment prendre l'analystnormalizecsv et le convertir en mldataset pour l'utiliser réellement.

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) *Comment puis-je normaliser un fichier CSV avec Encog (Java)*

Ce code est, encore une fois, OK pour produire une sortie CSV normalisée. Mais on ne sait pas comment prendre les données normalisées et l'appliquer réellement. Il existe une méthode pour définir la cible en tant que mldata, mais elle suppose que toutes les colonnes sont des entrées et ne laissent pas de la place pour les idéaux. De plus, ces deux options sont difficiles à utiliser lorsque le fichier a têtes et / ou colonnes inutilisées.

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) *Dénormalisant*

Je suis à perte totale pour prendre tout cela et dénormaliser en fonction des Max et Min de type de données appropriés.

Était-ce utile?

La solution

Voici peu de ressources, où vous pouvez obtenir des informations plus détaillées sur la normalisation et la dénormalisation à l'aide d'Encog Framework.

Ces grands livres électroniques écrits par Jeff Heaton lui-même, 1. Programmation des réseaux de neurones avec Encog3 dans C #, 2e édition par Heaton, Jeff (2 octobre 2011)2.Introduction aux réseaux de neurones pour C #, 2e édition par Jeff Heaton (2 octobre 2008) Ce sont des livres électroniques pour les utilisateurs d'Encog.

Vous pouvez également jeter un œil à Pluralsight Course sur "Introduction à l'apprentissage automatique avec Encog", cela comprend également peu d'exemples de normalisation et de dénormalisation.

Maintenant en ce qui concerne vos requêtes: "Il n'est pas clair ici, mais comment prendre l'analystnormalizecsv et le convertir en mldataset pour l'utiliser."

Eh bien, vous pouvez utiliser AnalystNormalizECSV pour normaliser votre fichier de formation. Et puis vous pouvez utiliser Loadcsv2Memory of Encogutility Class pour charger le fichier d'entraînement normalisé pour obtenir l'ensemble de données ML. Voici un exemple de code en C #,

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

Il prend le fichier d'entraînement normalisé en tant que premier paramètre, le nombre de neurones d'entrée de réseau compte comme deuxième, le nombre de neurones de sortie du réseau est le troisième, le quatrième paramètre est booléen si vous avez de l'en-tête dans votre fichier CSV, alors vous pouvez mentionner le format comme le cinquième paramètre et le sixième Le paramètre est pour une signification.

Donc, une fois que vous avez cet ensemble de données en mémoire, vous pouvez l'utiliser pour la formation. Une approche similaire peut également être adoptée à l'étape croisée de validation et d'évaluation.

En ce qui concerne la dénormalisation, vous pouvez d'abord persister le fichier d'analyste, et plus tard, vous pouvez également utiliser un fichier d'analyste pour dénormaliser les colonnes individuelles. Par exemple :

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

Une approche similaire peut être utilisée dans les champs de dénormalisation pour obtenir également des étiquettes de classe. Par exemple

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

Autres conseils

L'analyste Encog est fantastique pour normaliser les données. Il peut prendre des informations stockées dans un fichier CSV et déterminer automatiquement les champs normalisés et leur type d'encodage (y compris 1 de n codage équilatéral).

Le seul inconvénient est que la logique est étroitement couplée à la classe ReadCSV.

Prévoyant l'extension par opposition à la modification, j'ai décidé de créer des méthodes d'extension et des classes alternatives pour créer un analyste qui normaliserait un ensemble de données .NET générique.

J'ai également ajouté une nouvelle classe de test qui vous montre comment l'utiliser (c'est très similaire à l'implémentation d'Encog standard).

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;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top