sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)
sklearn.metrics.confusion_matrix は混同行列を直接取得するのに非常に便利ですが、練習後に問題が見つかったので、sklearn の混同行列の実装ではカテゴリが 1 つしかない場合に自動的に次元が 1*1 に削減されてしまうため、自分で一つ:
def calculate_metric(gt, pred):
pred[pred>0.5]=1
pred[pred<1]=0
TP, FP, TN, FN = 0, 0, 0, 0
for i in range(len(gt)):
if gt[i] == 1 and pred[i] == 1:
TP += 1
if gt[i] == 0 and pred[i] == 1:
FP += 1
if gt[i] == 0 and pred[i] == 0:
TN += 1
if gt[i] == 1 and pred[i] == 0:
FN += 1
# confusion = confusion_matrix(gt,pred)
# print(confusion.shape)
# TP = confusion[1,1]
# TN = confusion[0,0]
# FP = confusion[0,1]
# FN = confusion[1,0]
return TP, FP, TN, FN
しかし、後になって、この問題は、construction_matrix が原因ではなく、データ サンプルの数が少ないことが原因であったことが判明し、そのため、50 回の期間中に各フォールドに 2 種類のサンプルが含まれていることを保証できないという事実が生じました。幸いなことに:
そこで、KFold と StratifiedKFold について理解しました。両方の使用法は同じで、関数名を変更するだけです。
from sklearn.model_selection import train_test_split, KFold, StratifiedKFold
kf = KFold(n_splits=5,random_state=2023,shuffle=True)
kf = StratifiedKFold(n_splits=5,random_state=2023,shuffle=True)
ただし、分割を行う場合、この 2 つにはいくつかの違いがあります。
#KFold不需要传入标签
for train_index, validate_index in kf.split(dataset):
pass
#StratifiedKFold需要传入标签
for train_index, validate_index in kf.split(dataset,dataset['label']):
pass
StratifiedKFold 層化サンプリングに切り替えると、フォールドが 1 つだけになり、クラスが 1 つだけになるため、construction_matrix の次元削減の問題が回避され、今のところ問題は解決されています。