kaggle上也有一个类似的贷款违约比赛,天池这个比赛的论坛上帖子比较少,那上面有个表现很不错的用的是GBM算法,这星期学习一下看看能不能用到比赛里。
一个分类,如果存在一个多项式算法能够学习他,并得到很高的正确率,那么这个算法称为强学习器,反之如果正确率只是稍大于随机猜测(50%),则称为弱学习器。 弱学习器比强学习器更容易获得,所以就有了能否把弱学习器提升(boosting)为强学习器的需求。 给定一个二分类的训练数据集:T=(x1,y1),(x2,y2),……,(xN,yN),标记yi∈{−1,1}。 初始化训练数据的权值分布 指定生成T个学习器进行T次迭代。 第t次迭代根据前一次得到的权值分布Dt训练数据集,得到弱分类器 计算 Gt(x)在权值分布 Dt上的分类误差 误差是当前学习器得到的未正确分类数据项对应的权值之和,也就是说adaboost算法的分类误差是受权值分布Dt影响的。 计算当前学习器Gt(x)的权值 这个权值是用在最后线性组合时乘在分类器前的,仔细观察这个函数式不难发现当et≤1/2时,αt>0,并且随着et的减小而增大,也就是说分类误差越小分类器的权值越大,这里还可以看出可以看出权值分布Dt通过影响et来影响了αt,这是Dt的第一个影响。 更新权值分布 Dt+1(x) 分析第二个等式可知当Gt(xi)≠yi时,wt+1,i=wt,i / Zm * exp(αt), Gt(xi)=yi 时wt+1,i=wt,i / Zm * exp(−αt),说明当前分类器的错误分类数据对应的下一次权值被扩大了,正确分类的权值被缩小了,也就是Gt影响et影响αt。 构建最终的分类器。
也就是说,w在整个迭代的过程中是作为一个标记,不断变换,统计弱分类器对每个数据处理的正确程度,通过影响et影响αt也就是最终弱分类器的权值,使得那些判断更正确的分类器占有更大的比重。
算法步骤可以总结如下: 1.输入训练数据 (xi,yi); 2.构建提升树模型 fM(x) 3.初始化 f0(x)=0 对于第m步,首先计算残差 然后根据残差求取误差函数最小化的分类器,得到树模型 更新提升树模型
了解了adaboost和提升树算法后,就很容易理解GBM算法了。GBM(提升器)算法,又名GBDT,是基于梯度下降算法得到提升树模型。它与提升树的关键不同之处,就在于残差更新的方式,下面来看看GBM的的计算步骤; 输入训练数据(xi,yi); 构建提升树模型fM(x) 初始化 从1到M迭代 对于第m个基学习器,首先计算梯度 根据梯度学习第m个学习器
通过line search求取最佳步长
令 fm=βmΘ′m,更新,模型
用了lghtGBM自带的data
import json import lightgbm as lgb import pandas as pd from sklearn.metrics import roc_auc_score path="D:/data/" print("load data") df_train=pd.read_csv(path+"regression.train.csv",header=None,sep='\t') df_test=pd.read_csv(path+"regression.train.csv",header=None,sep='\t') y_train = df_train[0].values y_test = df_test[0].values X_train = df_train.drop(0, axis=1).values X_test = df_test.drop(0, axis=1).values # create dataset for lightgbm lgb_train = lgb.Dataset(X_train, y_train) lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train) # specify your configurations as a dict params = { 'task': 'train', 'boosting_type': 'gbdt', 'objective': 'binary', 'metric': {'l2', 'auc'}, 'num_leaves': 31, 'learning_rate': 0.05, 'feature_fraction': 0.9, 'bagging_fraction': 0.8, 'bagging_freq': 5, 'verbose': 0 } print('Start training...') # train gbm = lgb.train(params, lgb_train, num_boost_round=20, valid_sets=lgb_eval, early_stopping_rounds=5) print('Save model...') # save model to file gbm.save_model(path+'lightgbm/model.txt') print('Start predicting...') # predict y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration) # eval print(y_pred) print('The roc of prediction is:', roc_auc_score(y_test, y_pred) ) print('Dump model to JSON...') # dump model to json (and save to file) model_json = gbm.dump_model() with open(path+'lightgbm/model.json', 'w+') as f: json.dump(model_json, f, indent=4) print('Feature names:', gbm.feature_name()) print('Calculate feature importances...') # feature importances print('Feature importances:', list(gbm.feature_importance()))