梯度提升树(GBDT)

2018-07-03  本文已影响29人  魏佳斌

sklearn机器学习库

集成学习(ensemble learning)

集成学习并非某一种机器学习算法,更像是一种理念。顾名思义,它把各种学习算法集成在一样,“博采众长”。集成学习可以用于分类问题集成,回归问题集成,特征选取集成,异常点检测集成等等。

从下图,我们可以对集成学习的思想做一个概括。对于训练集数据,我们通过训练若干个个体学习器,通过一定的结合策略,就可以最终形成一个强学习器,以达到博采众长的目的。

image

个人学习器

第一是如何选择个体学习器,个体选择器可以是同质的,比如用一堆决策树,构成随机森林;另外神经网络就是典型的“集成”一堆神经元。理论上讲,这些个体选择器也可以不同,比如将SVM,贝叶斯以及逻辑回归集成到一起。业内目前研究比较多的是同质的个体学习器。

Boosting

Boosting是提升的意思,也就是个体学习器之间是串行的关系。前者的输出是后者的输出,一步步“提升”实现强学习器。

Boosting系列算法里最著名算法主要有AdaBoost算法和提升树(boosting tree)系列算法。提升树系列算法里面应用最广泛的是梯度提升树(Gradient Boosting Tree)

Bagging

Bagging是打包的意思,也就是说个体学习之间没能强的依赖关系。对于共同的输入样本,每个都“投机采样”,这样N个学习器输出结果不尽相同的。

结合策略

对于前面N个学习器的输出结果,如果来判断最终的分类呢?最简单是取平均数,或者“投票法”,也就是“少数服从多数”。当然更严谨的方法,可以是再加一层学习器,把前面N个结果作为输入,经过学习器来判定最终的结果。

代码实例

梯度提升树(GBDT)

导入pandas,GBDT分类器

import pandas as pd
from sklearn.ensemble import GradientBoostingClassifier
from sklearn import cross_validation, metrics

使用pandas从csv里读取数据并简单分析:

train = pd.read_csv('train_modified.csv')
print(train.head())
print(train['Disbursed'].value_counts())

数据集2W行,第行51列:

 Disbursed  Existing_EMI           ID  Loan_Amount_Applied  \
0          0           0.0  ID000002C20               300000   
1          0           0.0  ID000004E40               200000   
2          0           0.0  ID000007H20               600000   
3          0           0.0  ID000008I30              1000000   
4          0       25000.0  ID000009J40               500000   

   Loan_Tenure_Applied  Monthly_Income  Var4  Var5  Age  \
0                    5           20000     1     0   37   
1                    2           35000     3    13   30   
2                    4           22500     1     0   34   
3                    5           35000     3    10   28   
4                    2          100000     3    17   31   

   EMI_Loan_Submitted_Missing    ...     Var2_2  Var2_3  Var2_4  Var2_5  \
0                           1    ...          0       0       0       0   
1                           0    ...          0       0       0       0   
2                           1    ...          0       0       0       0   
3                           1    ...          0       0       0       0   
4                           1    ...          0       0       0       0   

   Var2_6  Mobile_Verified_0  Mobile_Verified_1  Source_0  Source_1  Source_2  
0       1                  1                  0         1         0         0  
1       1                  0                  1         1         0         0  
2       0                  0                  1         0         0         1  
3       0                  0                  1         0         0         1  
4       0                  0                  1         0         0         1  

数据分类是如下分布,label是0的分类居多数:

0    19680
1      320

把X,y数据分开,用于训练:

target='Disbursed' # Disbursed的值就是二元分类的输出
IDcol = 'ID'
x_columns = [x for x in train.columns if x not in [target, IDcol]]
X = train[x_columns]
y = train['Disbursed']

模型训练:

gbc = GradientBoostingClassifier(random_state=10)
gbc.fit(X,y)

模型预测,predict返回Nx1的ndarray,与真实值y.values计算准确率。可以看出gbdt默认参数的精度已经很高了。

y_pred = gbc.predict(X)
print("Accuracy : %.4g" % metrics.accuracy_score(y.values, y_pred))
#Accuracy : 0.9852

评估ROC_AUC:

y_predprobs = gbc.predict_proba(X)
print('概率矩阵:',y_predprobs)
y_predprob = y_predprobs[:,1]
print("AUC Score (Train): %f" % metrics.roc_auc_score(y, y_predprob))

分类横型的评估:
ROC字面翻译是“受试者工作特征”(Receiver Operating Characteristic)。ROC曲线的面积就是AUC(Area Under the Curve)。AUC用于衡量“二分类问题”机器学习算法性能(泛化能力)。

ROC就是以FPR为横轴,TPR为纵轴。

上一篇下一篇

猜你喜欢

热点阅读