美文网首页大数据,机器学习,人工智能
TensorFlow决策森林构建GBDT(Python)

TensorFlow决策森林构建GBDT(Python)

作者: 算法进阶 | 来源:发表于2022-05-05 18:20 被阅读0次

    一、Deep Learning is Not All You Need

    尽管神经网络在图像识别、自然语言等很多领域大放异彩,但回到表格数据的数据挖掘任务中,树模型才是低调王者,如论文《Tabular Data: Deep Learning is Not All You Need》提及的:

    深度学习可能不是解决所有机器学习问题的灵丹妙药,通过树模型在处理表格数据时性能与神经网络相当(甚至优于神经网络),而且树模型易于训练使用,有较好的可解释性。

    二、树模型的使用

    对于决策树等模型的使用,通常是要到scikit-learn、xgboost、lightgbm等机器学习库调用, 这和深度学习库是独立割裂的,不太方便树模型与神经网络的模型融合。


    一个好消息是,Google 开源了 TensorFlow 决策森林(TF-DF),为基于树的模型和神经网络提供统一的接口,可以直接用TensorFlow调用树模型。决策森林(TF-DF)简单来说就是用TensorFlow封装了常用的随机森林(RF)、梯度提升(GBDT)等算法,其底层算法是基于C++的 Yggdrasil 决策森林 (YDF)实现的。

    三、TensorFlow构建GBDT实践

    TF-DF安装很简单pip install -U tensorflow_decision_forests,有个遗憾是目前只支持Linux环境,如果本地用不了将代码复制到 Google Colab 试试~

    • 本例的数据集用的癌细胞分类的数据集,首先加载下常用的模块及数据集:
    import numpy as np  
    import pandas as pd
    import matplotlib.pyplot as plt
    import tensorflow as tf
    tf.random.set_seed(123)
    
    from sklearn import datasets
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import precision_score, recall_score, f1_score,roc_curve
    
    dataset_cancer = datasets.load_breast_cancer()    # 加载癌细胞数据集
    
    #print(dataset_cancer['DESCR'])
    
    df = pd.DataFrame(dataset_cancer.data, columns=dataset_cancer.feature_names)  
    
    df['label'] = dataset_cancer.target
    
    print(df.shape)
    
    df.head()
    
    • 划分数据集,并简单做下数据EDA分析:
    # holdout验证法: 按3:7划分测试集 训练集
    x_train, x_test= train_test_split(df, test_size=0.3)
    
    # EDA分析:数据统计指标
    x_train.describe(include='all')
    
    • 构建TensorFlow的GBDT模型:
      TD-DF 一个非常方便的地方是它不需要对数据进行任何预处理。它会自动处理数字和分类特征,以及缺失值,我们只需要将df转换为 TensorFlow 数据集,如下一些超参数设定:



      模型方面的树的一些常规超参数,类似于scikit-learn的GBDT


    此外,还有带有正则化(dropout、earlystop)、损失函数(focal-loss)、效率方面(goss基于梯度采样)等优化方法:

    构建模型、编译及训练,一步到位:

    # 模型参数
    model_tf = tfdf.keras.GradientBoostedTreesModel(loss="BINARY_FOCAL_LOSS")
    
    # 模型训练
    model_tf.compile()
    model_tf.fit(x=train_ds,validation_freq=0.1)
    
    • 评估模型效果
    ## 模型评估
    可以看到test的准确率已经都接近1,可以再那个困难的数据任务试试~
    evaluation = model_tf.evaluate(test_ds,return_dict=True)
    probs = model_tf.predict(test_ds)
    fpr, tpr, _ = roc_curve(x_test.label, probs)
    plt.plot(fpr, tpr)
    plt.title('ROC curve')
    plt.xlabel('false positive rate')
    plt.ylabel('true positive rate')
    plt.xlim(0,)
    plt.ylim(0,)
    plt.show()
    print(evaluation)
    
    • 模型解释性
      GBDT等树模型还有另外一个很大的优势是解释性,这里TF-DF也有实现。
      模型情况及特征重要性可以通过print(model_tf.summary())打印出来,

      特征重要性支持了几种不同的方法评估:

    MEAN_MIN_DEPTH指标。 平均最小深度越小,较低的值意味着大量样本是基于此特征进行分类的,变量越重要。


    NUM_NODES指标。它显示了给定特征被用作分割的次数,类似split。此外还有其他指标就不一一列举了。


    我们还可以打印出模型的具体决策的树结构,通过运行tfdf.model_plotter.plot_model_in_colab(model_tf, tree_idx=0, max_depth=10),整个过程还是比较清晰的。

    小结

    基于TensorFlow的TF-DF的树模型方法,我们可以方便训练树模型(特别对于熟练TensorFlow框架的同学),更进一步,也可以与TensorFlow的神经网络模型做效果对比、树模型与神经网络模型融合、利用异构模型先特征表示学习再输入模型(如GBDT+DNN、DNN embedding+GBDT),进一步了解可见如下参考文献。

    参考文献:
    https://www.tensorflow.org/decision_forests/
    https://keras.io/examples/structured_data/classification_with_tfdf/

    相关文章

      网友评论

        本文标题:TensorFlow决策森林构建GBDT(Python)

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