scikit-learn - 如何使用 K 折交叉验证计算准确度和混淆矩阵?
问题描述
我尝试用 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* '#')
解决方案
为了准确起见,我会使用cross_val_score
完全符合您要求的功能。它输出 30 个验证准确度的列表,然后您可以计算它们的平均值、标准差等,并创建某种置信区间 (mean +- 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)
.
推荐阅读
- mysql - mySQL中创建过程的两个IN参数
- apache-kafka - 两个(Kafka)S3 连接器不能同时工作
- html - shopify中响应式设计的CSS问题
- ios - 使用 iOS(Objective-C)SDK 的自定义 Branch.io 事件未显示在仪表板中?
- cloudflare - 使用 Cloudflare 通配符和来源为 docker 容器配置 Traefik
- xquery - 我在将 EBNF 语法转换为 Antlr4 语法时遇到问题
- php - PHP 更新 MS SQL 数据库
- php - 交易中的 Laravel 特征
- c++ - 每个 Windows 服务都调用其可执行的 main 函数吗?
- javascript - javascript:如何将参数移交给对象内的私有函数?