网站建设saas,织梦免费模板dede源码,公众号模板网站,360建设网站免费下载opencv 中创建决策树
cv::ml::DTrees类表示单个决策树或决策树集合#xff0c;它是RTrees和 Boost的基类。
CART是二叉树#xff0c;可用于分类或回归。对于分类#xff0c;每个叶子节点都 标有类标签#xff0c;多个叶子节点可能具有相同的标签。对于回归#xff0c;每…opencv 中创建决策树
cv::ml::DTrees类表示单个决策树或决策树集合它是RTrees和 Boost的基类。
CART是二叉树可用于分类或回归。对于分类每个叶子节点都 标有类标签多个叶子节点可能具有相同的标签。对于回归每个叶 子节点都被分配了常数因此近似函数是分段常数。 创建空决策树 cv::ml::DTrees::create函数可使用指定的参数创建空决策树 之后使用cv::ml::StatModel::train函数训练该决策树模型或者使用Algorithm::load (filename)从文件中加载决策树模型。 模型的基本设置 以下是构建决策树模型的必要参数绝大部分参数有默认值
MaxDepth树的最大可能深度
根节点的深度为零训练算法在深度小于MaxDepth时尝试切分节 点。如果满足其他终止标准或者树被修剪则实际深度可以更小。默认值为INT_MAX。
设置或获取参数MaxDepth的方法如下 MinSampleCount节点中的最小样本数
如果节点中的样本数小于MinSampleCount则不会切分该节点。 默认值为10。
设置或获取参数MinSampleCount的方法如下 RegressionAccuracy回归树的终止标准
如果节点中的估计值与该节点中的样本值之间的所有绝对差值小 于该参数则该节点不会被进一步切分。默认值为0.01f。
设置或获取参数RegressionAccuracy的方法如下 MaxCategories表示特征属性为类形式时最大类的数量
算法会将分类变量的可能值聚类到K≤MaxCategories群集中以 便找到次优切分。如果训练过程尝试进行切分的离散变量需要超过 MaxCategories值则寻找精确的最佳子集可能需要很长时间。许多决策树引擎包括OpenCV的实现在这种情况下将尝试通过把所有样本聚类到MaxCategories集群中来寻找次优切分其中某些类别会被合并在一起。
对于具有NMaxCategories可能值的分类变量聚类仅应用于n2类的分类问题。在回归和只有2类分类的情况下不采用聚类也可以有效地找到最优切分因此在n≤2时不使用该参数。默认值为10。
设置或获取参数MaxCategories的方法如下 CVFolds使用k折叠交叉验证剪枝时的交叉验证折数
如果CVFolds1则算法使用k折叠交叉验证程序修剪构建的决策 树其中kCVFolds默认值为10。
设置或获取参数CVFolds的方法如下 Use1SERule应用1SE规则剪枝标志位
如果标志位为true剪枝将应用1SE规则这将使树更紧凑更能 抵抗训练数据噪声但准确度稍差。默认值为true。
设置或获取参数Use1SERule的方法如下 TruncatePrunedTree截断剪枝树标志位默认值为true
如果标志位为true则从树中物理移除已修剪的分枝否则它们 会被保留并且可以从原始未修剪或修剪得不那么大的树中获得结果。
设置或获取参数truncatePrunedTree的方法如下 priors先验类概率Mat数组默认值为空矩阵PriorsMat()。
该参数可用于将决策树偏好调整到某个类。例如想要检测一些 罕见的异常即在训练集中正常比异常多很多此时只需将每个案例都视为正常即可实现非常好的分类性能。为了避免这种情况可以指定先验人为地增加异常概率高达0.5甚至更高因此错误分类的异常权重变得更大这样决策树就能做出适当地调整以更好地检测异常样本。
还可以将此参数视为预测类别的权重以确定为错误分类提供的 相对权重。也就是说如果第一类别的权重是1第二类别的权重是10则预测第二类别的每个错误等同于在预测第一类别时犯10个错误。
设置或获取参数Priors的方法如下 UseSurrogates是否构建代理切分标志位
如果为true那么将建立代理切分。代理切分指的是如果当前 样本缺少某些特征的值那么该样本就无法继续沿着树向下切分也就无法到达叶子节点即没有预测输出。在这种情况下可以利用当前节点下面的所有子节点中的叶子节点来预测输出的平均值作为这个样本的预测输出故称之为代理切分。当代理切分标志位为true时允许使用缺少的数据。此外如果需要计算特征属性的重要性则需要将代理切分标志位设置为true。
设置或获取参数UseSurrogates的方法如下 训练决策树
与KNN一样决策树也是使用cv::ml::StatModel::train函数简 称train函数来训练模型的。
train函数 函数参数
samples训练集。layout指定训练集的样本排列方式。具体如下 • ROW_SAMPLE每个训练样本占一行的训练集。 • COL_SAMPLE每个训练样本占一列的训练集。responses与训练集样本排列顺序对应的标签向量。
树从根节点开始递归构建所有训练数据特征向量和响应用 于切分根节点。在每个节点中基于某些标准找到最佳决策规则最佳“主要”切分。
如前文所述在训练中基尼系数表示的“不纯度”用于分类均方误差之和用于回归。如有必要找到代理切分。
它们类似于训练数据的主要切分结果。使用左子节点和右子节点之间的主要和替代切分就像在预测过程中完成的那样来划分所有数据。该过程以递归方式切分左右节点。当出现以下任意一种情况时每个节点的递归过程都可能会停止。
构造的树分支的深度已达到指定的最大值。当统计上没有进一步切分节点时节点中的训练样本数小于指 定的阈值。节点中的所有样本属于同一类或者在回归的情况下变化太 小。与随机选择相比最佳找到的切分没有任何明显的改善。 在构建决策树时如有必要可以使用交叉验证程序对其进行修剪。通常此过程仅适用于独立决策树。如果构建的树过小则应使用自己的方案防止过拟合。
使用决策树预测
训练好的决策树模型不仅可以根据输入样本特征向量获得响应 还可以利用决策树计算变量的重要性。
预测过程 了解OpenCV中决策树模型的预测过程有助于我们理解决策树的 原理并更好地应用它。决策树的预测过程从根节点开始从每个非叶 子节点开始过程向左选择左子节点作为下一个观察节点或向右 移动基于某个变量的值该变量的索引存储在被观察节点中。连续 变量与分类变量的预测过程如下。
连续变量。将变量值与存储在节点中的阈值进行比较。如果该值 小于阈值则过程向左移动否则向右移动。例如如果重量小于1千克则程序向左移动否则向右移动。
分类变量。测试离散变量值从变量可以采用的有限值集合中查 看它是否属于某个值的子集也存储在节点中。如果是则向左移动否则向右移动。例如如果颜色为绿色或红色请转到左侧否则转到右侧。
在 每 个 节 点 中 都 使 用 了 variable_index 阈 值 decision_rule子集这样一对实体。这样一对实体被称为一个切分在variable_index上的切分。一旦到达叶子节点分配给该节点的值将用作预测输出。
有时输入向量的某些特征缺失会导致预测过程卡在某个节点 中。为了避免这种情况决策树使用代理切分。也就是说除最佳的“主要”切分外每个树节点也可以被分成具有几乎相同结果的一个或多个其他变量。
决策树模型与其他机器学习模型一样测试可以分为一次测试一 个多个样本或者一次性测试整个数据集上的误差。
1一次测试一个或多个样本
使用标准的cv::ml::StatModel::predict函数简称predict函 数预测所提供样本的响应。
predict函数 函数参数
samples输入样本浮点型矩阵。results可选的输出结果矩阵。flags 可 选 标 志 取 决 于 模 型 。 参 阅 cv::ml::StatModel::Flags函数。
2一次性测试整个数据集上的误差
使用标准的cv::ml::StatModel::calcError函数简称calcError 函数可以测试整个数据集上的误差。该函数使用predict函数来计算错误。对于回归模型误差计算使用均方误差MSE对于分类模型计算错误分类样本的百分比0%100%。
calcError函数 函数参数
data可以是TrainData类型的训练数据或者测试数据。test如果为true则在数据的测试子集上计算误差否则在 数据的训练子集上计算误差。注意如果加载了一个完全不同的数据集 来 评 估 已 经 训 练 过 的 模 型 则 不 需 要 使 用 TrainData::setTrainTestSplitRatio方法设置切分测试子集此时无论testtrue还是testfalse都将计算整个新数据集的误差。resp可选的输出响应。
计算变量的重要性 决策树不仅可用于预测还可用于各种数据分析。前文曾介绍 过选择最佳切分属性是决策树的关键。因此决策树具有计算每个样本属性特征的重要性的能力在OpenCV中称之为计算变量重要性。例如当使用邮件信息中出现的一组单词作为特征向量的垃圾邮件过滤器时变量重要性评级可用于确定最“垃圾邮件指示”单词从而有助于保持字典大小合理。
应用示例
import cv2
import numpy as np# 创建一个决策树分类器
decision_tree cv2.ml.DTrees_create()# 创建一些训练数据
train_data np.array([[1.0, 2.0], [2.0, 3.0], [3.0, 4.0], [10.0, 12.0], [11.0, 13.0]], dtypenp.float32)
responses np.array([0, 0, 0, 1, 1], dtypenp.int32)# 进行PCA降维
num_components 1
pca cv2.PCACompute(train_data, meanNone, maxComponentsnum_components)# 使用PCA进行降维
train_data_reduced cv2.PCAProject(train_data, pca[0])# 创建一个决策树分类器
decision_tree cv2.ml.DTrees_create()# 设置决策树参数
params dict(maxDepth2)
decision_tree.setCVFolds(1) # 设置交叉验证折数# 将降维后的训练数据与类别标签整合为训练集
train_data_with_labels cv2.ml.TrainData_create(samplestrain_data_reduced,layoutcv2.ml.ROW_SAMPLE,responsesresponses)# 训练决策树分类器
decision_tree.train(train_data_with_labels)# 创建一个测试样本并进行降维
test_sample np.array([[2.5, 3.5]], dtypenp.float32)
test_sample_reduced cv2.PCAProject(test_sample, pca[0])# 使用决策树进行预测
result decision_tree.predict(test_sample_reduced)
print(Predicted class:, result[1][0][0])