gpt4 book ai didi

c# - 如何为 Accord.NET DecisionTrees 正确提供输入数据

转载 作者:太空宇宙 更新时间:2023-11-03 12:28:47 25 4
gpt4 key购买 nike

我正在尝试学习机器学习,尤其是决策树,我从 Accord .Net 框架网站上复制了这段代码,但它似乎对我不起作用,我不明白为什么.它给我的错误是在第 40 行说:“System.IndexOutOfRangeException:'索引超出了数组的范围。'”我不确定我哪里出错了,它使用的数据集可以在这里找到:https://en.wikipedia.org/wiki/Iris_flower_data_set也许我无法以正确的方式提供数据集?顺便说一下,我使用的是 Visual Studio Community 2017。

这是代码:

using Accord.MachineLearning.DecisionTrees;
using Accord.MachineLearning.DecisionTrees.Learning;
using Accord.MachineLearning.DecisionTrees.Rules;
using Accord.Math;
using Accord.Math.Optimization.Losses;
using Accord.Statistics.Filters;
using ConsoleApp2.Properties;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
// In this example, we will process the famous Fisher's Iris dataset in
// which the task is to classify weather the features of an Iris flower
// belongs to an Iris setosa, an Iris versicolor, or an Iris virginica:
//
// - https://en.wikipedia.org/wiki/Iris_flower_data_set
//

// First, let's load the dataset into an array of text that we can process
// In this example, we will process the famous Fisher's Iris dataset in
// which the task is to classify weather the features of an Iris flower
// belongs to an Iris setosa, an Iris versicolor, or an Iris virginica:
//
// - https://en.wikipedia.org/wiki/Iris_flower_data_set
//

// First, let's load the dataset into an array of text that we can process
string[][] text = Resources.iris_data.Split(new[] { "\r\n" },
StringSplitOptions.RemoveEmptyEntries).Apply(x => x.Split(','));

// The first four columns contain the flower features
double [][] inputs = text.GetColumns(0, 1, 2, 3).To<double[][]>();

// The last column contains the expected flower type
string[] labels = text.GetColumn(4);

// Since the labels are represented as text, the first step is to convert
// those text labels into integer class labels, so we can process them
// more easily. For this, we will create a codebook to encode class labels:
//
var codebook = new Codification("Output", labels);

// With the codebook, we can convert the labels:
int[] outputs = codebook.Translate("Output", labels);

// Let's declare the names of our input variables:
DecisionVariable[] features =
{
new DecisionVariable("sepal length", DecisionVariableKind.Continuous),
new DecisionVariable("sepal width", DecisionVariableKind.Continuous),
new DecisionVariable("petal length", DecisionVariableKind.Continuous),
new DecisionVariable("petal width", DecisionVariableKind.Continuous),
};

// Now, we can finally create our tree for the 3 classes:
var tree = new DecisionTree(inputs: features, classes: 3);

// And we can use the C4.5 for learning:
var teacher = new C45Learning(tree);

// And finally induce the tree:
teacher.Learn(inputs, outputs);

// To get the estimated class labels, we can use
int[] predicted = tree.Decide(inputs);

// And the classification error (of 0.0266) can be computed as
double error = new ZeroOneLoss(outputs).Loss(tree.Decide(inputs));

// Moreover, we may decide to convert our tree to a set of rules:
DecisionSet rules = tree.ToRules();

// And using the codebook, we can inspect the tree reasoning:
string ruleText = rules.ToString(codebook, "Output",
System.Globalization.CultureInfo.InvariantCulture);

// The output is:
string expected = @"Iris-setosa =: (petal length <= 2.45)
Iris-versicolor =: (petal length > 2.45) && (petal width <= 1.75) && (sepal length <= 7.05) && (sepal width <= 2.85)
Iris-versicolor =: (petal length > 2.45) && (petal width <= 1.75) && (sepal length <= 7.05) && (sepal width > 2.85)
Iris-versicolor =: (petal length > 2.45) && (petal width > 1.75) && (sepal length <= 5.95) && (sepal width > 3.05)
Iris-virginica =: (petal length > 2.45) && (petal width <= 1.75) && (sepal length > 7.05)
Iris-virginica =: (petal length > 2.45) && (petal width > 1.75) && (sepal length > 5.95)
Iris-virginica =: (petal length > 2.45) && (petal width > 1.75) && (sepal length <= 5.95) && (sepal width <= 3.05)
";

Console.WriteLine("expected");
Console.ReadLine();

}
}
}

最佳答案

