首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更改DecisionTreeClassifier参数时的相同混淆矩阵

更改DecisionTreeClassifier参数时的相同混淆矩阵
EN

Data Science用户
提问于 2020-10-22 19:17:46
回答 1查看 245关注 0票数 0

我试图使用sklearn库中的Iris数据集构建我的第一个决策树分类器。这是我的第一个示例代码:

代码语言:javascript
运行
复制
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
from sklearn.metrics import f1_score
from sklearn.model_selection import cross_val_score
from sklearn.metrics import confusion_matrix
from sklearn import tree 
import numpy as np
import graphviz 

iris = load_iris()

clf_ex1 = tree.DecisionTreeClassifier(criterion="entropy",random_state=300,min_samples_leaf=5,
                                      class_weight={0:1,1:10,2:10})

np.random.seed(0)

indices = np.random.permutation(len(iris.data))
indices_training=indices[:-10]
indices_test=indices[-10:]

iris_X_train = iris.data[indices_training]
iris_y_train = iris.target[indices_training]
iris_X_test  = iris.data[indices_test]
iris_y_test  = iris.target[indices_test]

clf_ex1 = clf_ex1.fit(iris_X_train, iris_y_train)

predicted_y_test = clf_ex1.predict(iris_X_test)

print(confusion_matrix(iris_y_test, predicted_y_test))


print("Predictions:")
print(predicted_y_test)
print("True classes:")
print(iris_y_test) 
print("--------")
print(iris.target_names)

# print some metrics results
acc_score = accuracy_score(iris_y_test, predicted_y_test)
print("--------")
print("Accuracy score: "+ str(acc_score))
print("--------")
f1=f1_score(iris_y_test, predicted_y_test, average='macro')
print("F1 score: "+str(f1))
print("--------")

scores = cross_val_score(clf_ex1, iris.data, iris.target, cv=5) 
print(scores)

dot_data = tree.export_graphviz(clf_ex1, out_file=None, 
                         feature_names=iris.feature_names, 
                         class_names=iris.target_names, 
                         filled=True, rounded=True,  
                         special_characters=True)  
graph = graphviz.Source(dot_data)  
graph

如您所见,在我的DecisionTreeClassifier函数中,我通过给第二个和第三个类赋值来设置类的权重,并给出了random_state参数300个。然后,通过这样更改这些参数,我做了另一个例子:

代码语言:javascript
运行
复制
clf_ex2 = tree.DecisionTreeClassifier(criterion="entropy",random_state=300,min_samples_leaf=5,
                                  class_weight={0:1,1:1,2:10})

在这条路上:

代码语言:javascript
运行
复制
clf_ex3 = tree.DecisionTreeClassifier(class_weight=None, criterion='entropy', 
                                  max_depth=2, 
                                  max_leaf_nodes=None, 
                                  min_samples_leaf=15, 
                                  min_samples_split=5, 
                                  random_state=100, 
                                  splitter='best')

问题是,我打印的所有值(混淆矩阵、准确性、predicted_y_test和f1分数)在这三个代码之间没有变化。唯一受影响的值是交叉验证分数。为什么?

EN

回答 1

Data Science用户

回答已采纳

发布于 2020-10-22 20:38:44

我运行了您的脚本,这是为所有3个混淆矩阵返回的内容:

代码语言:javascript
运行
复制
[[4 0 0]
 [0 3 1]
 [0 0 2]]

这个混淆矩阵向我表明,您的模型正在测试数据上非常出色地工作。有一个例外,您的模型预测错误的类(非对角线"1")。

因为你每次都给同样的随机种子,你的训练和测试指标对你正在调查的所有三个模型都是一样的。意思:他们都被训练在相同的数据和测试在相同的数据。

很有可能,在这个测试数据集中,10个样本中有9个是很容易分类的,而其中有1个是非平凡的。琐碎和非平凡之间的对比可能是如此鲜明,以至于在DecisionTree中调整超参数不会产生任何性能上的差异。

因此,这可以解释为什么您的输出对于您提到的所有字段都是相同的。

至于cross_val_score -这种方法随机混合你的整个数据集,并给你5个连续的简历试验。由于这个过程实际上是随机的,从第一个模型到第三个模型(它不依赖于您的np.random.seed(0)),因此拆分是不同的,您将得到相似(但不相同)的结果。

作为一个一般性的注意事项-小心您当前使用cross_val_score的方式。在您当前的实现中,您正在将一个预先训练过的模型提供给一个方法,在这个方法中,它需要一个未经训练的模型,并且您要求它交叉验证。因此,cross_val_score很可能正在以一种您可能无意的方式重新训练您的模型。

票数 2
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/84384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档