Press "Enter" to skip to content

TensorFlow决策森林构建GBDT(Python)

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

 

一、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/

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。