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) *反规范化*

我完全不知道如何接受所​​有这些并根据适当的数据类型的最大值和最小值进行非规范化。

4

2 回答 2

3

这里有一些资源,您可以在其中获得有关使用 ENCOG 框架的规范化和非规范化的更多详细信息。

这些伟大的电子书由 Jeff Heaton 自己编写,1. Programming Neural Networks with Encog3 in C#, Heaton, Jeff 的第 2 版(2011 年 10 月 2 日) 2. C# 的神经网络简介 ,Jeff Heaton 的第 2 版(10 月 2 日) , 2008) 这些是 ENCOG 用户必备的电子书。

您还可以查看有关“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;

于 2013-12-04T06:56:26.273 回答
0

encog 分析师非常适合标准化数据。它可以获取存储在 CSV 文件中的信息,并自动确定归一化字段及其编码类型(包括 N 中的 1 个等边编码)。

唯一的缺点是逻辑与 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;
    }
于 2016-04-21T21:10:06.410 回答