开发环境配置
1.本系列博文主要以VS2017版本介绍,具体安装方法请参照官方说明;
2.模块的引用请参照上一小结;
创建新项目
本章节将从启动Visual Studio开始,逐步介绍开发如何使用Accord.Net开发一个简单的事例,以决策树分类为例。
Visual启动后,选择【文件】->【新建项目】
在弹出的新建对话框中,以Visual C#分类下选择【控制台应用程序】。在本章节中虽然创建的事例是C#语言,但Accord.Net同样支持所有.Net兼容的语言,如VB.Net或C++/CLI。
给新建的项目添加引用。具体操作可参考上一节介绍的两种方法,在这里通过命令的方式添加了Accord.MachineLearning模块。
PM>Install-Package Accord.MachineLearning
编码
现在准备开发应用程序。下面将演示如何创建和训练一个决策树模型识别一个西瓜是否为好瓜,关于决策树的相关介绍大家可以看看周志华的《机器学习》一书,在这里就不在累赘相关的原理。问题关键在学习下面的训练集:
编号(No) | Color(色泽) | Root(根蒂) | Sound(敲声) | Result(好瓜) |
---|---|---|---|---|
1 | 青绿 | 蜷缩 | 浊响 | 是 |
2 | 乌黑 | 蜷缩 | 浊响 | 是 |
3 | 青绿 | 硬挺 | 清脆 | 否 |
4 | 乌黑 | 稍蜷 | 沉闷 | 否 |
输入数据集inputs由Color、Root、Sound、Good三列组成,对应的输出数据集output由Result组成,在这里主要采用C45方法进行训练,关键代码如下:
//1.创建数据集
DataTable data = new DataTable("Watermelon Example");
data.Columns.Add("No", typeof(string));
data.Columns.Add("Color", typeof(string));
data.Columns.Add("Root", typeof(string));
data.Columns.Add("Sound", typeof(string));
data.Columns.Add("Result", typeof(string));
data.Rows.Add("1", "青绿", "蜷缩", "浊响", "是");
data.Rows.Add("2", "乌黑", "蜷缩", "浊响", "是");
data.Rows.Add("3", "青绿", "硬挺", "清脆", "否");
data.Rows.Add("4", "乌黑", "稍蜷", "沉闷", "否");
data.Rows.Add("5", "青绿", "蜷缩", "浊响", "是");//用于预测
//2.创建Codification用于把字符串转化为整型
Codification codebook = new Codification(data);
DecisionVariable[] attributes =
{
new DecisionVariable("Color",codebook["Color"].NumberOfClasses),
new DecisionVariable("Root",codebook["Root"].NumberOfClasses),
new DecisionVariable("Sound",codebook["Outlook"].NumberOfClasses)
};
int classCount = codebook["Result"].NumberOfClasses;
//3.创建C45决策树
tree = new DecisionTree(attributes, classCount);
C45Learning c45 = new C45Learning(tree);
DataTable symbols = codebook.Apply(data);
inputs = symbols.ToJagged("Color", "Root", "Sound");
outputs = symbols.ToArray<int>("Result");
c45.Learn(inputs, outputs);
测试代码:
static void Main(string[] args)
{
DecisionTree tree;
double[][] inputs;
int[] outputs;
CreateDecisionTreeExample(out tree, out inputs, out outputs);
int result = tree.Decide(inputs[4]);
Console.WriteLine("该瓜是否是好瓜:" + (result == 0 ? "是" : "否"));
Console.ReadKey();
}
运行结果如图所示