決定木のサンプルプログラム
数値パラメータ入力に対する決定木のサンプル.
#include <opencv2/opencv.hpp> //OpenCV関連ヘッダ全部インクルード #ifdef _DEBUG //Debugモードの場合 #pragma comment(lib, "opencv_core245d.lib") #pragma comment(lib, "opencv_ml245d.lib") #else //Releaseモードの場合 #pragma comment(lib, "opencv_core245.lib") #pragma comment(lib, "opencv_ml245.lib") #endif using namespace cv; using std::cout; using std::endl; void showSplits(CvDTreeSplit *split) { if(split==NULL) return; cout << "Split : vidx=" << split->var_idx; cout << ", quality=" << split->quality; cout << ", ord.c=" << split->ord.c << endl; showSplits(split->next); } void showTrees(const CvDTreeNode *root, string text) { if(root==NULL) return; for(int d=0; d<root->depth; d++) cout << "-- "; cout << text << endl; cout << "sample count" << root->sample_count << endl; cout << "value:" << root->value << endl; showSplits(root->split); cout << endl; showTrees(root->left, "Left"); showTrees(root->right, "Right"); } int main() { //http://www.sakurai.comp.ae.keio.ac.jp/classes/IntInfProc-class/2010/06DecisionTree.pdf より「破産の予測」 // 1年あたりの支払い遅延回数,支出/収入 Mat data = (Mat_<float>(14,2) << 3, 0.2, 1, 0.3, 4, 0.5, 2, 0.7, 0, 1.0, 1, 1.2, 1, 1.7, 6, 0.2, 7, 0.3, 6, 0.7, 3, 1.1, 2, 1.5, 4, 1.7, 2, 1.9); Mat label = (Mat_<int>(14, 1) << 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1); CvDTreeParams param = CvDTreeParams( 3, // 最大の深さ 2, // あるノードに対するサンプル数がこの値よりも少ない場合,分岐しない. 0, // 別の終了条件 - 回帰木の場合のみ. false, // trueの場合代理分岐が構築される.データの欠損や,変数の重要度の推定に必要 2, // max_categories 0, // このパラメータが >1 の場合,木は cv_folds 分割交差検証法により刈り込まれる. false, // true の場合,木は刈り込み手続きによって切り捨てられる. false, // true の場合,カットオフノードが,木から物理的に削除される. NULL // クラスラベル値によって保存されたクラス事前確率の配列. ); DecisionTree dtree = DecisionTree(); dtree.train(data, CV_ROW_SAMPLE, label, Mat(), Mat(), Mat(), Mat(), param); //学習データをテストに回してみる for( int i = 0; i < data.rows; i++ ) { double r = (dtree.predict(data.row(i)))->value; cout << i << ":" << r << endl; } //ツリーの表示 showTrees(dtree.get_root(), "Root"); return 0; }