使用决策树用于新数据的分类,可以看到对下列4个新的蘑菇数据进行分类后,输出结果表明其中有3种是可食用的,1种是有毒的。
I=np。anay([[…],[…],[…],[…]])
np。anay([[120,115,121,。。。,110,110,103],
[98,115,119,。。。,110,110,109],
[120,121,119,。。。,107,115,117],
[120,115,103,。。。,110,97,103]])
In[26]:clf。predict(test)
Out[26]:array([1,1,0,1])
这个决策树的准确率如何呢?一种简单的方法是使用训练数据中的X,用决策树获得对应的类别标记,也就是预测分类结果(这里用Y_predict表示),然后把它和实际的类别标记Y进行比较。scikit-learn支持这样的比较,使用的方法是accuracy_score。
In[27]:fromsklearricsimportaccuracy_score
In[28]:Y_predict=clf。predict(X)
#这里使用前面训练好的决策树,输入训练样本的X,给出对应的predict
In[29]:accuracy_score(Y,Y_predict)
#这里利用accuracy_score来比较预测值和真实值。
Out[29]:1。0
可以看到这个决策树在训练数据上的准确率是100%(1。0)。这表明使用上述算法构建的决策树完全捕捉了训练数据的分类信息。这也许是因为训练出的决策树确实具有很好的分类效果,但也有可能并不是真正的分类准确率,而是发生了过拟合现象。
为了更好地评估分类准确率,需要使用与训练数据不同的测试数据。可以抽取全部数据中的一部分作为训练数据,另一部分作为测试数据,使用抽取出的训练数据来构建决策树,然后使用测试数据评估准确率。这可以通过如下方式来实现。
In[30]fromsklearionimporttrai
In[31]:X_trairairai
(X,Y,test_size=0。2)
#这里将全部样本分成两部分,其中训练样本占80%,测试样本占20%,这
#里采用了随机分割样本的方法,所以读者的输出可能与下面的结果不同
Iree。DeTreeClassifier()
I(X_train,Y_train)
#利用训练数据来构建决策树
Out[33]:
&reeClassifier(class_weight=erion='gini',
max_depth=None,
max_features=None,max_leaf_nodes=None,
min_impurity_split=1e-07,min_samples_leaf=1,
mi=2,mi_fra_leaf=0。0,
&=False,random_state=er='best')
#返回新的决策树的参数
In[34]:Y_prediewclf。predict(X_test)
#注意,这里是将新训练的决策树用在测试样本的X上,并预测出对应Y
In[35]:accuracy_score(Y_test,Y_predict)
Out[35]:1。0
可以看到在测试集上的准确率仍然是100%,这说明这个分类器确实具有很高的准确率。因为测试数据和训练数据是采用随机划分的方式获得的,读者最后获得的输出结果可能会与此不同。
从上述内容可以看出,决策树实现起来简单并且效果很好。本书采用最简单的形式实现这个算法,scikit-learn的决策树有很多参数可以调整,读者可以尝试调整决策树的参数,观察分类性能会发生什么改变。