TensorFlow决策森林构建GBDT(Python)
aialgorithm opened this issue · 0 comments
一、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/