2015-03-31 73 views
1

我已經使用Jeff Heaton的Encog庫成功製作了一個神經網絡。我目前正在使用它來分類(虹膜植物)。如何在Encog中規範化CSV輸入數據?

這個問題我現在有如下:

我有一個包含理想的輸出數據集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

您可以通過多種方式完成任務。然而,典型的流程是:

獲取您的數據 - >使用存儲在encog分析器中的規範化信息對其進行規範化--->創建規範化輸入的輸入數組 - >將其傳遞到訓練網絡並計算輸出(或在分類問題預測類)

我已經更新了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你是明星!非常感謝。我會通讀這篇文章,並獲得今天的理解! – 2015-04-03 13:08:16

+0

林不知道這將工作沒有tge嚮導但生病後嘗試 – 2015-04-03 13:26:51

+0

它的工作原理!精彩!謝謝......我把它們拼湊在一起如此糟糕的重構我所擁有的,並使它變得美麗。 – 2015-04-03 21:29:34