首页 > 编程知识 正文

决策树决策方法是,决策树与决策表例题

时间:2023-05-03 19:14:06 阅读:216453 作者:4621

决策树练习题 1.如果训练集有100万个实例,训练决策树(无约束)大致的深度是多少?

A:一个包含m个叶节点的均衡二叉树的深度等于log2(m),取整。通常来说,二元决策树(只做二元决策的树,就像Scikit-Learn中的所有树一样)训练到最后大体都是平衡的,如果不加以限制,最后平均每个叶节点一个实例。因此,如果训练集包含100万个实例,那么决策树的深度为log2(106)≈20层(实际上会更多一些,因为决策树通常不可能完美平衡)。

2.通常来说,子节点的基尼不纯度是高于还是低于其父节点?是通常更高/更低?还是永远更高/更低?

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

3.如果决策树过拟合训练集,减少max_depth是否为一个好主意?

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

4.如果决策树对训练集欠拟合,尝试缩放输入特征是否为一个好主意?

A:决策树的优点之一就是它们不关心训练数据是缩放还是集中,所以如果决策树不适合训练集,缩放输入特征不过是浪费时间罢了。

5.如果在包含100万个实例的训练集上训练决策树需要一个小时,那么在包含1000万个实例的训练集上训练决策树,大概需要多长时间?

A:决策树的训练复杂度为O(n*mlog2(m))。m为训练集数量,如果训练集数量变为10倍,则 n * 10mlog2(10m) / n * mlog2(m)=10 *(log2107 / log2106) = 10 * 7/6 ≈ 11.7。所以大概需要11.7个小时。

6.如果训练集包含10万个实例,设置presort=True可以加快训练吗?

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

7.为卫星数据集训练并微调一个决策树。

a.使用make_moons(n_samples=10000,noise=0.4)生成一个卫星数据集。

from sklearn.datasets import make_moonsX, y = make_moons(n_samples = 10000, noise = 0.4, random_state = 42)

b.使用train_test_split()拆分训练集和测试集

from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.2,random_state = 42)

c.使用交叉验证的网格搜索(在GridSearchCV的帮助下)为DecisionTreeClassifier找到适合的超参数。提示:尝试max_leaf_nodes的多种值。

from sklearn.model_selection import GridSearchCVparams = {'max_leaf_nodes':list(range(2,100)),'min_samples_split':[2,3,4]}grid_search_cv = GridSearchCV(DecisionTreeClassifier(random_state = 42),params,verbose=1,cv=3)grid_search_cv.fit(X_train, y_train)

verbose:日志显示 verbose = 0 为不在标准输出流输出日志信息 verbose = 1 为输出进度条记录 verbose = 2 为每个epoch输出一行记录 cv = 3 : 代表对每个模型进行了3次训练

grid_search_cv.best_estimator_ Output:DecisionTreeClassifier(max_leaf_nodes=17, random_state=42)

d.使用超参数对整个训练集进行训练,并测量模型在测试集上的性能。你应该得到约85%~87%的准确率。

默认情况下,GridSearchCV会在整个训练集上训练出最好的模型(你可以通过设置refit=False来改变它),所以我们不需要再进行一次训练,直接简单地评估这个模型的准确性就可以了。

from sklearn.metrics import accuracy_scorey_pred = grid_search_cv.predict(X_test)accuracy_score(y_test, y_pred)

Output: 0.8695

8.按照以下步骤种植森林。

a.继续之前的练习,生产1000个训练集子集,每个子集包含随机挑选的100个实例。提示:使用Scikit-Learn的ShuffleSplit来实现。

from sklearn.model_selection import ShuffleSplitn_trees = 1000n_instances = 100mini_sets = []rs = ShuffleSplit(n_splits = n_trees, test_size = len(X_train) - n_instances, random_state = 42)for mini_train_index, mini_test_index in rs.split(X_train): X_mini_train = X_train[mini_train_index] y_mini_train = y_train[mini_train_index] mini_sets.append((X_mini_train,y_mini_train))

ShuffleSplit中的n_splits:int,默认=10。重新洗牌和分裂迭代的数量。将训练数据分成【train/test】对的组数。 test_size: float或int,默认=None。如果是浮动的,则应该在0.0和1.0之间,并表示要包含在test分割中的数据集的比例。如果int,表示测试样本的绝对数量。如果没有,则将该值设置为train_size的补集。如果train_size也是None,它将被设置为0.1。test_size用来设置【train/test】对中test所占的比例。

b.使用前面得到的最佳超参数值,在每个子集上训练一个决策树。在测试集上评估这1000个决策树。因为训练集更小,所以这些决策树的表现可能比第一个决策树要差一些,只能达到约80%的准确率。

from sklearn.base import cloneimport numpy as npforest = [clone(grid_search_cv.best_estimator_) for _ in range(n_trees)]accuracy_scores = []for tree, (X_mini_train, y_mini_train) in zip(forest, mini_sets): tree.fit(X_mini_train, y_mini_train) y_pred = tree.predict(X_test) accuracy_scores.append(accuracy_score(y_test,y_pred))np.mean(accuracy_scores) Output: 0.8054499999999999

c.见证奇迹的时刻到了。对于每个测试集实例,生成1000个决策树的预测,然后仅保留次数最频繁的预测(可以使用SciPy的mode()函数)。这样你在测试集上可获得大多数投票的预测结果。

from scipy.stats import modeY_pred = np.empty([n_trees,len(X_test)],dtype=np.uint8)for tree_index, tree in enumerate(forest): Y_pred[tree_index] = tree.predict(X_test)y_pred_majority_votes, n_votes = mode(Y_pred, axis=0)

d.评估测试集上的这些预测,你得到的准确率应该比第一个模型更高(高出0.5%~1.5%)。恭喜,你已经训练出了一个随机森林分类器!

accuracy_score(y_test, y_pred_majority_votes.reshape([-1]))

Output: 0.872

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。