Python-sklearn机器学习的第一个样例(6)
交叉检验(Cross-validation)
正是由于这个问题,大部分的数据科学家都会对数据模型进行“K层交叉检验(K-fold cross-validation)”:把原始的数据集划分为K个子集,使用其中一个子集作为测试集,其他子集都用作训练集。这个过程重复K次,这样每个子集都会成为一次测试集。
10层交叉验证是最常用的。
In [65]:
你已经注意到,在以上的代码中我们使用了分层的K次交叉验证。这种分层的K次交叉验证,可以保证在每一次验证中的,每一类中的数据量比例一致,这样才能保证数据子集的代表性。毕竟我们不可能在每一个子集中,包含某个类别的所有记录。
In [66]:
Out[66]:
现在这个分类器要好多了,相对来说有了更一致的分类准确性。
参数调优
每个机器学习的模型都伴随着大量的参数调优,这些参数对模型的表现至关重要。例如,我们是否严格限制决策树的深度。
In [67]:
Out[67]:
把最大深度限制为1,分类器的精确度当然非常差。
因此,我们应该找到一个系统性的方法,探寻模型和数据集的最佳参数。
最通常的模型参数调优方法是:网格搜索(Grid Search)。原理其实很简单:探测整个范围内的参数,寻找表现最佳的参数组合。
下面开始对我们的决策树分类器进行调优。这里主要聚焦两个参数,实际应用中,可能需要面对多个参数的调优。
In [68]:
现在,让我们用图形的方式,来看看网格搜索的参数关系。
In [32]:
Out[32]:
现在我们对这个模型的参数有了更好的感觉:决策树的最大深度max_depth至少是2,而不是做一次性的决定。
max_features 参数对模型的影响似乎不大,只要有2个就够了。考虑到我们的数据集只有4个参数,而且相对来说比较容易分类。
让我们继续使用一个更宽泛的网格搜索,寻找一个最佳的参数组合。
In [33]:
现在我们可以说通过网格搜索,找到了一个最佳的分类器:
In [35]:
Out[35]: