如何在 Encog 中规范化 CSV 输入数据?

How Do I Normalize CSV Input Data in Encog?

我已经使用 Jeff Heaton 的 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,姓名,预测,

但是我希望能够输入没有名称栏的文件。

非常感谢, 基兰

您可以通过多种方式完成任务。但是,典型的流程是:

获取您的数据 --> 使用存储在 encog analyst 中的规范化信息对其进行规范化 ---> 创建规范化输入的输入数组 --> 将其传递给经过训练的网络并计算输出(或预测 class在class化问题中)

我更新了 Iris demo (evaluation phase) for this scenario (which I covered in 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);

             }

         }

演示代码可在以下link获得: http://bit.ly/1GRg0u7(执行前请修改数据文件夹路径)