2013-11-07 4 views
3

В Encog 3.x, как вы нормализовать данные, использовать его для обучения и денормализовать результаты?Encog Neural Net: Нормализация

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

(1) * How does Encog 3.0 Normalize? *

Этот код ОК для сохранения нового нормализованное 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) * How do I normalize a CSV file with Encog (Java) *

Этот код, опять же, нормально для получения нормализованного выходного 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) * денормализации *

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

+0

Примечание: Я разрабатываю отдельный класс для выполнения всех нормализации/денормализации, но все же ... нет ли способа сделать это с помощью encog? –

ответ

2

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

Эти великие книги, написанные самим Джеффом Хитон, 1. Programming Neural Networks with Encog3 in C#, 2nd Edition by Heaton, Jeff (Oct 2, 2011) 2.Introduction для нейронных сетей для C#, 2-е издание Джефф Хитон (Окт 2, 2008) Данные должны быть электронные книги для пользователей Encog.

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

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

ну, вы можете использовать AnalystNormalizeCSV для нормализации вашего учебного файла. И тогда вы можете использовать класс LoadCSV2Memory класса EncogUtilityдля загрузки нормализованного файла тренировки, чтобы получить 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;

+0

Abhishek, я следил за вашими курсами Pluralsight и узнал о вас и узнал о вас. Посмотрите мою библиотеку расширений, упомянутую ниже ... вы можете найти ее полезной. –

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; 
    } 
Смежные вопросы