【问题标题】:How to compute accuracy and the confusion matrix using K-fold cross-validation?如何使用 K 折交叉验证计算准确度和混淆矩阵?
【发布时间】:2018-12-06 19:34:56
【问题描述】:

我尝试使用 K=30 折进行 K 折交叉验证,每一折都有一个混淆矩阵。如何计算具有置信区间的模型的准确性和混淆矩阵? 有人可以帮我吗?

我的代码是:

import numpy as np
from sklearn import model_selection
from sklearn import datasets
from sklearn import svm
import pandas as pd
from sklearn.linear_model import LogisticRegression

UNSW = pd.read_csv('/home/sec/Desktop/CEFET/tudao.csv')

previsores = UNSW.iloc[:,UNSW.columns.isin(('sload','dload',
                                                   'spkts','dpkts','swin','dwin','smean','dmean',
'sjit','djit','sinpkt','dinpkt','tcprtt','synack','ackdat','ct_srv_src','ct_srv_dst','ct_dst_ltm',
 'ct_src_ltm','ct_src_dport_ltm','ct_dst_sport_ltm','ct_dst_src_ltm')) ].values


classe= UNSW.iloc[:, -1].values


X_train, X_test, y_train, y_test = model_selection.train_test_split(
previsores, classe, test_size=0.4, random_state=0)

print(X_train.shape, y_train.shape)
#((90, 4), (90,))
print(X_test.shape, y_test.shape)
#((60, 4), (60,))

logmodel = LogisticRegression()
logmodel.fit(X_train,y_train)
print(previsores.shape)


########K FOLD
print('########K FOLD########K FOLD########K FOLD########K FOLD')
from sklearn.model_selection import KFold
from sklearn.metrics import confusion_matrix

kf = KFold(n_splits=30, random_state=None, shuffle=False)
kf.get_n_splits(previsores)
for train_index, test_index in kf.split(previsores):

    X_train, X_test = previsores[train_index], previsores[test_index]
    y_train, y_test = classe[train_index], classe[test_index]

    logmodel.fit(X_train, y_train)
    print (confusion_matrix(y_test, logmodel.predict(X_test)))
print(10* '#')

【问题讨论】:

    标签: scikit-learn cross-validation


    【解决方案1】:

    为了准确起见,我会使用函数cross_val_score,它完全符合您的要求。它输出 30 个验证准确度的列表,然后您可以计算它们的平均值、标准差等并创建某种置信区间(平均值 +- 2*std) .

    由于混淆矩阵不能被视为性能指标(不是单个数字而是矩阵),我建议创建一个列表,然后迭代地将其附加到相应的验证混淆矩阵(目前您只需打印它)。最后,您可以使用此列表提取很多有趣的信息。

    更新:

    ...
    ...
    cm_holder = []
    for train_index, test_index in kf.split(previsores):
        X_train, X_test = previsores[train_index], previsores[test_index]
        y_train, y_test = classe[train_index], classe[test_index]
    
        logmodel.fit(X_train, y_train)
        cm_holder.append(confusion_matrix(y_test, logmodel.predict(X_test))))
    

    注意len(cm_holder) = 30 并且每个元素都是shape=(n_classes, n_classes) 的数组。

    【讨论】:

    • @Jan K:你能帮我解决混淆矩阵吗?
    • @Mohammed Kashif:我需要关于混淆矩阵的帮助!
    • @LaurindaSouza 关于混淆矩阵,您究竟需要什么帮助?
    • @Mohammed Kashif:我不知道如何用 k 折计算混淆矩阵。我需要置信区间!
    • 查看更新。但是,不清楚您所说的“混淆矩阵的置信区间”是什么意思。
    猜你喜欢
    • 2018-07-21
    • 2022-01-19
    • 2014-04-19
    • 2018-09-10
    • 2012-11-12
    • 2012-04-01
    • 2019-05-01
    • 1970-01-01
    • 2020-04-02
    相关资源
    最近更新 更多