如何在 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(执行前请修改数据文件夹路径)
我已经使用 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(执行前请修改数据文件夹路径)