从代码示例本身来看,您只需要一个包含CSV 格式数据的static 类:

    static public class Resources
{
public static string iris_data =
@"7.9,3.8,6.4,2,I. virginica
7.7,3.8,6.7,2.2,I. virginica
7.7,2.6,6.9,2.3,I. virginica
7.7,2.8,6.7,2,I. virginica
7.7,3,6.1,2.3,I. virginica
7.6,3,6.6,2.1,I. virginica
7.4,2.8,6.1,1.9,I. virginica
7.3,2.9,6.3,1.8,I. virginica
7.2,3.6,6.1,2.5,I. virginica
7.2,3.2,6,1.8,I. virginica
7.2,3,5.8,1.6,I. virginica
7.1,3,5.9,2.1,I. virginica
7,3.2,4.7,1.4,I. versicolor
6.9,3.1,4.9,1.5,I. versicolor
6.9,3.2,5.7,2.3,I. virginica
6.9,3.1,5.4,2.1,I. virginica
6.9,3.1,5.1,2.3,I. virginica
6.8,2.8,4.8,1.4,I. versicolor
6.8,3,5.5,2.1,I. virginica
6.8,3.2,5.9,2.3,I. virginica
6.7,3.1,4.4,1.4,I. versicolor
6.7,3,5,1.7,I. versicolor
6.7,3.1,4.7,1.5,I. versicolor
6.7,2.5,5.8,1.8,I. virginica
6.7,3.3,5.7,2.1,I. virginica
6.7,3.1,5.6,2.4,I. virginica
6.7,3.3,5.7,2.5,I. virginica
6.7,3,5.2,2.3,I. virginica
6.6,2.9,4.6,1.3,I. versicolor
6.6,3,4.4,1.4,I. versicolor
6.5,2.8,4.6,1.5,I. versicolor
6.5,3,5.8,2.2,I. virginica
6.5,3.2,5.1,2,I. virginica
6.5,3,5.5,1.8,I. virginica
6.5,3,5.2,2,I. virginica
6.4,3.2,4.5,1.5,I. versicolor
6.4,2.9,4.3,1.3,I. versicolor
6.4,2.7,5.3,1.9,I. virginica
6.4,3.2,5.3,2.3,I. virginica
6.4,2.8,5.6,2.1,I. virginica
6.4,2.8,5.6,2.2,I. virginica
6.4,3.1,5.5,1.8,I. virginica
6.3,3.3,4.7,1.6,I. versicolor
6.3,2.5,4.9,1.5,I. versicolor
6.3,2.3,4.4,1.3,I. versicolor
6.3,3.3,6,2.5,I. virginica
6.3,2.9,5.6,1.8,I. virginica
6.3,2.7,4.9,1.8,I. virginica
6.3,2.8,5.1,1.5,I. virginica
6.3,3.4,5.6,2.4,I. virginica
6.3,2.5,5,1.9,I. virginica
6.2,2.2,4.5,1.5,I. versicolor
6.2,2.9,4.3,1.3,I. versicolor
6.2,2.8,4.8,1.8,I. virginica
6.2,3.4,5.4,2.3,I. virginica
6.1,2.9,4.7,1.4,I. versicolor
6.1,2.8,4,1.3,I. versicolor
6.1,2.8,4.7,1.2,I. versicolor
6.1,3,4.6,1.4,I. versicolor
6.1,3,4.9,1.8,I. virginica
6.1,2.6,5.6,1.4,I. virginica
6,2.2,4,1,I. versicolor
6,2.9,4.5,1.5,I. versicolor
6,2.7,5.1,1.6,I. versicolor
6,3.4,4.5,1.6,I. versicolor
6,2.2,5,1.5,I. virginica
6,3,4.8,1.8,I. virginica
5.9,3,4.2,1.5,I. versicolor
5.9,3.2,4.8,1.8,I. versicolor
5.9,3,5.1,1.8,I. virginica
5.8,4,1.2,0.2,I. setosa
5.8,2.7,4.1,1,I. versicolor
5.8,2.7,3.9,1.2,I. versicolor
5.8,2.6,4,1.2,I. versicolor
5.8,2.7,5.1,1.9,I. virginica
5.8,2.8,5.1,2.4,I. virginica
5.8,2.7,5.1,1.9,I. virginica
5.7,4.4,1.5,0.4,I. setosa
5.7,3.8,1.7,0.3,I. setosa
5.7,2.8,4.5,1.3,I. versicolor
5.7,2.6,3.5,1,I. versicolor
5.7,3,4.2,1.2,I. versicolor
5.7,2.9,4.2,1.3,I. versicolor
5.7,2.8,4.1,1.3,I. versicolor
5.7,2.5,5,2,I. virginica
5.6,2.9,3.6,1.3,I. versicolor
5.6,3,4.5,1.5,I. versicolor
5.6,2.5,3.9,1.1,I. versicolor
5.6,3,4.1,1.3,I. versicolor
5.6,2.7,4.2,1.3,I. versicolor
5.6,2.8,4.9,2,I. virginica
5.5,4.2,1.4,0.2,I. setosa
5.5,3.5,1.3,0.2,I. setosa
5.5,2.3,4,1.3,I. versicolor
5.5,2.4,3.8,1.1,I. versicolor
5.5,2.4,3.7,1,I. versicolor
5.5,2.5,4,1.3,I. versicolor
5.5,2.6,4.4,1.2,I. versicolor
5.4,3.9,1.7,0.4,I. setosa
5.4,3.7,1.5,0.2,I. setosa
5.4,3.9,1.3,0.4,I. setosa
5.4,3.4,1.7,0.2,I. setosa
5.4,3.4,1.5,0.4,I. setosa
5.4,3,4.5,1.5,I. versicolor
5.3,3.7,1.5,0.2,I. setosa
5.2,3.5,1.5,0.2,I. setosa
5.2,3.4,1.4,0.2,I. setosa
5.2,4.1,1.5,0.1,I. setosa
5.2,2.7,3.9,1.4,I. versicolor
5.1,3.5,1.4,0.2,I. setosa
5.1,3.5,1.4,0.3,I. setosa
5.1,3.8,1.5,0.3,I. setosa
5.1,3.7,1.5,0.4,I. setosa
5.1,3.3,1.7,0.5,I. setosa
5.1,3.4,1.5,0.2,I. setosa
5.1,3.8,1.9,0.4,I. setosa
5.1,3.8,1.6,0.2,I. setosa
5.1,2.5,3,1.1,I. versicolor
5,3.6,1.4,0.2,I. setosa
5,3.4,1.5,0.2,I. setosa
5,3,1.6,0.2,I. setosa
5,3.4,1.6,0.4,I. setosa
5,3.2,1.2,0.2,I. setosa
5,3.5,1.3,0.3,I. setosa
5,3.5,1.6,0.6,I. setosa
5,3.3,1.4,0.2,I. setosa
5,2,3.5,1,I. versicolor
5,2.3,3.3,1,I. versicolor
4.9,3,1.4,0.2,I. setosa
4.9,3.1,1.5,0.1,I. setosa
4.9,3.1,1.5,0.2,I. setosa
4.9,3.6,1.4,0.1,I. setosa
4.9,2.4,3.3,1,I. versicolor
4.9,2.5,4.5,1.7,I. virginica
4.8,3.4,1.6,0.2,I. setosa
4.8,3,1.4,0.1,I. setosa
4.8,3.4,1.9,0.2,I. setosa
4.8,3.1,1.6,0.2,I. setosa
4.8,3,1.4,0.3,I. setosa
4.7,3.2,1.3,0.2,I. setosa
4.7,3.2,1.6,0.2,I. setosa
4.6,3.1,1.5,0.2,I. setosa
4.6,3.4,1.4,0.3,I. setosa
4.6,3.6,1,0.2,I. setosa
4.6,3.2,1.4,0.2,I. setosa
4.5,2.3,1.3,0.3,I. setosa
4.4,2.9,1.4,0.2,I. setosa
4.4,3,1.3,0.2,I. setosa
4.4,3.2,1.3,0.2,I. setosa
4.3,3,1.1,0.1,I. setosa
";
}

