Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TensorFlow决策森林构建GBDT(Python) #50

Open
aialgorithm opened this issue May 5, 2022 · 0 comments
Open

TensorFlow决策森林构建GBDT(Python) #50

aialgorithm opened this issue May 5, 2022 · 0 comments

Comments

@aialgorithm
Copy link
Owner

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant