Encog神经网络:归一化

4
在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) *如何使用Encog(Java)规范化CSV文件*

这段代码可以生成一个规范化的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) *反规范化*

我完全不知道如何按照适当数据类型的最大值和最小值进行反规范化。


注意:我已经为执行所有规范化/反规范化操作开发了一个单独的类,但是...是否有一种使用Encog进行此操作的方法? - Josh T
2个回答

3
以下是关于使用ENCOG框架进行规范化和反规范化的更详细信息的资源:
这些由Jeff Heaton本人撰写的优秀电子书,分别为: 1. Programming Neural Networks with Encog3 in C#, 2nd Edition by Heaton, Jeff (Oct 2, 2011) 2.Introduction to Neural Networks for C#, 2nd Edition by Jeff Heaton (Oct 2, 2008) 这些电子书对于ENCOG用户来说是必备的。
您还可以查看Pluralsight课程“Introduction to Machine learning with ENCOG”,其中也包括一些规范化和反规范化的示例。
现在关于您的问题:“然而,在这里并不清楚如何将AnalystNormalizeCSV转换为MLDataSet以实际使用它。”
您可以使用AnalystNormalizeCSV来规范化您的训练文件。然后,您可以使用EncogUtility类的LoadCSV2Memory来加载规范化的训练文件以获取ML DataSet。以下是C#中的示例代码:

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;

Abhishek,我跟着你的Pluralsight课程学习了Encog和机器学习。请查看下面提到的我的扩展库……你可能会发现它很有用。 - K-Dawg

0

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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接