Kaggle-intro-to-machine-learning(4)

Underfitting-and-overfitting

教程

在此步骤的最后,您将了解过拟合和过拟合的概念,并且将能够运用这些想法来使模型更准确。

Experimenting With Different Models

现在,您已经有了一种可靠的方法来衡量模型的准确性,您可以尝试使用其他模型,看看哪种模型可以提供最佳的预测。 但是您对模型有什么选择?
您可以在scikit-learn的文档中看到,决策树模型具有许多选项(长期以来您想要或不需要的更多)。 最重要的选项确定树的深度。 回想一下在本微课程的第一课中,树的深度是对树木进行预测之前进行多少次分裂的度量。 这是一棵比较浅的树

 

 

 实际上,一棵树在顶层(所有房屋)和一片叶子之间有10个裂口并不少见。随着树变得更深,数据集被切成具有更少房屋的叶子。如果一棵树只有1个拆分,它将把数据分成2组。如果每个组再次拆分,我们将获得4组房屋。再次拆分每个将创建8个组。如果我们通过在每个级别添加更多的拆分来使组的数量增加一倍,那么到第10级时,我们将拥有210个房屋组。那是1024片叶子。
当我们在许多叶子之间划分房屋时,每个叶子中的房屋也更少。拥有很少房屋的叶子进行的预测将非常接近那些房屋的实际值,但是它们可能对新数据做出非常不可靠的预测(因为每个预测仅基于少数房屋)。
这是一种称为过拟合的现象,其中模型几乎完美地匹配了训练数据,但在验证和其他新数据方面却表现不佳。另一方面,如果我们使树非常浅,则不会将房屋分成非常不同的组。
在极端情况下,如果一棵树将房屋仅分为2或4,则每组仍然拥有各种各样的房屋。对于大多数房屋而言,即使在训练数据中,得出的结果预测也可能相去甚远(由于相同的原因,验证也很糟糕)。当模型无法捕获数据中的重要区别和模式时,即使在训练数据中它也表现不佳,这称为欠拟合

由于我们关心的是根据验证数据估算出的新数据的准确性,因此我们希望找到欠拟合与过度拟合之间的最佳结合点。 在视觉上,我们希望位于验证曲线(红色)的最低点

 

 

Example 

有几种方法可以控制树的深度,许多方法允许通过树的某些路径的深度大于其他路径。 但是max_leaf_nodes参数提供了一种非常明智的方法来控制过度拟合与欠拟合。 我们允许模型制作的叶子越多,我们从上图中的欠拟合区域移到过度拟合区域的动作就越多。
我们可以使用实用程序功能来帮助比较max_leaf_nodes的不同值的MAE分数:

from sklearn.metrics import mean_absolute_error
from sklearn.tree import DecisionTreeRegressor

def 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)

我们可以使用for循环来比较使用max_leaf_nodes的不同值构建的模型的准确性。

# compare MAE with differing values of max_leaf_nodes
for 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))

Output:

 

 

 在列出的选项中,500是最佳叶片数。

 

模型可能会遭受以下两种困扰:
过拟合:捕获将来不会再次出现的虚假模式,从而导致较不准确的预测
欠拟合:未能捕获相关模式,这又导致预测不准确。
我们使用模型训练中未使用的验证数据来衡量候选模型的准确性。 这使我们可以尝试许多候选模型并保持最佳模型。

 

练习

您可以自己编写函数get_mae。 目前,我们将提供它。 这与您在上一课中了解的功能相同。 只需运行下面的单元格。

def 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)

Step 1: Compare Different Tree Sizes

编写一个循环,尝试从一组可能的值中尝试以下max_leaf_nodes值。
在max_leaf_nodes的每个值上调用get_mae函数。 以某种方式存储输出,该方式允许您选择max_leaf_nodes的值,该值可为您的数据提供最准确的模型。

candidate_max_leaf_nodes = [5, 25, 50, 100, 250, 500]
# Write loop to find the ideal tree size from candidate_max_leaf_nodes
ans=[]
for i in candidate_max_leaf_nodes:
    t=get_mae(i,train_X, val_X, train_y, val_y)
    ans.append([i,t])
# Store the best value of max_leaf_nodes (it will be either 5, 25, 50, 100, 250 or 500)
print(ans)
ans.sort(key=lambda q:q[1])
print(ans)
best_tree_size = ans[0][0]

# Check your answer
step_1.check()

Output:

 

 

 Step 2: Fit Model Using All Data

您知道最佳的树大小。 如果您打算在实践中部署此模型,则可以通过使用所有数据并保持该树的大小来使其更加准确。 也就是说,既然您已做出所有建模决策,则无需保留验证数据

# Fill in argument to make optimal size and uncomment
#
best_tree_size已经在上面算出为100 final_model = DecisionTreeRegressor(max_leaf_nodes=best_tree_size, random_state=0) # fit the final model and uncomment the next two lines final_model.fit(X, y) # Check your answer step_2.check()

您已经调整了此模型并改善了结果。 但是我们仍在使用决策树模型,这在现代机器学习标准中并不是很复杂。 在下一步中,您将学习使用随机森林进一步改善模型。

 

 

 

 

best_tree_size
posted @ 2020-08-06 16:05  caishunzhe  阅读(209)  评论(0)    收藏  举报