我创建了这个生成 ROC_AUC 的函数,然后将创建的数字返回给变量。
from sklearn.metrics import roc_curve, auc
from sklearn.preprocessing import label_binarize
import matplotlib.pyplot as plt
def plot_multiclass_roc(clf, X_test, y_test, n_classes, figsize=(17, 6)):
y_score = clf.decision_function(X_test)
# structures
fpr = dict()
tpr = dict()
roc_auc = dict()
# calculate dummies once
y_test_dummies = pd.get_dummies(y_test, drop_first=False).values
for i in range(n_classes):
fpr[i], tpr[i], _ = roc_curve(y_test_dummies[:, i], y_score[:, i])
roc_auc[i] = auc(fpr[i], tpr[i])
# roc for each class
fig, ax = plt.subplots(figsize=figsize)
ax.plot([0, 1], [0, 1], 'k--')
ax.set_xlim([0.0, 1.0])
ax.set_ylim([0.0, 1.05])
ax.set_xlabel('False Positive Rate')
ax.set_ylabel('True Positive Rate')
ax.set_title('Receiver operating characteristic for Optimized SVC model')
for i in range(n_classes):
ax.plot(fpr[i], tpr[i], label='ROC curve (area = %0.2f) for label %i' % (roc_auc[i], i+1))
ax.legend(loc="best")
ax.grid(alpha=.4)
sns.despine()
plt.show()
return fig
svc_model_optimized_roc_auc_curve = plot_multiclass_roc(svc_model_optimized, X_test, y_test, n_classes=3, figsize=(16, 10))
Run Code Online (Sandbox Code Playgroud)
结果图如下所示:
我使用相同的函数为 5 个不同的模型创建了 5 条不同的 ROC 曲线,但将它们的数字返回到单独的变量。
然后我创建了一个我认为可以显示所有内容的子图。代码是:
from sklearn.metrics import roc_curve, auc
from sklearn.preprocessing import label_binarize
import matplotlib.pyplot as plt
def plot_multiclass_roc(clf, X_test, y_test, n_classes, figsize=(17, 6)):
y_score = clf.decision_function(X_test)
# structures
fpr = dict()
tpr = dict()
roc_auc = dict()
# calculate dummies once
y_test_dummies = pd.get_dummies(y_test, drop_first=False).values
for i in range(n_classes):
fpr[i], tpr[i], _ = roc_curve(y_test_dummies[:, i], y_score[:, i])
roc_auc[i] = auc(fpr[i], tpr[i])
# roc for each class
fig, ax = plt.subplots(figsize=figsize)
ax.plot([0, 1], [0, 1], 'k--')
ax.set_xlim([0.0, 1.0])
ax.set_ylim([0.0, 1.05])
ax.set_xlabel('False Positive Rate')
ax.set_ylabel('True Positive Rate')
ax.set_title('Receiver operating characteristic for Optimized SVC model')
for i in range(n_classes):
ax.plot(fpr[i], tpr[i], label='ROC curve (area = %0.2f) for label %i' % (roc_auc[i], i+1))
ax.legend(loc="best")
ax.grid(alpha=.4)
sns.despine()
plt.show()
return fig
svc_model_optimized_roc_auc_curve = plot_multiclass_roc(svc_model_optimized, X_test, y_test, n_classes=3, figsize=(16, 10))
Run Code Online (Sandbox Code Playgroud)
但生成的结果图是这样的:
这里也有类似的问题 ,但通过再次执行函数解决了。但如果可能的话,我想找到一种方法,将我已有的数字简单地“粘贴”到子图中。
您需要与链接的解决方案中完全相同的内容。您无法存储绘图以供以后使用。请注意,在 matplotlib 中,afigure
是具有一个或多个子图的周围图。每个子图都通过ax
.
功能plot_multiclass_roc
需要一些改变:
ax
as 参数,并且应该在该参数上创建绘图ax
。fig, ax = plt.subplots(figsize=figsize)
应该被删除;应该fig
之前在函数外部创建plt.show()
应该从函数中删除在函数外部,您创建图和轴。在 matplotlib 中,有一个不太遵循的约定用于axs
复数ax
(当引用子图时)。所以:
fig, axs = plt.subplots(nrows = 3,
ncols = 2,
figsize= (20, 20)
)
plot_multiclass_roc(...., ax=axs[0,0]) # use parameters for logmodel
plot_multiclass_roc(...., ax=axs[0,1]) # use parameters for Random Forest
plot_multiclass_roc(...., ax=axs[1,0]) # ...
plot_multiclass_roc(...., ax=axs[1,1]) # ...
plot_multiclass_roc(...., ax=axs[2,0]) # ...
axs[2,1].remove() # remove the unused last ax
plt.tight_layout() # makes that labels etc. fit nicely
plt.show()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12964 次 |
最近记录: |