美文网首页
GBDT原理以及python的实现

GBDT原理以及python的实现

作者: ghostdogss | 来源:发表于2019-07-10 16:28 被阅读0次

    一、原理篇

    1.2 预测年龄(案例)

    仍然以预测同事年龄来举例,从《回归树》那篇文章中我们可以知道,如果需要通过一个常量来预测同事的年龄,平均值是最佳选择之一。

    1.3 年龄的残差

    我们不妨假设同事的年龄分别为5岁、6岁、7岁,那么同事的平均年龄就是6岁。所以我们用6岁这个常量来预测同事的年龄,即[6, 6, 6]。每个同事年龄的残差 = 年龄 - 预测值 = [5, 6, 7] - [6, 6, 6],所以残差为[-1, 0, 1]

    1.4 预测年龄的残差

    为了让模型更加准确,其中一个思路是让残差变小。如何减少残差呢?我们不妨对残差建立一颗回归树,然后预测出准确的残差。假设这棵树预测的残差是[-0.9, 0, 0.9],将上一轮的预测值和这一轮的预测值求和,每个同事的年龄 = [6, 6, 6] + [-0.9, 0, 0.9] = [5.1, 6, 6.9],显然与真实值[5, 6, 7]更加接近了, 年龄的残差此时变为[-0.1, 0, 0.1],预测的准确性得到了提升。

    1.5 GBDT

    重新整理一下思路,假设我们的预测一共迭代3轮 年龄:[5, 6, 7]

    第1轮预测:6, 6, 6

    第1轮残差:[-1, 0, 1]

    第2轮预测:6, 6, 6 + -0.9, 0, 0.9 = [5.1, 6, 6.9]

    第2轮残差:[-0.1, 0, 0.1]

    第3轮预测:6, 6, 6 + -0.9, 0, 0.9 + -0.08, 0, 0.07 = [5.02, 6, 6.97]

    第3轮残差:[-0.08, 0, 0.03]

    看上去残差越来越小,而这种预测方式就是GBDT算法。

    1.6 公式推导

    看到这里,相信您对GBDT已经有了直观的认识。这么做有什么科学依据么,为什么残差可以越来越小呢?前方小段数学公式低能预警。



    因此,我们需要通过用第m-1轮残差的均值来得到函数fm,进而优化函数Fm。而回归树的原理就是通过最佳划分区域的均值来进行预测。所以fm可以选用回归树作为基础模型,将初始值,m-1颗回归树的预测值相加便可以预测y。

    二、python实现

    from sklearn import datasets
    from sklearn.model_selection import train_test_split
    from sklearn.ensemble import GradientBoostingClassifier
    from sklearn import metrics
    
    # 导入鸢尾花的数据
    iris = datasets.load_iris()
    # 特征数据
    data = iris.data[:100] # 有4个特征
    # 标签
    label = iris.target[:100]
    
    # 提取训练集和测试集
    # random_state:是随机数的种子。
    train_x, test_x, train_y, test_y = train_test_split(data, label, random_state=0)
    
    # 模型训练,使用GBDT算法
    gbr = GradientBoostingClassifier(n_estimators=3000, max_depth=2, min_samples_split=2, learning_rate=0.1)
    gbr.fit(train_x, train_y)
    
    y_pred = gbr.predict(test_x)
    
    # ROC曲线下与坐标轴围成的面积
    print ('AUC: %.4f' % metrics.roc_auc_score(test_y,ypred))
    # 准确率
    print ('ACC: %.4f' % metrics.accuracy_score(test_y,y_pred))
    print ('Recall: %.4f' % metrics.recall_score(test_y,y_pred))
    # 精确率和召回率的调和平均数
    print ('F1-score: %.4f' %metrics.f1_score(test_y,y_pred))
    print ('Precesion: %.4f' %metrics.precision_score(test_y,y_pred))
    metrics.confusion_matrix(test_y,y_pred)
    

    相关文章

      网友评论

          本文标题:GBDT原理以及python的实现

          本文链接:https://www.haomeiwen.com/subject/bxmhkctx.html