预约成功
用不同的模型进行实验
既然已经学习了如何衡量模型的准确性,你可以选用不同的可替代的模型进行预测,对比出一个最优的预测结果。那么有哪些模型可以替代决策树模型呢?
在scikit-learn官方文档中,可以看到决策树模型有许多参数,比你当下想要使用的或将来即将需要的都多。其中最重要的一个参数就是树深,回忆一下开头提到的树深概念,它指明在得到预测值之前决策树分了多少叉。以下是一棵相对较浅的决策树。
在实践中,一棵决策树从顶层(代表所有房子)到叶子节点有10次分叉都很常见。决策树越深,数据集被切分到最终的叶子节点的房子数越少。如果一棵决策树只分1次叉,它把数据集分成2组。如果这两组分别再分一次叉,最终将得到4组房子。这4组房子分别再分一次叉,将创造出8个分组。如果每一层都加一次分叉,持续对现有的组进行翻倍操作,到了第10层的时候,我们将得到2的10次方个分组。也就是1024个叶子节点。
当我们把数据集切分到许多叶子节点代表的分组中时,每个叶子节点中的房子样本变的越来越少。这些只有少量房子样本的叶子节点作出的预测将会十分接近那些房子的真实价格,但是对于新来的房子,它的预测值就非常不准,因为每一个预测值都只基于少量的样本数据。
这种现象就叫过拟合,即模型在训练数据中预测表现很棒,但在校验数据或其他新的测试数据中预测表现很差。反过来说,如果我们的决策树只有非常浅的几层,它就不能把训练样本中的房子划分到非常不同的组中。
例如,如果一棵树将学习样本划分到2个或4个组中,每个组里仍然有一大批的房价样本。这将导致大多数房子的预测结果都与实际值相去甚远,即便是在训练样本中都表现很差。同样的原因,对于校验样本,模型的预测结果也与真实值相去甚远。当一个模型无法捕获数据集中的显著差异和其中存在的模式,即便是在训练样本中,它的表现都很差,这就是欠拟合。
由于我们最关心的还是模型在新数据中的预测准确率,所以用校验数据来评判模型的准确率,在过拟合与欠拟合之间,我们希望找到那个最佳点。
举个栗子
有几种控制树深的可选方案,还有一些方案允许树的一些路径深度比其他路径的深度大,换句话说它允许一棵树从根节点到达叶子节点的不同分叉,即不同路径,有不同的深度。但max_leaf_nodes参数提供了一种更为合理的调节过拟合与欠拟合的方案。我们允许模型生成的叶子节点越多,模型就越从欠拟合靠近过拟合。
我们可以使用效用函数帮助对比不同的max_leaf_nodes参数下模型的MAE(平均绝对误差)。
from sklearn.metrics
import mean_absolute_error
from sklearn.tree
import DecisionTreeRegressordef get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):
model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)model.fit(train_X, train_y)preds_val = model.predict(val_X)
mae = mean_absolute_error(val_y, preds_val)
return(mae)
利用我们前面已经学习到的代码,将数据集分别装载到train_X,val_X,train_y以及val_y中。
我们可以使用一个for循环来对比不同的max_leaf_nodes参数取值下,模型的准确率分别是多少。
# compare MAE with differing values of max_leaf_nodesfor max_leaf_nodes in [5, 50, 500, 5000]:
my_mae = get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y)
print("Max leaf nodes: %d \t\t Mean Absolute Error: %d" %(max_leaf_nodes, my_mae))
通过以上结果可以看出,500个叶子节点是模型的预测效果相对较好。
小结
过拟合:模型捕捉现有数据中未来并不会复现的模式,导致对新数据的预测结果欠佳
欠拟合:模型无法捕捉到现有数据中的模式,对数据的预测结果欠佳。
对于机器学习来说,模型都会有过拟合与欠拟合的问题,都应该属于机器学习的实践理论,我们使用模型训练中没有用到的校验数据来衡量待选模型的准确率。这让我们尝试不同的待选模型并选用其中最优的一个,环球网校小编祝大家学习顺利。