2211月

RandomForest随机森林总结 – handspeaker

1。随机丛林规律简介

随机丛林,一种应用多棵树锻炼和预测范本的混合物器。混合物器率先是由雷欧开发的。 Breiman和Adele Cutler建议,它被登记簿为铭刻于。。简略来说,随机丛林由多个强行带走结合。 And Regression 树)。每棵树,他们应用的锻炼集是从总锻炼集合样品靠背的。,这等比中数,总锻炼集合的些许范本能够出现时T的锻炼集合。,它也无能力的出现时树的锻炼集合。。当锻炼每个树的混合物时,所应用的特点是随机地从本身人特点中皱缩的,而不是PrB。,据雷欧 布赖曼的可取之处,假定特点的总额是m,同样比率可以是平方(m)。,1/2sqrt(M),2sqrt(M)。

因而,随机丛林的锻炼褶皱可以综合列举如下:

(1)赠送的锻炼集S,考查集T,特点维数f。决定限制因素:二手车数,每棵树的吃水都是D,每个混合物F所应用的特点数,堵塞状态:混合物上的最小范本数s,混合物上的最小通讯增益M

说起居于首位地棵1-T树,i=1-t:

(2)锻炼集S(i)的尺寸与S的尺寸能与之比拟的东西。,范本作为根混合物,从根混合物开端锻炼

(3)万一在瞄准混合物上手脚能够到的范围堵塞状态,将瞄准混合物设置为叶状的结构混合物,万一它是人家混合物成绩,叶混合物的预测出口是Cu中最大的C(j)类。,瞄准范本集合概率p到c(j)的比率;万一是回归成绩,预测出口是瞄准混合物中每个范本的分摊值。。之后持续锻炼安心混合物。。万一瞄准混合物未手脚能够到的范围堵塞状态,无p F维特点F维数特点的随机选择。应用该F维特点,寻觅粹一维特点k及其级限协定,具有不足瞄准混合物上TH的k维特点的范本是DIVI,其余的的被分为右混合物。。持续锻炼安心混合物。评定混合物有效性的规范是压缩磁盘。。

(4)反复(2)(3),直到本身人混合物已被锻炼或制表为叶混合物。。

(5)反复(2),(3),(4)直到本身人的手强行带走都被锻炼。

应用随机丛林的预测褶皱列举如下:

说起居于首位地棵1-T树,i=1-t:

(1)从瞄准树的根混合物开端,依据瞄准混合物的级限协定TH,断定是进入左混合物钍),直到手脚能够到的范围,叶混合物,并出口预测值。。

(2)反复治理(1)直到本身人T树出口预测值。万一它是人家混合物成绩,出口是在本身人T中具有最高点预测概率和的类。,换句话说,每个C(j)的p是积聚的。;万一是回归成绩,出口是本身人树的出口的分摊值。。

注:混合物末后评价规范,因应用CART。,因而,也应用了CART原则。,它们彼此不同的。。

混合物成绩(将范本分为一类),换句话说,团圆变量的成绩。,CART应用Gini值作为原则。界说为GiNi=1(p(i)*p(i)),P(i)是瞄准NOD材料集合I类范本的除。。譬如:分为2类,瞄准混合物上有100个范本。,居于首位地类有70个范本。,有30个范本属于次要的类。,则Gini=××03=,可以看出,类别散布越分摊,Gini值越大。,出色的散布越非齐次,Gini值越小。。在寻觅粹混合物特点和级限协定时,规范是:argmax(Gini-GiniLeft-GiniRight),寻觅粹特点F和级限协定TH,使得瞄准混合物的Gini值减去左子混合物的Gini和右子混合物的Gini值最大。

