以下习题来自:机器学习实战:基于Scikit-Learn和Tensorflow一书。

  1. 如果训练集有100万个实例,训练决策树(无约束)大致的深 度是多少?
    答: 一个包含m个叶节点的均衡二叉树的深度等于log2(m)的四 舍五入。通常来说,二元决策树训练到最后大体都是平衡的,如果不 加以限制,最后平均每个叶节点一个实例。因此,如果训练集包含一 百万个实例,那么决策树深度约等于log2(106)≈20层(实际上会更 多一些,因为决策树通常不可能完美平衡)。

  2. 通常来说,子节点的基尼不纯度是高于还是低于其父节点?是 通常更高/更低?还是永远更高/更低?
    答: 一个节点的基尼不纯度通常比其父节点低。这是通过CART训 练算法的成本函数确保的。该算法分裂每个节点的方法,就是使其子 节点的基尼不纯度的加权之和最小。但是,如果一个子节点的不纯度 远小于另一个,那么也有可能使子节点的基尼不纯度比其父节点高, 只要那个不纯度更低的子节点能够抵偿这个增加即可。。举例来说,假 设一个节点包含4个A类别的实例和1个B类别的实例,其基尼不纯度等于0.32。 现在我们假设数据集是一维的,并且实例的排 列顺序如下:A,B,A,A,A。你可以验证,算法将在第二个实例 后拆分该节点,从而生成两个子节点所包含的实例分别为A,B和 A,A,A。第一个子节点的基尼不纯度为 0.5,比其父节点要 高。这是因为第二个子节点是纯的,所以总的加权基尼不纯度等于0.2,低于父节点的基尼不纯度。

  3. 如果决策树过度拟合训练集,减少max_depth是否为一个好主 意?
    答: 如果决策树过度拟合训练集,降低max_depth可能是一个好主 意,因为这会限制模型,使其正则化。

  4. 如果决策树对训练集拟合不足,尝试缩放输入特征是否为一个 好主意?
    答: 决策树的优点之一就是它们不关心训练数据是否缩放或是集 中,所以如果决策树对训练集拟合不足,缩放输入特征不过是浪费时间罢了。

  5. 如果在包含100万个实例的训练集上训练决策树需要一个小 时,那么在包含1000万个实例的训练集上训练决策树,大概需要多长 时间?
    答: 决策树的训练复杂度为O(n×mlog(m))。所以,如果将训 练集大小乘以10,训练时间将乘以K=(n×10m×log(10m))/ (n×m×log(m))=10×log(10m)/log(m)。如果m=106,那么 K≈11.7,所以训练1000万个实例大约需要11.7小时。

  6. 如果训练集包含100000个实例,设置presort=True可以加快训练么?
    答:只有当数据集小于数千个实例时,预处理训练集才可以加速训 练。如果包含100000个实例,设置presort=True会显著减慢训练。

  7. 为卫星数据集训练并微调一个决策树。
    a.使用make_moons(n_samples=10000,noise=0.4)生成一个卫 星数据集。
    b.使用train_test_split()拆分训练集和测试集。
    c.使用交叉验证的网格搜索(在GridSearchCV的帮助下)为 DecisionTree-Classifier找到适合的超参数。提示:尝试max_leaf_nodes 的多种值。
    d.使用超参数对整个训练集进行训练,并测量模型在测试集上的 性能。你应该得到约85%到87%的准确率。

  8. 种植一片森林。
    a.继续之前的练习,生产1000个训练集子集,每个子集包含随机 挑选的100个实例。提示:使用Scikit-Learn的ShuffleSplit来实现。
    b.使用前面得到的最佳超参数值,在每个子集上训练一个决策树。在测试集上评估这1000个决策树。因为训练集更小,所以这些决 策树的表现可能比第一个决策树要差一些,只能达到约80%的准确 率。
    c.见证奇迹的时刻到了。用每个测试集实例,生成1000个决策树 的预测,然后仅保留次数最频繁的预测(可以使用SciPy的mode() 函数)。这样你在测试集上可获得大多数投票的预测结果。
    d.评估测试集上的这些预测,你得到的准确率应该比第一个模型 更高(高出0.5%~1.5%)。恭喜,你已经训练出了一个随机森林分 类器!