我试图使用sklearn库中的Iris数据集构建我的第一个决策树分类器。这是我的第一个示例代码:
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个。然后,通过这样更改这些参数,我做了另一个例子:
clf_ex2 = tree.DecisionTreeClassifier(criterion="entropy",random_state=300,min_samples_leaf=5,
class_weight={0:1,1:1,2:10})在这条路上:
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分数)在这三个代码之间没有变化。唯一受影响的值是交叉验证分数。为什么?
发布于 2020-10-22 20:38:44
我运行了您的脚本,这是为所有3个混淆矩阵返回的内容:
[[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很可能正在以一种您可能无意的方式重新训练您的模型。
https://datascience.stackexchange.com/questions/84384
复制相似问题