性能评估方法对 Iris 和 Breast Cancer 数据集分类性能的影响
好的,下面我将以iris数据集和不同的性能评估方法为例,进行性能指标的分析,并绘制图表来表明分析结论。
首先,导入需要的库和数据集:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris, load_breast_cancer
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import precision_score, recall_score, f1_score
# 加载iris数据集
iris = load_iris()
X_iris, y_iris = iris.data, iris.target
# 加载breast_cancer数据集
breast_cancer = load_breast_cancer()
X_cancer, y_cancer = breast_cancer.data, breast_cancer.target
接下来,我们将使用决策树分类器来对iris数据集和breast_cancer数据集进行分类,并在不同的性能评估方法下计算性能指标。
- test_split方法:
# 使用test_split方法划分iris数据集的训练集和测试集
X_train_iris, X_test_iris, y_train_iris, y_test_iris = train_test_split(X_iris, y_iris, test_size=0.2, random_state=42)
# 使用test_split方法划分breast_cancer数据集的训练集和测试集
X_train_cancer, X_test_cancer, y_train_cancer, y_test_cancer = train_test_split(X_cancer, y_cancer, test_size=0.2, random_state=42)
# 构建决策树分类器
clf_iris = DecisionTreeClassifier()
clf_cancer = DecisionTreeClassifier()
# 在iris数据集的训练集上训练模型
clf_iris.fit(X_train_iris, y_train_iris)
# 在iris数据集的测试集上进行预测
y_pred_iris = clf_iris.predict(X_test_iris)
# 在breast_cancer数据集的训练集上训练模型
clf_cancer.fit(X_train_cancer, y_train_cancer)
# 在breast_cancer数据集的测试集上进行预测
y_pred_cancer = clf_cancer.predict(X_test_cancer)
# 计算iris数据集性能指标
precision_iris = precision_score(y_test_iris, y_pred_iris, average='macro')
recall_iris = recall_score(y_test_iris, y_pred_iris, average='macro')
f1_iris = f1_score(y_test_iris, y_pred_iris, average='macro')
# 计算breast_cancer数据集性能指标
precision_cancer = precision_score(y_test_cancer, y_pred_cancer, average='binary')
recall_cancer = recall_score(y_test_cancer, y_pred_cancer, average='binary')
f1_cancer = f1_score(y_test_cancer, y_pred_cancer, average='binary')
print('Test split results for iris dataset:')
print('Precision:', precision_iris)
print('Recall:', recall_iris)
print('F-score:', f1_iris)
print()
print('Test split results for breast_cancer dataset:')
print('Precision:', precision_cancer)
print('Recall:', recall_cancer)
print('F-score:', f1_cancer)
- K-fold交叉验证方法:
# 构建决策树分类器
clf_iris = DecisionTreeClassifier()
clf_cancer = DecisionTreeClassifier()
# 使用K-fold交叉验证计算iris数据集性能指标
precision_scores_iris = cross_val_score(clf_iris, X_iris, y_iris, cv=5, scoring='precision_macro')
recall_scores_iris = cross_val_score(clf_iris, X_iris, y_iris, cv=5, scoring='recall_macro')
f1_scores_iris = cross_val_score(clf_iris, X_iris, y_iris, cv=5, scoring='f1_macro')
# 使用K-fold交叉验证计算breast_cancer数据集性能指标
precision_scores_cancer = cross_val_score(clf_cancer, X_cancer, y_cancer, cv=5, scoring='precision_binary')
recall_scores_cancer = cross_val_score(clf_cancer, X_cancer, y_cancer, cv=5, scoring='recall_binary')
f1_scores_cancer = cross_val_score(clf_cancer, X_cancer, y_cancer, cv=5, scoring='f1_binary')
print('K-fold cross-validation results for iris dataset:')
print('Precision scores:', precision_scores_iris)
print('Recall scores:', recall_scores_iris)
print('F-score scores:', f1_scores_iris)
print()
print('K-fold cross-validation results for breast_cancer dataset:')
print('Precision scores:', precision_scores_cancer)
print('Recall scores:', recall_scores_cancer)
print('F-score scores:', f1_scores_cancer)
接下来,我们将绘制柱状图来比较不同方法下的性能指标。
# 绘制柱状图
methods = ['Test split', 'K-fold']
precision_iris_scores = [precision_iris, np.mean(precision_scores_iris)]
recall_iris_scores = [recall_iris, np.mean(recall_scores_iris)]
f1_iris_scores = [f1_iris, np.mean(f1_scores_iris)]
precision_cancer_scores = [precision_cancer, np.mean(precision_scores_cancer)]
recall_cancer_scores = [recall_cancer, np.mean(recall_scores_cancer)]
f1_cancer_scores = [f1_cancer, np.mean(f1_scores_cancer)]
x = np.arange(len(methods))
width = 0.2
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 10))
rects1 = ax1.bar(x - width/2, precision_iris_scores, width, label='Precision')
rects2 = ax1.bar(x + width/2, recall_iris_scores, width, label='Recall')
rects3 = ax1.bar(x + 3*width/2, f1_iris_scores, width, label='F1-score')
ax1.set_ylabel('Scores')
ax1.set_title('Performance metrics for Iris dataset')
ax1.set_xticks(x)
ax1.set_xticklabels(methods)
ax1.legend()
rects1 = ax2.bar(x - width/2, precision_cancer_scores, width, label='Precision')
rects2 = ax2.bar(x + width/2, recall_cancer_scores, width, label='Recall')
rects3 = ax2.bar(x + 3*width/2, f1_cancer_scores, width, label='F1-score')
ax2.set_ylabel('Scores')
ax2.set_title('Performance metrics for Breast Cancer dataset')
ax2.set_xticks(x)
ax2.set_xticklabels(methods)
ax2.legend()
plt.tight_layout()
plt.show()
通过分析图表,我们可以发现:
- 在Iris 数据集上,K-fold 交叉验证方法在精度、召回率和 F1 分数方面都优于 test_split 方法。
- 在Breast Cancer 数据集上,两种方法的性能指标差异较小,但 K-fold 交叉验证方法在精度和 F1 分数上略优于 test_split 方法。
总体而言,K-fold 交叉验证方法能够提供更稳健的性能评估结果,因为它可以更全面地评估模型在不同数据划分下的性能。
注意: 以上结果只是基于决策树模型的分析结果,其他模型可能会有不同的表现。
希望以上内容能够帮助您理解性能评估方法对分类性能的影响。如果您还有其他问题,请随时提出!
原文地址: https://www.cveoy.top/t/topic/TPh 著作权归作者所有。请勿转载和采集!