C++_2018-12-03_机器学习——DTree训练示例:分类树

 简述

通过DTree进行带标签数据的训练,保存,读取,预测,可用于场景:图像特征,文本数据,数据挖掘等的分类。

样本

序号年纪薪水有房有车信贷能否通过
1YL    
2YL    
3YM    
4YM    
5YH    
6YM    
7M     
8M     
9M     
10M     
11M     
12M     
13O     
14O     
15O     
16O     
17O     
18O     
19O     

代码

static const char* var_desc[] =
{
	"Age (young = Y, middle = M, old = O)",
	"Salary (low = L, medium = M, high = H)",
	"Own_House (false = N, true = Y)",
	"Own_Car (false = N, true = Y)",
	"Credit_Rating (fair = F, good = G, excellent = E)",
	0
};

int DTree_example()
{
    /*
    #include <opencv2\core\core.hpp>
    #include <opencv2\highgui\highgui.hpp>
    #include <opencv2\imgproc\imgproc.hpp>
    #include <opencv2\ml\ml.hpp>
    #include <iostream>

    using namespace cv;
    using namespace std;
    */

	/*样本*/
	float trainingData[19][5] = {
		{ 'Y', 'L', 'N', 'N', 'F' },
		{ 'Y', 'L', 'Y', 'N', 'G' },
		{ 'Y', 'M', 'Y', 'N', 'G' },
		{ 'Y', 'M', 'Y', 'Y', 'G' },
		{ 'Y', 'H', 'Y', 'Y', 'G' },
		{ 'Y', 'M', 'N', 'Y', 'G' },
		{ 'M', 'L', 'Y', 'Y', 'E' },
		{ 'M', 'H', 'Y', 'Y', 'G' },
		{ 'M', 'L', 'N', 'Y', 'G' },
		{ 'M', 'M', 'Y', 'Y', 'F' },
		{ 'M', 'H', 'Y', 'Y', 'E' },
		{ 'M', 'M', 'N', 'N', 'G' },
		{ 'O', 'L', 'N', 'N', 'G' },
		{ 'O', 'L', 'Y', 'Y', 'E' },
		{ 'O', 'L', 'Y', 'N', 'E' },
		{ 'O', 'M', 'N', 'Y', 'G' },
		{ 'O', 'L', 'N', 'N', 'E' },
		{ 'O', 'H', 'N', 'Y', 'F' },
		{ 'O', 'H', 'Y', 'Y', 'E' }			
	};
	Mat trainingDataMat(19, 5, CV_32FC1, trainingData);
		
	/*标签*/
	float responses[19] = { 
		'N', 'N', 'Y', 'Y', 'Y',\
		'N', 'Y', 'Y', 'N', 'N',\
		'Y', 'N', 'N', 'Y', 'Y',\
		'N', 'N', 'N', 'Y' };
	Mat responseMat(19, 1, CV_32FC1, responses);

	/*决策树参数*/
	float priors[5] = { 1, 1 };
	CvDTreeParams params(
		15,//
		1,
		0,
		false,
		25,
		0,
		false,
		false,
		priors
		);
	Mat varTypeMat(6, 1, CV_8U, Scalar::all(1));

	/*训练样本,构建决策树*/
	CvDTree* dtree = new CvDTree();
	dtree->train(
		trainingDataMat,
		CV_ROW_SAMPLE,
		responseMat,
		Mat(),
		Mat(),
		varTypeMat,
		Mat(),
		params
		);

	/*计算每个属性的重要程度并打印出来*/
	const CvMat* var_importance = dtree->get_var_importance();
	for (size_t i = 0; i < var_importance->cols*var_importance->rows; i++)
	{
		double val = var_importance->data.db[i];
		char buf[100];
		int len = (int)(strchr(var_desc[i], '(') - var_desc[i] - 1);
		strncpy(buf, var_desc[i], len);
		buf[len] = '\0';
		printf("%s", buf);
		printf(":%g%%\n", val * 100);
	}

	/*模型保存*/
	dtree->save("dtree.xml");

	/*模型加载
	CvDTree* dtree = new CvDTree();
	*/
	dtree->load("dtree.xml");

	/*预测*/
	float myData[5] = { 'M', 'H', 'Y', 'N', 'F' };
	Mat myDataMat(5, 1, CV_32FC1, myData);
	double r = dtree->predict(myDataMat, Mat(), false)->value;
	cout << endl << "result:" << (char)r << endl;
		
	return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智能之心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值