sklearn中lr模型---评价指标函数/评价报告classification_report,含义及应用代码示例

参考:
应用代码示例 https://blog.csdn.net/wendaomudong_l2d4/article/details/81063170
含义
https://www.jianshu.com/p/7e7b88a7e501
评价报告
https://blog.csdn.net/akadiao/article/details/78788864

一、从线性回归到逻辑回归
线性回归解决的是连续型数值的预测问题,例如预测房价,产品销量等。
逻辑回归解决的是分类问题,从分类数量上看,有二项分类和多项分类。
二、逻辑回归基本概念
三、模型效果评估

  1. 准确率
    准确率 = 正确预测数 / 测试集样本数
    Scikit-learn中自带的准确率计算方法
    from sklearn.metrics import accuracy_score
    accuracy = accuracy_score(admission, pred_label)
  2. 精确率
    二项分类问题中,观察值和预测值关系的混淆矩阵表示:
    在这里插入图片描述

精确率 = TP / (TP + FP)
真正例/所有被预测为正例的数据

  1. 召回率
    召回率 = TP / (TP + FN)

Scikit-learn中提供了计算精确率和召回率的计算函数,可结合K折交叉验证(K-Fold Cross Validation)使用。

  1. 综合评价指标(F-measure)

(1)f1
综合评价指标:精确率和召回率的调和均值(harmonic mean),或加权平均值,也称为F-measure或F-score。F-measure 平衡了精确率和召回率。当F-measure较高的时候,说明模型效果比较好。(精确率和召回率都越高越好,但在一些极端情况下,两者是矛盾的)

F-measure = 2 * Precision * Recall / (Precision + Recall)
Scikit-learn中提供了直接计算F-measure的方法:
f1 = cross_val_score(lor, data[[‘gpa’]], data[‘Admission’], cv = kf, scoring = ‘f1’)

(2)ROC & AUC
假阳性概率(False Positive Rate)(误警率)
FPR = FP / (TN + FP)

1)ROC曲线(Receiver Operating Characteristic curve,ROC curve)
以假阳性概率为横坐标,以真阳性概率(召回率)为纵坐标所画的曲线。可以理解为它是一系列混淆矩阵的结果组合所画出的曲线。一般情况下,我们得到一个回归模型的混淆矩阵,都是在提前设定好一个阈值的前提下获得的。但如果我们调整这个阈值,得到的混淆矩阵就不同了。在模型预测的所有概率中,每一个概率值都可以作为一个阈值,相应的,我们就能得到一系列的混淆矩阵。对于每个混淆矩阵,我们都能计算出相应的假阳性概率FPR和真阳性概率TPR。然后我们以这些FPR为横坐标轴,以TPR为纵坐标轴,所得到的曲线就是ROC。

理想的情况下,如果存在一个阈值,大于这个阈值的都是阳性的,低于这个阈值的都是阴性的,则这个模型能够非常完美的区分阳性和阴性.此时对应的真阳性概率TPR为1,假阳性概率FPR为0,对应坐标轴上的**(0,1)点**,即左上角的点。所以如果ROC曲线经过该点,它就是完美的。

2)AUC(Area Under the Curve)是指ROC曲线下面的面积。从AUC定义的角度来理解,AUC就是从所有标签为1的样本中随机选取一个样本, 从所有标签为0的样本中随机选取一个样本,然后根据分类器对两个随机样本进行预测,假设标签为1的样本预测为1的概率为p1,标签为0的样本预测为1的概率为p0,那么p1>p0的概率就等于AUC。所以AUC反应的是分类器对样本的排序能力。

一般情况下,AUC值介于0.5和1之间,AUC值越大,说明分类器效果越好,ROC曲线越接近于(0,1)点。AUC值越小,说明分类器效果越差,跟随机分类没什么差别,ROC曲线越趋近于下图中的红线。如果AUC值小于0.5,则可能是样本数据标签出了问题。
另外值得注意的是,AUC对样本类别是否均衡并不敏感,这也是不均衡样本通常用AUC评价分类器性能的一个原因。

四、classification_report 在这里插入图片描述
其中,
左边第一列—分类的标签名,
support列—每个标签的出现次数,
precision—各个类别的精确度,
recall—召回率,
f1-score—F1值,
avg / total行(最后一行)----各列的的加权平均值均值
(support列为权值).