回归成绩,对立各种的简略,连续的应用argmax(Var VarLeft VarRight为原则,即瞄准混合物锻炼集方差的VAR相减减去左子混合物的方差VarLeft右子混合物方差VarRight值最大。

效能用法

OpenCV为随机丛林抚养互相牵连的类和应变量。详细应用方法列举如下。:

(1)最初应用CvRTParams界说你本身的限制因素,体式列举如下

 CvRTParams::CvRTParams(int max_depth, int min_sample_count, float regression_accuracy, bool use_surrogates, int max_categories, constfloat* priors, bool calc_var_importance, int nactive_vars, int max_num_of_trees_in_the_forest, float forest_accuracy, int termcrit_type)

团限制因素代劳都在上面有,让我们的来议论一些缺勤代劳的限制因素的意思。

bool use_surrogates:可能的选择应用代劳,指的是,万一瞄准考查范本缺少些许特点,只是,瞄准混合物上的混合物或回归特点只有TH。,因而同样范本不克不及持续向前。,万一未手脚能够到的范围叶混合物,无预测出口,这种情况下,分摊出口可以用叶混合物在上面的本身人子混合物中中止预测。,预测出口作为同样范本。

const float*priors:先验知,这是指,先验散布可以由于每个类别达到目标范本数字。,对它们中止额外的。比方:万一有3种,居于首位地种范本占总锻炼集的80%。,其余的两类使分裂生殖占10%。,因而,该材料集合的材料是例外的非齐次的。,万一每个类的范本都是额外的的,纵然本身人的范本都被预测为居于首位地类,因而精确为80%。,这显然是无理性的的。,因而,我们的需求增殖后两类的重任。,后两类的混合物精确无能力的太低。

float regression_accuracy:回归树的堵塞状态,万一TH上本身人范本的真实值和预测值经过的多样性,中止此混合物的从事制造,并将其乐趣叶混合物。

后头碰见,这些限制因素在决策树中受到了解说。,英文阐明在这时

详细榜样列举如下,个体的邀请是在线碰见的。,我把它样式了人家可以读取MNIST材料并将其混合物的表格。,列举如下:

#include        // opencv general include file
#include           // opencv machine learning include file
#include 

usingnamespace cv; // OpenCV API is in the C++ "cv" namespace/******************************************************************************/// global definitions (用于 speed and ease of 应用)
//手迹数字使著名#define NUMBER_OF_TRAINING_SAMPLES 60000
#define ATTRIBUTES_PER_SAMPLE 784
#define NUMBER_OF_TESTING_SAMPLES 10000

#define NUMBER_OF_CLASSES 10

// N.B. classes are integer handwritten digits in range 0-9/******************************************************************************/// loads the sample database from file (哪个) is a CSV text 寄给报社)
inline void revertInt(int&x)
{
    x=((x&0x000000ff)<<24)|((x&0x0000ff00)<<8)|((x&0x00ff0000)>>8)|((x&0xff000000)>>24);
};

int read_data_from_csv(constchar* samplePath,constchar* labelPath, Mat data, Mat classes,
                       int n_samples )
{
    FILE* sampleFile=fopen(samplePath,"rb");
    FILE* labelFile=fopen(labelPath,"rb");
    int mbs=0,number=0,col=0,row=0;
    fread(&mbs,4,1,sampleFile);
    fread(&number,4,1,sampleFile);
    fread(&row,4,1,sampleFile);
    fread(&col,4,1,sampleFile);
    revertInt(mbs);
    revertInt(number);
    revertInt(row);
    revertInt(col);
    fread(&mbs,4,1,labelFile);
    fread(&number,4,1,labelFile);
    revertInt(mbs);
    revertInt(number);
    unsigned char temp;
    for(int line = 0; line < n_samples; line++)
    {
        // for each attribute on the line in the filefor(int attribute = 0; attribute < (ATTRIBUTES_PER_SAMPLE + 1); attribute++)
        {
            if (属性 < ATTRIBUTES_PER_SAMPLE)
            {
                // first 64 elements (0-63) in each line are the attributes
                弗雷德(体温),1,1,sampleFile);
                //FSCANF(F), "%f,", TMP)
                data.at<float(线), 属性) = static_cast<float>(暂时)
                // %F,", (线), 属性));            }
            elseif (属性 == ATTRIBUTES_PER_SAMPLE)
            {
                // attribute 65 is the class label {0 ... 9}
                弗雷德(体温),1,1,labelFile);
                //FSCANF(F), "%f,", TMP)
                classes.at<float(线), 0) = static_cast<float>(暂时)
                // %F\n", (线), 0));            }
        }
    }
    fclose(sampleFile);
    fclose(labelFile);
    return1; // all OK}

