网页制作与网站建设完全学习手册pdf,python培训学校,沈阳晚报,亦庄做网站决策树是一种非参数的监督学习方法#xff0c;主要用于分类和回归。
决策树结构 决策树在逻辑上以树的形式存在#xff0c;包含根节点、内部结点和叶节点。
根节点#xff1a;包含数据集中的所有数据的集合内部节点#xff1a;每个内部节点为一个判断条件#xff0c;并且…决策树是一种非参数的监督学习方法主要用于分类和回归。
决策树结构 决策树在逻辑上以树的形式存在包含根节点、内部结点和叶节点。
根节点包含数据集中的所有数据的集合内部节点每个内部节点为一个判断条件并且包含数据集中满足从根节点到该节点所有条件的数据的集合。根据内部结点的判断条件测试结果内部节点对应的数据的集合别分到两个或多个子节点中。叶节点叶节点为最终的类别被包含在该叶节点的数据属于该类别。
决策树学习的 3 个步骤
特征选择
在构建决策树的过程中选择最佳既能够快速分类又能使决策树的深度最小的分叉特征属性是关键所在。这种“最佳性”可以用非纯度进行衡量。如果一个数据集合中只有一种分类结果则该集合最纯即一致性好反之有许多分类则不纯即一致性不好。 一般的原则是希望通过不断划分节点使得一个分支节点包含的数据尽可能的属于同一个类别即“纯度“越来越高。 常用的准则有熵基尼指数和分类误差 公式分别为
EntropyE(D)−∑j1Jpjlog2pjEntropy E(D) -\sum_{j1}^Jp_j\log_2p_jEntropyE(D)−j1∑Jpjlog2pj GiniIndexGini(D)∑j1Jpj(1−pj)∑j1Jpj−∑j1Jpj21−∑j1Jpj2Gini Index Gini(D) \sum_{j1}^Jp_j(1-p_j) \sum_{j1}^Jp_j - \sum_{j1}^Jp_j^2 1 - \sum_{j1}^Jp_j^2GiniIndexGini(D)j1∑Jpj(1−pj)j1∑Jpj−j1∑Jpj21−j1∑Jpj2
ClassificationErroe1−max{pj}Classification Erroe 1- \max{\{p_j\}} ClassificationErroe1−max{pj}
上述所有公式中值越大表示越不纯式中DDD表示样本数据的分类及和。设该集合共有JJJ中分类pjp_jpj表示第jjj种分类的样本率 pjNjNp_j \frac{N_j}{N}pjNNj 式中NNN和NjN_jNj分辨表示集合DDD中样本数据的总数和第jjj个分类的样本数量。
决策树生成
选择好特征后就从根节点触发对节点计算所有特征的信息增益选择信息增益最大的特征作为节点特征根据该特征的不同取值建立子节点对每个子节点使用相同的方式生成新的子节点直到信息增益很小或者没有特征可以选择为止。
决策树剪枝
剪枝的主要目的是对抗「过拟合」通过主动去掉部分分支来降低过拟合的风险。
决策树算法
ID3 算法 ID3 是最早提出的决策树算法他就是利用信息增益来选择特征的。
C4.5 算法 他是 ID3 的改进版他不是直接使用信息增益而是引入“信息增益比”指标作为特征的选择依据。
CARTClassification and Regression Tree 这种算法即可以用于分类也可以用于回归问题。CART 算法使用了基尼系数取代了信息熵模型。
测试用例-评估是否发放贷款
#includeiostream
#includeopencv2/highgui/highgui.hpp
#includeopencv2/core/core.hpp
#includeopencv2/imgproc/imgproc.hpp
#includeopencv2/ml/ml.hppusing namespace std;
using namespace cv;
using namespace cv::ml;static const char* var_desc[]
{Age (youngY, middleM, oldO),Salary? (LowL, mediumM, highH),Own_House? (falseN, trueY),Own_Car? (falseN, trueY),Credit_Rating (fairF, goodG, excellentE,0
};int main(int argc, char *argv[])
{//训练样本年龄薪水房子车信贷情况float trainData[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,L,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 trainDataMat(19, 5, CV_32FC1, trainData);//cout trainDataMat endl;//训练样本的响应值,1代表G -1代表B float labels[19] { N ,N ,Y,Y,Y,N,Y,Y,N ,N,Y,N ,N ,Y,Y,N ,N ,N ,Y };Mat labelsMat(19, 1, CV_32FC1, labels);//cout labelsMat endl;//建立模型PtrDTrees model DTrees::create();//树的最大可能深度model-setMaxDepth(8);//节点最小样本数量model-setMinSampleCount(2);//是否建立替代分裂点model-setUseSurrogates(false);//交叉验证次数model-setCVFolds(0);//是否严格修剪model-setUse1SERule(false);//分支是否完全移除model-setTruncatePrunedTree(false);//创建TrainData并进行训练PtrTrainData tData TrainData::create(trainDataMat, ROW_SAMPLE, labelsMat);model-train(tData);//保存决策树为xml文件const std::string save_file{ decision_tree_model.xml }; // .xml, .yaml, .jsonsmodel-save(save_file);float myData[5] { M,H,Y,N,F};//测试样本Mat myDataMat(5, 1, CV_32FC1, myData);//利用训练好的分类器进行测试样本预测cv::Mat rMat;double r model-predict(myDataMat, rMat, false);std::cout result: (char)r endl;//测试加载保存的决策树进行预测PtrDTrees dtree DTrees::load(decision_tree_model.xml);r dtree-predict(myDataMat, rMat, false);std::cout result: (char)r endl;return 0;
}结果
result: N
result: N