当前位置: 首页 > 科技观察

最喜欢的随机森林?TensorFlow开源决策森林库TF-DF

时间:2023-03-22 15:35:58 科技观察

人工智能发展史上,各种算法可谓层出不穷。在过去十年中,深度神经网络的发展在机器学习领域取得了显着进步。通过构建分层或“深层”结构,模型能够在有监督或无监督的环境中从原始数据中学习到良好的表示,这被认为是它们成功的关键因素。深度森林是人工智能领域的重要研究方向之一。2017年,周志华、冯骥等人提出了深度森林框架,首次尝试使用树集成构建多层模型。2018年,周志华等人在他们的研究中探索多层决策树《Multi-Layered Gradient Boosting Decision Trees》。今年2月,周志华团队开源了深林软件包DF21:训练效率高,超参数少,可在普通设备上运行。就在最近,TensorFlow开源了TensorFlowDecisionForest(TF-DF)。TF-DF是SOTA算法的集合,用于训练、服务和解释决策森林模型的生产方面,包括随机森林和梯度提升树。现在,您可以将这些模型用于分类、回归和排名任务,并具有TensorFlow和Keras的灵活性和可组合性。谷歌大脑研究员、Keras之父Fran?oisChollet表示:“现在你可以使用KerasAPI来训练TensorFlow决策森林。”对于这个开源项目,网友们表示:“这很酷!随机森林是我最喜欢的模型。”决策森林决策森林是一系列机器学习算法,在质量和速度上可与神经网络相媲美(它比神经网络更易于使用且功能更强大),事实上,当与某些类型的数据一起使用时,它们比神经网络更有效.非常好,尤其是在处理表格数据时。随机森林是一种流行的决策森林模型。在这里,您可以看到一组树通过投票结果对示例进行分类。决策森林由许多决策树构建而成,包括随机森林和梯度提升树等。这使它们易于使用和理解,并且可以使用现有的大量可解释性工具和技术进行操作。决策树是一系列是/否问题,使用决策树将动物分类为鸡、猫和袋鼠。TF-DF为TensorFlow用户带来模型和一组自定义工具:开发和解释决策森林模型对初学者来说更容易。无需明确列出或预处理输入特征(因为决策森林可以自然地处理数值和分类属性)、指定架构(例如,通过尝试不同的层组合,如在神经网络中),或担心模型分歧。模型经过训练后,您可以直接绘制它或使用易于解释的统计数据对其进行分析。高级用户将受益于推理时间非常快的模型(在许多情况下每个示例亚微秒)。此外,这个库为模型实验和研究提供了很多可组合性。特别是,很容易将神经网络和决策森林结合起来。如上图所示,与下面用于构建神经网络的动画中的代码相比,仅使用一行代码就可以构建模型。在TensorFlow中,决策森林和神经网络都使用Keras。可以使用相同的API来试验不同类型的模型,更重要的是,可以使用相同的工具(例如TensorFlowServing)来部署这两种模型。以下是TF-DF提供的一些特性:TF-DF提供了一系列SOTA决策森林训练和服务算法,例如RandomForest、CART、(Lambda)MART、DART等。基于树的模型更容易与各种TensorFlow工具、库和平台(例如TFX和TF-DF库)可以充当通往丰富的TensorFlow生态系统的桥梁。对于神经网络用户,您可以使用决策森林作为启动TensorFlow并继续探索神经网络的简单方法。代码示例如下所示,以使用户简单明了。项目地址:https://github.com/tensorflow/decision-forestsTF-DF网站地址:https://www.tensorflow.org/decision_forestsGoogleI/O2021地址:https://www.youtube.com/watch?v=5qgk9QJ4rdQ模型训练在数据集Palmer'sPenguins上训练随机森林模型。目标是根据动物的特征预测动物的种类。数据集包含数字和分类特征,并存储为csv文件。Palmer'sPenguins数据集示例。模型训练代码:#InstallTensorFlowDecisionForests!pipinstalltensorflow_decision_forests#LoadTensorFlowDecisionForestsimporttensorflow_decision_forestsastfdf#Loadthetrainingdatasetusingpandasimportpandastrain_df=pandas.read_csv("penguins_train.csv")#ConvertthepandasdataframeintoaTensorFlowdatasettrain_ds=tfdf.keras.pd_dataframe_to_tf_dataset(train_df,label="species")#Trainthemodelmodel=tfdf.keras.RandomForestModel()model.fit(train_ds)请注意,代码中没有提供输入特征或超参数。这意味着TensorFlowDecisionForest会自动检测这个数据集中的输入特征,并对所有超参数使用默认值。评估模型现在开始评估模型的质量:#Loadthetestingdatasettest_df=pandas.read_csv("penguins_test.csv")#ConvertittoaTensorFlowdatasettest_ds=tfdf.keras.pd_dataframe_to_tf_dataset(test_df,label="species")#Evaluatethemodelmodel.compile(metrics=["accuracy"])print(model.evaluate(test_ds))#>>0.979311#注意:交叉验证更适合这个小数据集。#另请参阅下面的“Out-of-bagevaluation”。#ExportthemodeltoaTensorFlowSavedModelmodel.save("project/my_first_model")使用默认的超级随机森林参数为大多数问题提供快速和良好的基线。决策森林通常可以快速训练中小型问题,比许多其他类型的模型需要更少的超参数调整,并且通常提供稳健的结果。解释模型现在您知道了您训练的模型的准确性,是时候考虑它的可解释性了。如果您希望理解和解释正在建模的现象、调试模型或开始相信其决策,可解释性就变得非常重要。如上所述,有大量工具可用于解释经过训练的模型。首先从绘图开始:tfdf.model_plotter.plot_model_in_colab(model,tree_idx=0)其中一个决策树的结构。您可以直观地看到树结构。此外,模型统计补充图,统计示例包括:每个特征使用了多少次?模型训练的速度有多快(树的数量和时间)?节点如何分布在树结构中(如大多数分支的长度)?这些问题的答案以及更多问题都包含在ModelCompendium中,并且可以在ModelInspector中访问。#Printalltheavailableinformationaboutthemodel.summary()>>InputFeatures(7):>>bill_depth_mm>>bill_length_mm>>body_mass_g>>...>>VariableImportance:>>1."bill_length_mm"653.000000#################>>...>>Out-of-bagevaluation:accuracy:0.964602logloss:0.102378>>Numberoftrees:300>>Totalnumberofnodes:4170>>...#Getfeatureimportanceasaarraymodel.make_inspector().variable_importances()["MEAN_DECREASE_IN_ACCURACY"]>>[("flipper_length_mm",0.149),>>("bill_length_mm",0.096),>>("bill_depth_mm",0.025),>>("body_mass_g",0.018),>>("岛",0.012)]在上面的例子中,模型是用默认的超参数值训练的。作为第一个解决方案很好,但调整超参数可以进一步提高模型的质量。可以如下这样做:#Listalltheotheravailablelearningalgorithmstfdf.keras.get_all_models()>>[tensorflow_decision_forests.keras.RandomForestModel,>>tensorflow_decision_forests.keras.GradientBoostedTreesModel,>>tensorflow_decision_forests.keras.CartModel]#Displaythehyper-parametersoftheGradientBoostedTreesmodel?tfdf.keras.GradientBoostedTreesModel>>AGBT(GradientBoosted[Decision]Tree)isasetofshallowdecisiontreestrainedsequentially.Eachtreeistrainedtopredictandthen"correct"fortheerrorsofthepreviouslytrainedtrees(morepreciselyeachtreepredictsthegradientofthelossrelativetothemodeloutput).....Attributes:num_trees:num_trees:Maximumnumberofdecisiontrees.Theeffectivenumberoftrainedtreescanbesmallerifearlystoppingisenabled.Default:300.max_depth:Maximumdepthofthetree.`max_depth=1`meansthatalltreeswillberoots.Negativevaluesareignored.默认值:6....#Createanothermodelwithspecifiedhyper-parametersmodel=tfdf.keras.GradientBoostedTreesModel(num_trees=500,growing_strategy="BEST_FIRST_GLOBAL",max_depth=8,split_axis="SPARSE_OBLIQUE",)#Evaluatethemodelmodel.compile(metrics=["accuracy"])print(model.evaluate(test_ds))#>>0.986851