Нейронная сеть Encog: нормализация

Как в Encog 3.x нормализовать данные, использовать их для обучения и денормировать результаты?

По этому поводу нет хорошей документации, и простой пример, в котором применяется каждый из них, значительно упростит обучение Encog. Я еще не все понял, но вот некоторые ресурсы.

(1) *Как Encog 3.0 Нормализовать?*

Этот код подходит для сохранения нового нормализованного CSV. Однако здесь не ясно, как взять AnalystNormalizeCSV и преобразовать его в MLDataSet, чтобы фактически использовать его.

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) *Как нормализовать файл CSV с помощью Encog (Ява)*

Этот код, опять же, подходит для создания нормализованного вывода csv. Но неясно, как взять нормализованные данные и применить их на самом деле. Существует метод установки цели как MLData, но он предполагает, что все столбцы являются входными данными, и не оставляет места для каких-либо идеалов. Кроме того, обе эти опции сложно использовать, если в файле есть заголовки и/или неиспользуемые столбцы.

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) *Денормализация*

Я в полной растерянности, как взять все это и денормализовать в соответствии с максимальными и минимальными значениями соответствующего типа данных.


person Josh T    schedule 07.11.2013    source источник
comment
Примечание: я разработал отдельный класс для выполнения всей нормализации/денормализации, но все же... нет ли способа сделать это с помощью encog?   -  person Josh T    schedule 12.11.2013


Ответы (2)


Вот несколько ресурсов, где вы можете получить более подробную информацию о нормализации и денормализации с использованием фреймворка ENCOG.

Эти замечательные электронные книги, написанные самим Джеффом Хитоном, Нейронные сети с Encog3 в C#, 2-е издание, Хитон, Джефф (2 октября 2011 г.) 2. Введение в нейронные сети для C#, 2-е издание, Джефф Хитон (2 октября 2008 г.) Это обязательные электронные книги для ENCOG пользователи.

Вы также можете ознакомиться с курсом множественного числа на странице "Introduction to Machine. обучение с помощью ENCOG", это также включает несколько примеров нормализации и денормализации.

Теперь о ваших запросах: «Здесь не ясно, как взять AnalystNormalizeCSV и преобразовать его в MLDataSet, чтобы фактически использовать его».

хорошо, вы можете использовать AnalystNormalizeCSV для нормализации вашего тренировочного файла. Затем вы можете использовать LoadCSV2Memory класса EncogUtility для загрузки нормализованного обучающего файла для получения набора данных ML. Вот пример кода на С#,

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

он принимает нормализованный тренировочный файл в качестве первого параметра, количество входных нейронов сети в качестве второго, количество нейронов в сети в качестве третьего, четвертый параметр является логическим, если у вас есть заголовок в вашем файле csv, тогда вы можете указать формат как пятый параметр и шестой параметр для значимости.

поэтому, когда у вас есть этот набор данных в памяти, вы можете использовать его для обучения. Аналогичный подход можно использовать и на этапе перекрестной проверки и оценки.

Что касается денормализации, вы можете сначала сохранить файл аналитики, а затем использовать файл аналитики для денормализации отдельных столбцов. Например :

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

Аналогичный подход можно использовать при денормализации полей для получения меток классов. Например

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

person Abhishek Kumar    schedule 04.12.2013
comment
Абхишек, я прошел ваши курсы Pluralsight и узнал от вас об Encog и машинном обучении. Ознакомьтесь с моей библиотекой расширений, упомянутой ниже... она может оказаться полезной. - person K-Dawg; 22.04.2016

Аналитик encog отлично подходит для нормализации данных. Он может брать информацию, хранящуюся в файле CSV, и автоматически определять нормализованные поля и тип их кодировки (включая 1 из N равносторонних кодировок).

Единственным недостатком этого является то, что логика тесно связана с классом ReadCSV.

Отдавая предпочтение расширению, а не модификации, я решил заняться созданием методов расширения и альтернативных классов, чтобы создать аналитику, которая нормализует общий набор данных .NET.

Я также добавил новый тестовый класс, который показывает, как его использовать (он очень похож на стандартную реализацию 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;
    }
person K-Dawg    schedule 21.04.2016