Kaggle已经成为练习数据科学技能和参加机器学习模型建立比赛的首选之地。本教程将提供一个简单易行的教程,介绍如何使用TensorFlow Decision Forests开始Kaggle笔记本。它是一个库,允许你在TensorFlow中训练基于树的模型(如随机森林和梯度增强树)。
为什么你应该对决策森林感兴趣?Kaggle比赛大致有两种类型--获胜的解决方案(神经网络或决策森林)取决于你正在处理的数据种类。
如果你处理的是表格数据问题(这些问题涉及训练一个模型对电子表格中的数据进行分类,这是一个非常常见的情况)--获胜的解决方案通常是决策森林。然而,如果你正在处理一个涉及教计算机看或听的感知问题(例如,图像分类),获胜的模型通常是一个神经网络。
这里是好消息的开始。你只需要几行代码就可以在TensorFlow中实现一个决策森林。这种相对简单的模型在许多Kaggle问题上往往比神经网络更胜一筹。
我们将用Kaggle的一个简单的数据集来探索决策森林库,我们将用Kaggle Kernels建立我们的模型,Kaggle Kernels允许你使用免费的云计算能力完全在线建立和训练你的模型--与Colab类似。该数据集包含车辆信息,如成本、车门数量、占用率和维修费用,我们将利用这些信息对汽车进行评估。
Kaggle Kernels可以通过你的Kaggle账户访问。如果你没有账户,请从注册开始。在主页上,选择左侧菜单中的 "代码 "选项,并选择 "新笔记本",这将打开一个新的Kaggle内核。
一旦我们从Kaggle Kernels打开了一个新的笔记本,我们就把汽车评估数据集下载到我们的环境中。点击笔记本右上角附近的 "添加数据",搜索 "汽车评估",然后添加数据集。
现在我们准备开始写代码了。安装TensorFlow Decision Forests库和必要的导入,如下图所示。本博文中的代码来自于用TensorFlow Decision Forests构建、训练和评估模型的 教程,其中包含了更多的例子可以参考。
!pip install tensorflow_decision_forestsimport numpy as np
import pandas
import tensorflow_decision_forests as tfdf
我们现在将导入数据集。我们应该注意到,我们下载的数据集不包含标题,所以我们将根据数据集的Kaggle页面上提供的信息首先添加这些标题。在你开始使用数据集之前,在你最喜欢的文本或电子表格编辑器中打开数据集,检查它是一个很好的做法。
df = pandas.read_csv("../input/car-evaluation-data-set/car_evaluation.csv")col_names =['buying price', 'maintenance price', 'doors', 'persons', 'lug_boot', 'safety', 'class']
df.columns = col_names
df.head()
然后,我们必须将数据集分成训练和测试。
def split_dataset(dataset, test_ratio=0.30): test_indices = np.random.rand(len(dataset)) < test_ratio
return dataset[~test_indices], dataset[test_indices]
train_ds_pd, test_ds_pd = split_dataset(df)print("{} examples in training, {} examples for testing.".format(
len(train_ds_pd), len(test_ds_pd)))
最后,我们将把数据集转换为tf.data格式。这是一种高性能的格式,TensorFlow用它来更有效地训练模型,用TensorFlow Decision Forests,你可以用一行代码将你的数据集转换成这种格式。
train_ds = tfdf.keras.pd_dataframe_to_tf_dataset(train_ds_pd, label="class")
test_ds = tfdf.keras.pd_dataframe_to_tf_dataset(test_ds_pd, label="class")
现在,你可以通过执行以下内容来立即训练你的模型。
model = tfdf.keras.RandomForestModel()model.fit(train_ds)
该库有很好的默认值,对于大多数问题来说都是一个很好的开始。对于高级用户来说,由于随机森林是可配置的,在API 文档中有很多选项可供选择。
一旦你训练好了模型,你可以看到它在测试数据上的表现。
model.compile(metrics=["accuracy"])print(model.evaluate(test_ds))
只用了几行代码,你就在这个小数据集上达到了>95%的准确率这是一个简单的数据集,有人可能会说,神经网络也可以产生令人印象深刻的结果。它们绝对可以(而且确实可以),特别是当你有非常大的数据集时(想想:几十万个例子,或者更多)。然而,神经网络需要更多的代码,并且是资源密集型的,因为它们需要明显更多的计算能力。
易于预处理
决策森林还有一个重要的优势:预处理数据的步骤较少。请注意,在上面的代码中,你能够将一个既有分类值又有数值的数据集直接传递给决策森林。你不需要做任何预处理,比如将数值归一化,将字符串转换为整数,以及对其进行一键编码。这有很大的好处。它使决策森林的工作更简单(所以你可以快速训练一个模型),而且可能出错的代码更少。
下面,你将看到这两种技术之间的一些重要区别。
易于解释
决策森林的一个重要优势是,它们易于解释。虽然决策树的管道与训练神经网络的管道有很大的不同,但为给定任务选择这些模型有很大的优势。这是因为用决策森林(决策树的集合)来确定特征的重要性是特别直接的。值得注意的是,TensorFlow决策森林库可以通过其模型绘图器功能将特征重要性可视化。让我们看看下面的工作原理
tfdf.model_plotter.plot_model_in_colab(model, tree_idx=0)
我们在左边的树根看到了例子的数量(1728)和不同颜色表示的相应分布。在这里,我们的模型关注的是汽车所能容纳的人数。绿色表示的最大部分代表2个人,红色代表4个人。此外,当我们沿着树往下走时,我们继续看树是如何分裂的,以及相应的例子的数量。根据条件,例子被分到两条路径中的一条。有趣的是,从这里我们还可以通过检查一个给定特征的所有分裂来确定一个特征的重要性,然后计算这个特征降低了多少方差。
决策树vs.神经网络
神经网络无疑具有令人难以置信的表示学习能力。虽然它们在这方面非常强大,但重要的是要考虑它们是否是解决手头问题的正确工具。当使用神经网络时,人们必须考虑很多关于他们将如何构建层的问题。相比之下,决策森林是开箱即用的(当然,高级用户可以调整各种参数)。
在逐层构建神经网络之前,大多数情况下人们必须进行特征预处理。例如,这可能包括将特征归一化,使其平均值为0,标准差为1,并将字符串转换为数字。基于树的模型可以直接跳过这个初始步骤,它可以原生地处理混合数据。
从上面的代码中可以看出,我们只需几个步骤就能得到结果。一旦我们得到了我们想要的指标,我们就必须在我们问题的背景下解释它们。也许决策树最重要的优势之一就是其可解释性。我们在上面的代码中看到了输出的图示。从根部开始,我们可以跟随分支,迅速了解模型是如何做出决定的。相比之下,神经网络是一个 "黑匣子",可能很难解释,也很难向非技术观众解释。