提升树(BoostedTrees)模型受到许多机器学习从业者的欢迎,因为它们可以通过最小化的超参数调整获得令人印象深刻的性能。
您将使用泰坦尼克数据集,该数据集的目标是在给出性别、年龄、阶级等特征的条件下预测乘客幸存与否。
您将使用以下特征来进行训练:
让我们首先预览一些数据,并在训练集上创建摘要统计。
dftrain.shape[0],dfeval.shape[0](627,264)大多数乘客在20岁或30岁。
男乘客大约是女乘客的两倍。
大多数乘客都在“三等”舱。
大多数乘客从南安普顿出发。
与男性相比,女性存活的几率要高得多。这显然是该模型的预测特征。
fc=tf.feature_columnCATEGORICAL_COLUMNS=['sex','n_siblings_spouses','parch','class','deck','embark_town','alone']NUMERIC_COLUMNS=['age','fare']defone_hot_cat_column(feature_name,vocab):returntf.feature_column.indicator_column(tf.feature_column.categorical_column_with_vocabulary_list(feature_name,vocab))feature_columns=[]forfeature_nameinCATEGORICAL_COLUMNS:#Needtoone-hotencodecategoricalfeatures.vocabulary=dftrain[feature_name].unique()feature_columns.append(one_hot_cat_column(feature_name,vocabulary))forfeature_nameinNUMERIC_COLUMNS:feature_columns.append(tf.feature_column.numeric_column(feature_name,dtype=tf.float32))您可以查看特征列生成的转换。例如,以下是在单个样本中使用indicator_column的输出:
example=dict(dftrain.head(1))class_fc=tf.feature_column.indicator_column(tf.feature_column.categorical_column_with_vocabulary_list('class',('First','Second','Third')))print('Featurevalue:"{}"'.format(example['class'].iloc[0]))print('One-hotencoded:',tf.keras.layers.DenseFeatures([class_fc])(example).numpy())Featurevalue:"Third"One-hotencoded:[[0.0.1.]]此外,您还可以一起查看所有特征列的转换:
#使用大小为全部数据的batch,因为数据规模非常小.NUM_EXAMPLES=len(y_train)defmake_input_fn(X,y,n_epochs=None,shuffle=True):definput_fn():dataset=tf.data.Dataset.from_tensor_slices((dict(X),y))ifshuffle:dataset=dataset.shuffle(NUM_EXAMPLES)#对于训练,可以按需多次循环数据集(n_epochs=None)。dataset=dataset.repeat(n_epochs)#在内存中训练不使用batch。dataset=dataset.batch(NUM_EXAMPLES)returndatasetreturninput_fn#训练与评估的输入函数。train_input_fn=make_input_fn(dftrain,y_train)eval_input_fn=make_input_fn(dfeval,y_eval,shuffle=False,n_epochs=1)训练与评估模型您将执行以下步骤:
在训练提升树(BoostedTrees)模型之前,让我们先训练一个线性分类器(逻辑回归模型)。最好的做法是从更简单的模型开始建立基准。
linear_est=tf.estimator.LinearClassifier(feature_columns)#训练模型。linear_est.train(train_input_fn,max_steps=100)#评估。result=linear_est.evaluate(eval_input_fn)clear_output()print(pd.Series(result))accuracy0.765152accuracy_baseline0.625000auc0.832844auc_precision_recall0.789631average_loss0.478908global_step100.000000label/mean0.375000loss0.478908precision0.703297prediction/mean0.350790recall0.646465dtype:float64下面让我们训练提升树(BoostedTrees)模型。提升树(BoostedTrees)是支持回归(BoostedTreesRegressor)和分类(BoostedTreesClassifier)的。由于目标是预测一个生存与否的标签,您将使用BoostedTreesClassifier。
#由于数据存入内存中,在每层使用全部数据会更快。#上面一个batch定义为整个数据集。n_batches=1est=tf.estimator.BoostedTreesClassifier(feature_columns,n_batches_per_layer=n_batches)#一旦建立了指定数量的树,模型将停止训练,#而不是基于训练步数。est.train(train_input_fn,max_steps=100)#评估。result=est.evaluate(eval_input_fn)clear_output()print(pd.Series(result))accuracy0.829545accuracy_baseline0.625000auc0.872788auc_precision_recall0.857807average_loss0.411839global_step100.000000label/mean0.375000loss0.411839precision0.793478prediction/mean0.381942recall0.737374dtype:float64现在您可以使用训练的模型从评估集上对乘客进行预测了。Tensorflow模型经过优化,可以同时在一个batch或一个集合的样本上进行预测。之前,eval_inout_fn是使用整个评估集定义的。
最后,您还可以查看结果的受试者工作特征曲线(ROC),这将使我们更好地了解真阳性率与假阴性率之间的权衡。