Pergunta

Em Ecog 3.x, como você normalizar dados, use-o para treinamento e desnormalize resultados?

Não existe uma boa documentação sobre este e um exemplo simples que aplique cada um deles ajudaria bastante a reduzir a curva de aprendizado no EcoG. Ainda não descobri tudo, mas aqui estão alguns recursos.

(1) *Como o EcoG 3.0 normaliza?*

Este código é bom para salvar um novo CSV normalizado. Não está claro aqui, porém, como pegar o AnalystNormIlizecsv e convertê -lo em um mldataset para realmente usá -lo.

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) *Como faço para normalizar um arquivo CSV com EcoG (Java)*

Este código está, novamente, OK para produzir uma saída CSV normalizada. Mas não está claro como pegar os dados normalizados e realmente aplicá -los. Existe um método para definir o alvo como um mldata, mas assume que todas as colunas são entradas e não deixam espaço para nenhum ideal. Além disso, essas duas opções são difíceis de usar quando o arquivo tem cabeçalhos e/ou colunas não 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) *Desnormalizando*

Estou com uma perda total de como tomar tudo isso e desnormalizar de acordo com o Max e o MIN's do tipo de dados apropriado.

Foi útil?

Solução

Aqui estão poucos recursos, onde você pode obter informações mais detalhadas sobre normalização e desnormalização usando a estrutura do EcoG.

Esses grandes e-books escritos pelo próprio Jeff Heaton, 1. Programação de redes neurais com EcoG3 em C#, 2ª edição de Heaton, Jeff (2 de outubro de 2011)2.Introdução a redes neurais para C#, 2ª edição de Jeff Heaton (2 de outubro de 2008) Estes devem ter eBooks para usuários de Ecog.

Você também pode dar uma olhada no curso da Pluralsight em "Introdução ao aprendizado de máquina com EcoG"Isso também inclui poucos exemplos de normalização e desnormalização.

Agora, em relação às suas consultas: "Não está claro aqui, porém, como pegar o AnalystNormIlizecsv e convertê -lo em um mldataset para realmente usá -lo".

Bem, você pode usar o AnalystNormIlizecsv para normalizar seu arquivo de treinamento. E então você pode usar o LoadCSv2Memory of Ecogutility Class para carregar o arquivo de treinamento normalizado para obter o conjunto de dados ML. Aqui está um código de amostra em C#,

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

Ele toma o arquivo de treinamento normalizado como primeiro parâmetro, contagem de neurônios de entrada de rede como segunda, contagem de neurônios de saída de rede como terceiro, o quarto parâmetro é booleano se você tiver cabeçalho no seu arquivo CSV, então você pode mencionar o formato como o quinto parâmetro e o sexto O parâmetro é para significância.

Portanto, depois de ter esse conjunto de dados na memória, você pode usá -lo para treinamento. Abordagem semelhante também pode ser adotada na etapa de validação e avaliação cruzada.

Em relação à desnormalização, você pode primeiro persistir o arquivo do analista e, posteriormente, pode usar o arquivo do analista para desnormalizar colunas individuais também. Por exemplo :

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

Abordagem semelhante pode ser usada na desnormalização de campos para obter rótulos de classe também. Por exemplo

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

Outras dicas

O analista do EcoG é fantástico para normalizar dados. Ele pode obter informações armazenadas em um arquivo CSV e determinar automaticamente os campos normalizados e seu tipo de codificação (incluindo 1 de n codificação equilateral).

A única desvantagem disso é que a lógica é fortemente acoplada à classe READCSV.

Favorecendo a extensão em oposição à modificação, decidi criar métodos de extensão e classes alternativas para criar um analista que normalizaria um conjunto de dados .NET genérico.

Também adicionei uma nova classe de teste que mostra como usá -la (é muito semelhante à implementação padrão do EcoG).

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top