2015-03-31 4 views
1

Я успешно создал нейронную сеть, используя библиотеку Encog Джеффа Хитона. В настоящее время я использую его для классификации (Iris Plants).Как нормализовать входные данные CSV в Encog?

Проблема теперь у меня есть выглядит следующим образом:

У меня есть CSV-файл набора данных, который содержит идеальный выход, и я использую это для обучения. Я хочу использовать отдельный CSV-файл, который не содержит поля вывода для распознавания. У меня есть проблема в том, что, когда я использую новый CSV без выходного поля я получаю следующее сообщение об ошибке при попытке нормализовать свой файл:

Ошибка:

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

Это также может произойти, если вы указали неверный формат файла. "

Это метод:

 public void NormalizeFile(FileInfo SourceDataFile, FileInfo NormalizedDataFile) 
    { 
     var wizard = new AnalystWizard(_analyst); 

     // This line errors 
     wizard.Wizard(SourceDataFile, _useHeaders, AnalystFileFormat.DecpntComma); 

     var norm = new AnalystNormalizeCSV(); 
     norm.Analyze(SourceDataFile, _useHeaders, CSVFormat.English, _analyst); 
     norm.ProduceOutputHeaders = _useHeaders; 
     norm.Normalize(NormalizedDataFile); 
    } 

Когда я делаю свою подготовку, которая включает в себя нормализующее обучающих данных. Я сохраняю данные нормализации. Затем я перезаряжаю эти данные нормализации при распознавании.

Если я сохраню выходной столбец в данных, что я узнаю, то он работает! Как насчет случаев новых данных, когда классификация неизвестна?

Например, если использовать следующий формат в качестве файла, который будет признан:

sepal_l, sepal_w, petal_l, petal_w, имя, отчество

затем он добавляет еще один столбец с прогнозируемым выходом, как это:

sepal_l, sepal_w, petal_l, petal_w, имя, предсказание,

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

Большое спасибо, Киран

ответ

1

Вы можете выполнить свою задачу несколькими способами. Тем не менее, типичным потоком будет:

принять ваши данные -> нормализовать его, используя информацию о нормализации, хранящуюся в анализе-аналитике ---> создать входной массив нормализованных входов -> передать его в обученную сеть и вычислить выход (или предсказать класс в задаче классификации)

Я обновил (этап оценки) Iris demo для этого сценария (который я покрывал в Pluralsight Course:

Вот часть кода:

// Evaluating a new data set with no class information 
     var extraEvaluationSet = EncogUtility.LoadCSV2Memory(Config.ExtraEvaluationFile.ToString(), 
      network.InputCount, 0, true, CSVFormat.English, false); 

     int extraFileCount = 0; 
     using (var file = new System.IO.StreamWriter(Config.ExtraEvaluationFileOutput.ToString())) 
     { 
      file.WriteLine("sepal_l,sepal_w,petal_l,petal_w,predicted"); 
      foreach (var item in extraEvaluationSet) 
      { 
       //normalize input 
       double normalized_sepal_l = analyst.Script.Normalize.NormalizedFields[0].Normalize(item.Input[0]); 
       double normalized_sepal_w = analyst.Script.Normalize.NormalizedFields[1].Normalize(item.Input[1]); 
       double normalized_petal_l = analyst.Script.Normalize.NormalizedFields[2].Normalize(item.Input[2]); 
       double normalized_petal_w = analyst.Script.Normalize.NormalizedFields[3].Normalize(item.Input[3]); 
       double[] inputToNetwork = { normalized_sepal_l, normalized_sepal_w, normalized_petal_l, normalized_petal_w }; 

       count++; 
       //output 
       var output = network.Compute(new BasicMLData(inputToNetwork)); 

       int classCount = analyst.Script.Normalize.NormalizedFields[4].Classes.Count; 
       double normalizationHigh = analyst.Script.Normalize.NormalizedFields[4].NormalizedHigh; 
       double normalizationLow = analyst.Script.Normalize.NormalizedFields[4].NormalizedLow; 

       var eq = new Encog.MathUtil.Equilateral(classCount, normalizationHigh, normalizationLow); 
       var predictedClassInt = eq.Decode(output); 
       var predictedClass = analyst.Script.Normalize.NormalizedFields[4].Classes[predictedClassInt].Name; 
       var resultLine = string.Format("{0},{1},{2},{3},{4}", item.Input[0], item.Input[1], item.Input[2], item.Input[3],predictedClass); 
       file.WriteLine(resultLine); 
       Console.WriteLine("Count :{0} Properties [{1},{2},{3},{4}] ,Predicted : {5} ", 
         extraFileCount, item.Input[0], item.Input[1], item.Input[2], item.Input[3], predictedClass); 

      } 

     } 

Демо-код доступен по следующей ссылке: http://bit.ly/1GRg0u7 (пожалуйста, отредактируйте путь к папке данных перед выполнением)

+0

Abhishek вы звезда!Огромное спасибо. Я прочитаю это и получаю прибежище сегодня! –

+0

Я не уверен, как это будет работать без мастера tge, но плохо попробуйте позже. –

+0

Это работает! Замечательно! Спасибо ... Я взломал это вместе так плохо, рефакторируя то, что у меня есть, и делаю это красиво. –