/******************************************************************************/int main( int argc, char** argv )
{
    
    for (int i=0; i< argc; i++)
        燃烧:咳嗽<std::endl;
    
    // lets just check the version first
    printf ("OpenCV version %s (%d.%d.%d)\n",
            CV_VERSION,
            CV_MAJOR_VERSION, CV_MINOR_VERSION, CV_SUBMINOR_VERSION);
    
    //界说锻炼材料和附加矩阵
    Mat training_data = Mat(NUMBER_OF_TRAINING_SAMPLES, ATTRIBUTES_PER_SAMPLE, CV_32FC1);
    Mat training_classifications = Mat(NUMBER_OF_TRAINING_SAMPLES, 1, CV_32FC1);

    //界说考查材料矩阵和附加
    Mat testing_data = Mat(NUMBER_OF_TESTING_SAMPLES, ATTRIBUTES_PER_SAMPLE, CV_32FC1);
    Mat testing_classifications = Mat(NUMBER_OF_TESTING_SAMPLES, 1, CV_32FC1);

    // define all the attributes as numerical
    // alternatives are CV_VAR_CATEGORICAL or CV_VAR_ORDERED(=CV_VAR_NUMERICAL)
    // that can be assigned on a per attribute basis
    Mat var_type = Mat(ATTRIBUTES_PER_SAMPLE + 1, 1, CV_8U );
    (Scalar(CV_VAR_NUMERICAL) ); // all inputs are numerical

    // this is a classification problem (i.e. predict a discrete number of class
    // 出口) so reset the last (+1) output var_type element to CV_VAR_CATEGORICAL
    var_type.at(ATTRIBUTES_PER_SAMPLE, 0) = CV_VAR_CATEGORICAL;

    double result; // value returned from a prediction

    //培养锻炼材料集和考查材料集if (read_data_from_csv(argv[1],argv[2], training_data, training_classifications, NUMBER_OF_TRAINING_SAMPLES) &&
            read_data_from_csv(argv[3],argv[4], testing_data, testing_classifications, NUMBER_OF_TESTING_SAMPLES))
    {
      /********************************试图贿赂1:界说设定初值随机 Trees的限制因素******************************/float priors[] = {1,1,1,1,1,1,1,1,1,1};  // weights of each classification for classes
        CvRTParams 帕拉姆 = CvRTParams(20, // max depth50, // min sample count0, // regression accuracy: N/A herefalse, // compute surrogate split, no missing data15, // max number of categories (应用) sub-optimal algorithm for larger 数字)
                                       priors, // the array of priorsfalse,  // calculate variable importance50,       // number of variables randomly selected at node and used to find the best 分裂生殖(S)100,     // max number of trees in the forest0.01f,                // forest accuracy
                                       CV_TERMCRIT_ITER |    CV_TERMCRIT_EPS // termination cirteria                                      );

        /****************************试图贿赂2:锻炼 Random Decision 丛林(RDF)混合物器*/
        printf( "尼采 training database: %s\n\n", argv[1]);
        CvRTrees* RTER = new CvRTrees;
        bool train_result=RTER->train(training_data, CV_ROW_SAMPLE, training_classifications,
                     Mat(), Mat(), var_type, Mat(), 帕拉姆);
//        float train_error=RTER->get_train_error();
//        行列 error:%f\n",train_error);
        // perform classifier testing and report results        Mat test_sample;
        int correct_class = 0;
        int wrong_class = 0;
        int false_positives [NUMBER_OF_CLASSES] = {0,0,0,0,0,0,0,0,0,0};

        printf( "尼采 testing database: %s\n\n", argv[2]);

        for (int tsample = 0; tsample < NUMBER_OF_TESTING_SAMPLES; tsample++)
        {

            // extract a row from the testing matrix
            test_sample = (tsample);
        /********************************试图贿赂3:预测*********************************************/
            result = RTER->predict(test_sample, Mat());

            printf("Testing Sample %i -> class result (数字) %d)\n", tsample, (int) 末后)

            // if the prediction and the (真) testing classification are the same
            // (N.B. openCV uses a floating point decision tree implementation!)if (FAB(末后) - testing_classifications.at<float>(tsample, 0))
                    >= FLT_EPSILON)
            {
                // if they differ more than floating point error => wrong class
                wrong_class++;
                false_positives[(int) 末后];
            }
            else
            {
                // otherwise correct
                correct_class++;
            }
        }

        printf( "NREST on the testing database: %s\n""\tCorrect classification: %d (%g%%)\n""\tWrong classifications: %d (%g%%)\n",
                argv[2],
                correct_class, (double) correct_class*100/NUMBER_OF_TESTING_SAMPLES,
                wrong_class, (double) wrong_class*100/NUMBER_OF_TESTING_SAMPLES);

        for (int i = 0; i < NUMBER_OF_CLASSES; i++)
        {
            printf( "\tClass (数字) %d) false postives     %d (%g%%)\n", i,
                    false_positives[i],
                    (double) false_positives[i]*100/NUMBER_OF_TESTING_SAMPLES);
        }

        // all matrix memory free by destructors

        // all OK : main returns 0return0;
    }

    // not OK : main returns -1return -1;
}

