Domanda

In Encog 3.x, come fai normalizzare dati, usalo per la formazione e denormalizzare risultati?

Non esiste una buona documentazione su questo e un semplice esempio che si applica ciascuno di questi farebbe molto per ridurre la curva di apprendimento su ENCog. Non ho ancora capito tutto, ma ecco alcune risorse.

(1) *Come si normalizza ENCOG 3.0?*

Questo codice è OK per salvare un nuovo CSV normalizzato. Non è chiaro qui, anche se come prendere l'analista in ormaizecsv e convertirlo in un mldataset per usarlo effettivamente.

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) *Come si normalizza un file CSV con ENCOG (Java)*

Questo codice è, ancora una volta, OK per la produzione di un output CSV normalizzato. Ma non è chiaro su come prendere i dati normalizzati e applicarli effettivamente. Esiste un metodo per impostare il bersaglio come mldata, ma presuppone che tutte le colonne siano input e non lascia spazio a eventuali ideali. Inoltre, entrambe queste opzioni sono difficili da usare quando il file ha intestazioni e/o colonne inutilizzate.

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) *Denormalizzazione*

Ho una perdita totale per come prendere tutto questo e denormalizzare in base ai Max e Min del tipo di dati appropriati.

È stato utile?

Soluzione

Ecco poche risorse, in cui è possibile ottenere informazioni più dettagliate sulla normalizzazione e la denormalizzazione utilizzando il framework ENCOG.

Questi grandi e-book scritti dallo stesso Jeff Heaton, 1. Programmazione di reti neurali con ENCOG3 in C#, 2a edizione di Heaton, Jeff (2 ottobre 2011)2. Introduzione alle reti neurali per C#, 2a edizione di Jeff Heaton (2 ottobre 2008) Questi devono avere e -book per utenti ENCog.

Puoi anche dare un'occhiata al corso di Pluralsight su "Introduzione all'apprendimento automatico con Encog"Ciò include anche pochi esempi di normalizzazione e denormalizzazione.

Ora per quanto riguarda le tue domande: "Non è chiaro qui, anche se come prendere l'analistica e convertirlo in un mldataset per usarlo effettivamente".

Bene, puoi utilizzare AnalystNormalizeCSV per normalizzare il tuo file di allenamento. E quindi è possibile utilizzare loadcsv2memory della classe di encogutilità per caricare il file di allenamento normalizzato per ottenere il set di dati ML. Ecco un codice di esempio in C#,

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

Prende il file di addestramento normalizzato come primo parametro, il conteggio dei neuroni di input di rete come secondo, il conteggio dei neuroni in uscita di rete come terzo, il quarto parametro è booleano se si dispone di intestazione nel tuo file CSV, allora puoi menzionare il formato come quinto parametro e sesto Il parametro è per significato.

Quindi, una volta che hai questo set di dati in memoria, puoi usarlo per l'allenamento. Approccio simile può essere adottato anche nella fase di convalida e valutazione incrociata.

Per quanto riguarda la denormalizzazione, puoi prima persistere al file degli analisti e successivamente è possibile utilizzare anche il file di analisti per denormalizzare le singole colonne. Per esempio :

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

Approccio simile può essere utilizzato anche nei campi denormalizzanti per ottenere etichette di classe. Per esempio

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

Altri suggerimenti

L'analista ENCOG è fantastico per la normalizzazione dei dati. Può prendere informazioni memorizzate in un file CSV e determinare automaticamente i campi normalizzati e il loro tipo di codifica (incluso 1 di codifica N equilaterali).

L'unico aspetto negativo di questo è che la logica è strettamente accoppiata con la classe ReadCSV.

Preferendo l'estensione rispetto alla modifica, ho deciso di creare metodi di estensione e classi alternative per creare un analista che avrebbe normalizzato un set di dati .NET generico.

Ho anche aggiunto una nuova classe di test che ti mostra come usarla (è molto simile all'implementazione di 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;
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top