opencv boosting学习
集成算法
用一些相对较弱的学习模型独立地就同样的样本进行训练,然后把结果整合起来进行整体预测(弱分类器组合成强分类器进行分类的方法)。
主要难点在于究竟集成哪些独立的较弱的学习模型以及如何把学习结果整合起来。
集成算法是一类非常强大的算法,同时也非常流行。
常见的算法包括:Boosting, Bootstrapped Aggregation(Bagging), AdaBoost,堆叠泛化(Stacked Generalization, Blending),
梯度推进机(Gradient Boosting Machine, GBM),随机森林(Random Forest)
强可学习:一个多项式的学习算法,正确率很高
弱可学习:一个多项式学习算法,正确率仅比随机猜想略高
弱可学习可以提升为强可学习
Boosting弱学习器提升为强学习器的过程。
Boosting可以产生一系列的学习器,后产生的学习器的训练集取决于之前的产生的学习器,之前被误判的示例在之后获得较大的概率
Boosting
是一种集合分类器,是集成算法的一种,是一个可提高弱分类算法准确度的框架,根据一个基分类器,不断提升错误样本的权重,降低正确样本权重,迭代生成一堆分类器,
然后将这些分类器进行融合产生强分类器(级联分类器),其迭代过程中误判率高的在下一个分类器中提高权重。
框架中的产生单个的基分类器时可用相同的分类算法,也可用不同的分类算法,这些算法一般是不稳定的弱分类算法,如神经网络(BP) ,决策树(C4.5)等。
(集成学习是利用某种规则将各个同质(如都是决策树)的学习器进行整合,从而比单个学习器获得更好的学习效果。)
(Deep Learning之前,SVM和Adaboost是效果较好的两个算法)
Adaboost adaptive boosting 自适应boosting是代表算法,是指弱分类器根据学习的结果反馈Adaptively调整假设的错误率,直到达到某个预订的足够小的错误率或者达到预先定义的最大迭代次数,
所以也不需要任何的先验知识就可以自主训练
AdaBoosting:
Discrete Adaboost, Real AdaBoost, LogitBoost, Gentle AdaBoost,所有方法训练的框架的都是相似的:
1、初始化每个样本相同的权重
2、使用加权的样本训练每个弱分类器
3、分类后得到加权的训练错误率和比例因子
4、将被错误分类的样本的权重加大,并将修改后的权重再次归一化
5、循环训练过程,
6、最终使用比例因子 组合弱分类器构成最终的强分类器
实际训练中弱分类器是一样的,但弱分类器实际使用的训练数据不同,通常使用特征向量的每一维分别构成一个弱分类器。
Haar+Adaboost人脸检测方法是使用每种Haar特征构成一个弱分类器
AdaBoost、Boosting算法处:
AdaBoost的各个弱分类器是通过改变数据分布来实现的,每次训练后,根据弱分类器的评价结果,更新样本权重,进而影响下一次训练。
使用AdaBoost分类器可以排除一些次要的训练数据特征,将注意力放在关键的特征上面
struct CV_EXPORTS_W_MAP CvBoostParams : public CvDTreeParams
{
CV_PROP_RW int boost_type;
CV_PROP_RW int weak_count;
CV_PROP_RW int split_criteria;
CV_PROP_RW double weight_trim_rate;
//1、定义CvBoostParams
CvBoostParams();
CvBoostParams( int boost_type, int weak_count, double weight_trim_rate,
int max_depth, bool use_surrogates, const float* priors );
};
class CV_EXPORTS_W CvBoost : public CvStatModel
{
public:
// Boosting type
enum { DISCRETE=0, REAL=1, LOGIT=2, GENTLE=3 };
// Splitting criteria
enum { DEFAULT=0, GINI=1, MISCLASS=3, SQERR=4 };
...
CV_WRAP CvBoost( const cv::Mat& trainData, int tflag,
const cv::Mat& responses, const cv::Mat& varIdx=cv::Mat(),
const cv::Mat& sampleIdx=cv::Mat(), const cv::Mat& varType=cv::Mat(),
const cv::Mat& missingDataMask=cv::Mat(),
CvBoostParams params=CvBoostParams() );
//2、训练
CV_WRAP virtual bool train( const cv::Mat& trainData, int tflag,
const cv::Mat& responses, const cv::Mat& varIdx=cv::Mat(),
const cv::Mat& sampleIdx=cv::Mat(), const cv::Mat& varType=cv::Mat(),
const cv::Mat& missingDataMask=cv::Mat(),
CvBoostParams params=CvBoostParams(),
bool update=false );
//3、预测
CV_WRAP virtual float predict( const cv::Mat& sample, const cv::Mat& missing=cv::Mat(),
const cv::Range& slice=cv::Range::all(), bool rawMode=false,
bool returnSum=false ) const;
};