可以从本网站下载MNIST示例,方法途径,你可以直接地跑。。

三。方法设计随机丛林平面图

偶尔现相当书屋不发作邀请。,我们的需求设计人家混合物器算法。,本条引见方法设计本身的随机丛林混合物器。,不贴编码了解,因它在工作中应用。,因而它更敏感。。

率先,具有随机丛林类别,它阻止了总数树所需的些许限制因素。,包孕但不限于:锻炼范本尺寸、考查范本尺寸、特点维数、从每个混合物随机提炼物特点维数、费力搬运的数字、树的最大吃水、类别数字(万一它是人家混合物成绩)、些许堵塞状态、指导本身人树的帮助,锻炼集帮助与考查集,锻炼集附加的帮助等。。寂静更多的效能。,无论如何有行列和预测。。每一棵树的列车方法都可以连续的在行列上电话联络。,预测是类似于的。,只是每个树的预测出口得被处置。,受到丛林的预测输出。

其次,有起形成作用的人课,此类不用于贮存器锻炼集和符合的的附加。,这是因,每棵树、每个混合物都有本身的范本集。,万一贮存器每个范本集的和,所需内存太大。,假定范本数为m,特点维度是N.,则总数锻炼集尺寸为M×N,每棵树的每地层都有深深地的范本。,树的吃水是D,有树。,M x n x x x s的贮存器当空是不可缺少的人或物的。。太大了。。因而,在每个混合物锻炼中应用的锻炼范本和特点,我们的都应用串行街区替代。,示例类治理此经营。SAPLE的效能首要需求两个。,一是从目前的锻炼中随机提炼物新的锻炼集。,自然,仅范本数。次要的个效能是随机提炼物一定数字的特点。,同样地,这也特点序列号。。

之后,树类是不可缺少的人或物的。,代表每棵树,它阻止树的些许限制因素和指导本身人混合物的帮助。。

鞋楦,混合物类是不可缺少的人或物的。,表现树的每个混合物。

需求阐明的是,阻止树木的方法可以是最公共用地的街区。,它也矢径。。混合物以能与之比拟的东西的方法阻止。,但个体不可取之处互连列表。,顺序和效能处置太故障,但节省当空的当空决不多。。

现时写的这样了,鞋楦,我将较远的膨胀物这偏爱的。。

#

吐艳源码Github上的简略随机丛林顺序,包体锻炼、预测分得的财产,帮助混合物回归成绩,有MNIST火车的邀请,附上很多正文。,更发作基础课学术,地址:

发表评论

电子邮件地址不会被公开。 必填项已用*标注