以下是使用 PyTorch 实现的代价敏感决策树模型平衡 CICIDS-2017 数据集,并使用 CNN 模型训练的代码: ``` import torch import torch.nn as nn import torch.optim as optim import pandas as pd from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report, confusion_matrix from imblearn.datasets import fetch_datasets from imblearn.under_sampling import RandomUnderSampler # 读取数据集 dataset = fetch_datasets()['CICIDS2017'] X = dataset.data y = dataset.target # 平衡数据集 sampler = RandomUnderSampler(random_state=42) X_resampled, y_resampled = sampler.fit_resample(X, y) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X_resampled, y_resampled, test_size=0.2, random_state=42) # 定义 CNN 模型 class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.conv = nn.Sequential( nn.Conv2d(1, 16, kernel_size=(3, 3)), nn.ReLU(), nn.MaxPool2d(kernel_size=(2, 2)), nn.Conv2d(16, 32, kernel_size=(3, 3)), nn.ReLU(), nn.MaxPool2d(kernel_size=(2, 2)), nn.Flatten(), nn.Linear(1152, 128), nn.ReLU(), nn.Linear(128, 2) ) def forward(self, x): x = x.unsqueeze(1) x = self.conv(x) return x # 定义代价敏感决策树损失函数 class CostSensitiveDecisionTreeLoss(nn.Module): def __init__(self, cost_matrix): super(CostSensitiveDecisionTreeLoss, self).__init__() self.cost_matrix = cost_matrix def forward(self, input, target): loss = 0.0 for i in range(input.shape[0]): if target[i] == 0: loss += self.cost_matrix[0][1] * input[i][1] else: loss += self.cost_matrix[1][0] * input[i][0] return loss / input.shape[0] # 训练 CNN 模型 model = CNN() optimizer = optim.Adam(model.parameters(), lr=0.001) criterion = nn.CrossEntropyLoss() epochs = 10 for epoch in range(epochs): running_loss = 0.0 for i in range(len(X_train)): x = torch.tensor(X_train[i], dtype=torch.float32).view(1, 1, 28, 28) y = torch.tensor(y_train[i], dtype=torch.long) optimizer.zero_grad() outputs = model(x) loss = criterion(outputs, y) loss.backward() optimizer.step() running_loss += loss.item() print('Epoch [%d], Loss: %.4f' % (epoch+1, running_loss/len(X_train))) # 使用代价敏感决策树损失函数训练 CNN 模型 cost_matrix = torch.tensor([[0, 1], [5, 0]], dtype=torch.float32) criterion = CostSensitiveDecisionTreeLoss(cost_matrix) epochs = 20 for epoch in range(epochs): running_loss = 0.0 for i in range(len(X_train)): x = torch.tensor(X_train[i], dtype=torch.float32).view(1, 1, 28, 28) y = torch.tensor(y_train[i], dtype=torch.long) optimizer.zero_grad() outputs = model(x) loss = criterion(outputs, y) loss.backward() optimizer.step() running_loss += loss.item() print('Epoch [%d], Loss: %.4f' % (epoch+1, running_loss/len(X_train))) # 测试 CNN 模型 y_pred = [] for i in range(len(X_test)): x = torch.tensor(X_test[i], dtype=torch.float32).view(1, 1, 28, 28) output = model(x) _, predicted = torch.max(output.data, 1) y_pred.append(predicted.item()) print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred)) ``` 在这个代码,我们首先使用 `fetch_datasets()` 函数从 imbalanced-learn 库获取 CICIDS-2017 数据集,并使用 `RandomUnderSampler` 类平衡数据集。然后,我们使用 `train_test_split` 函数划分训练集和测试集,并定义一个 CNN 模型。接着,我们使用 nn.Module 类定义一个代价敏感决策树损失函数,其包含了一个代价矩阵。这个代价矩阵是一个 2x2 的矩阵,其第一行表示对真实类别为负例的样本的惩罚,第二行表示对真实类别为正例的样本的惩罚。然后,我们使用 Adam 优化器和交叉熵损失函数训练 CNN 模型,并使用代价敏感决策树损失函数训练 CNN 模型。最后,我们使用训练好的 CNN 模型对测试集进行预测,并使用 `confusion_matrix` 和 `classification_report` 函数打印模型的评估结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值