機器學習-boosting

boosting和隨機森林在內部使用了決策樹,所以繼承了樹的很多有用性質。
在監督學習領域,有一種想法就是從很多弱分類器重學習得到一個強分類器。boosting算法,也叫AdaBoosting。
注:
Boosting意爲加強、提升,也就是說將弱分類器提升爲強分類器。而我們常聽到的AdaBoost是Boosting發展到後來最爲代表性的一類。所謂AdaBoost,即Adaptive Boosting,是指弱分類器根據學習的結果反饋Adaptively調整假設的錯誤率,所以也不需要任何的先驗知識就可以自主訓練。Breiman在他的論文裏讚揚AdaBoost是最好的off-the-shelf方法。
boosting算法的主要特徵是在訓練過程中,這個代價將會更新,使得後來的弱分類器更加關注與前面的分類器沒有分對的數據點。算法如下:
這裏寫圖片描述
這裏寫圖片描述

OpenCV2中有四種類型的boosting。
Boost::DISCRETE
Boost::REAL
Boost::LOGIT
Boost::GENTLE
實踐發現,real和gentle的效果最好。
real利用了置信區間預測,在標籤數據上有很好的性能。
gentle對外圍數據賦予較小的值,所以在處理迴歸問題上效果很好。
opencv boost算法只能用於二分類問題。
boosting算法訓練了T個弱分類,這些弱分類器很簡單,大多數情況下,他們只是包含了一次分裂或僅有的幾次分裂。adaboost訓練時輸入的特徵向量是xi ,向量的類別標籤是yi ,y的取值爲1或者-1。
首先就是初始化數據樣本的權值來告分類器將一個數據點分類錯誤的代價是多少。boosting算法的主要特徵是在訓練過程中,這個代價將會更新,使得後來的弱分類器更加關注與前面的分類器沒有分對的數據點。
boosting的代碼與決策樹的代碼很相似,但是除了決策樹的參數,他還有自己的控制參數。
這裏寫圖片描述

測試代碼:

// OpenCV.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/ml/ml.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    //訓練樣本  
    float trainingData[42][2]={ {40, 55},{35, 35},{55, 15},{45, 25},{10, 10},{15, 15},{40, 10},  
    {30, 15},{30, 50},{100, 20},{45, 65},{20, 35},{80, 20},{90, 5},  
    {95, 35},{80, 65},{15, 55},{25, 65},{85, 35},{85, 55},{95, 70},  
    {105, 50},{115, 65},{110, 25},{120, 45},{15, 45},  
    {55, 30},{60, 65},{95, 60},{25, 40},{75, 45},{105, 35},{65, 10},  
    {50, 50},{40, 35},{70, 55},{80, 30},{95, 45},{60, 20},{70, 30},  
    {65, 45},{85, 40}   };  
    Mat trainingDataMat(42, 2, CV_32FC1, trainingData);   
    //訓練樣本的響應值  
    float responses[42] = {'R','R','R','R','R','R','R','R','R','R','R','R','R','R','R','R',  
        'R','R','R','R','R','R','R','R','R','R',  
        'B','B','B','B','B','B','B','B','B','B','B','B','B','B','B','B' };  
    Mat responsesMat(42, 1, CV_32FC1, responses);  

    float priors[2] = {1, 1};    //先驗概率  

    CvBoostParams params( CvBoost::REAL, // boost_type    
        10, // weak_count    
        0.95, // weight_trim_rate    
        15, // max_depth    
        false, // use_surrogates    
        priors // priors   
        );    

    CvBoost boost;  
    boost.train (   trainingDataMat,   
        CV_ROW_SAMPLE,   
        responsesMat,  
        Mat(),    
        Mat(),  
        Mat(),  
        Mat(),    
        params  
        );    
    //預測樣本  
    float myData[2] = {55, 25};  
    Mat myDataMat(2, 1, CV_32FC1, myData);  
    double r = boost.predict( myDataMat );  

    cout<<endl<<"result:  "<<(char)r<<endl;  

    getchar();
    return 0;
}

要記住:每一個弱分類器使用的是stump算法,單決策樹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章