此外,您可能想要比较预期结果和实际结果:

Console.WriteLine("expected = \n{0}", expected);
Console.WriteLine("ruleText = \n{0}", ruleText);

它应该给你这样的东西:

expected =
Iris-setosa =: (2 <= 2.45)
Iris-versicolor =: (2 > 2.45) && (3 <= 1.75) && (0 <= 7.05) && (1 <= 2.85)
Iris-versicolor =: (2 > 2.45) && (3 <= 1.75) && (0 <= 7.05) && (1 > 2.85)
Iris-versicolor =: (2 > 2.45) && (3 > 1.75) && (0 <= 5.95) && (1 > 3.05)
Iris-virginica =: (2 > 2.45) && (3 <= 1.75) && (0 > 7.05)
Iris-virginica =: (2 > 2.45) && (3 > 1.75) && (0 > 5.95)
Iris-virginica =: (2 > 2.45) && (3 > 1.75) && (0 <= 5.95) && (1 <= 3.05)

ruleText =
I. virginica =: (2 > 2.45) && (3 <= 1.75) && (0 > 7.05)
I. virginica =: (2 > 2.45) && (3 > 1.75) && (0 > 5.95)
I. virginica =: (2 > 2.45) && (3 > 1.75) && (0 <= 5.95) && (1 <= 3.05)
I. versicolor =: (2 > 2.45) && (3 <= 1.75) && (0 <= 7.05) && (1 <= 2.85)
I. versicolor =: (2 > 2.45) && (3 <= 1.75) && (0 <= 7.05) && (1 > 2.85)
I. versicolor =: (2 > 2.45) && (3 > 1.75) && (0 <= 5.95) && (1 > 3.05)
I. setosa =: (2 <= 2.45)

关于c# - 如何为 Accord.NET DecisionTrees 正确提供输入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43607740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com