likes
comments
collection
share

机器学习基础-监督学习-测试数据之F1值和ROC曲线

作者站长头像
站长
· 阅读数 3

F1 值

F1 值是衡量二分类模型性能的一种指标,它是精确率和召回率的调和平均数,可以综合考虑模型的准确性和召回率,对于不平衡数据集的二分类任务比准确率更加合适。

F1 值的计算公式如下:

F1=2∗Precision∗RecallPrecision+RecallF1 = \frac{2*Precision*Recall}{Precision+Recall}F1=Precision+Recall2PrecisionRecall

其中,Precision 为精确率,Recall 为召回率。精确率表示预测为正例的样本中,真正为正例的比例;召回率表示真正为正例的样本中,被正确预测为正例的比例。

以下是一个示例代码,展示如何计算二分类模型在测试集上的 F1 值:

import numpy as np
from sklearn.metrics import f1_score
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# 加载数据
data = np.loadtxt('data.csv', delimiter=',')
X = data[:, :-1]  # 特征矩阵
y = data[:, -1]   # 标签

# 将数据集分成训练集和测试集,比例为8:2
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 训练模型
model = LogisticRegression()
model.fit(X_train, y_train)

# 使用测试集评估模型性能
y_pred = model.predict(X_test)
f1 = f1_score(y_test, y_pred)

print('模型在测试集上的F1值为:', f1)

上述代码中,我们使用 f1_score 函数计算模型在测试集上的 F1 值。该函数需要传入测试集真实标签 y_test 和模型预测标签 y_pred 两个参数。f1_score 函数的实现方式如下:

def f1_score(y_true, y_pred):
    precision = precision_score(y_true, y_pred)
    recall = recall_score(y_true, y_pred)
    return 2 * (precision * recall) / (precision + recall)

在该实现方式中,我们先计算出精确率和召回率,然后根据上述公式计算 F1 值。

F1 值的取值范围是 0 到 1 之间,越接近 1 表示模型的性能越好,越接近 0 表示模型的性能越差。当精确率和召回率同时很高时,F1 值也会很高,因此,F1 值比单独使用精确率或召回率更加全面和客观。

需要注意的是,F1 值对于数据集类别分布不平衡的情况下,可能会失去一定的准确性。在极端情况下,比如正例只有极少的情况,模型始终预测为负例时,精确率和召回率都为 0,因此 F1 值也为 0,这时候 F1 值就不再是一个可靠的指标。此时,需要考虑使用其他指标来评估模型的性能,比如受试者工作特征曲线(ROC 曲线)和 AUC(曲线下面积)。

总之,F1 值是衡量二分类模型性能的一种常用指标,它综合考虑了精确率和召回率,对于不平衡数据集的二分类任务比准确率更加合适。在实际应用中,需要根据具体的情况选择合适的指标来评估模型的性能。

ROC 曲线(Receiver Operating Characteristic curve)

ROC 曲线(Receiver Operating Characteristic curve)是用于评估二分类模型性能的一种常用工具。ROC 曲线是一条二维曲线,以真正例率(True Positive Rate,TPR)为纵坐标,以假正例率(False Positive Rate,FPR)为横坐标,描述了模型在不同阈值下的表现。

具体来说,TPR 是指在所有实际为正例的样本中,被模型正确预测为正例的比例;而 FPR 是指在所有实际为负例的样本中,被模型错误预测为正例的比例。ROC 曲线是 TPR-FPR 平面上的曲线,曲线越靠近左上角,说明模型的性能越好。

以下是一个简单的示例代码,展示如何绘制 ROC 曲线和计算 AUC 值:

import numpy as np
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt

# 生成二分类数据
X, y = make_classification(n_samples=1000, n_classes=2, random_state=0)

# 将数据集分成训练集和测试集,比例为8:2
n_train = int(0.8 * X.shape[0])
X_train, y_train = X[:n_train], y[:n_train]
X_test, y_test = X[n_train:], y[n_train:]

# 训练逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)

# 使用测试集评估模型性能
y_score = model.decision_function(X_test)
fpr, tpr, thresholds = roc_curve(y_test, y_score)

# 绘制ROC曲线
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (AUC = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()

上述代码中,我们首先使用 make_classification 函数生成一个随机的二分类数据集。然后将数据集按照 8:2 的比例分成训练集和测试集,使用 LogisticRegression 类训练一个逻辑回归模型,并使用 decision_function 方法来计算测试集样本的预测分数。接下来使用 roc_curve 函数计算模型在不同阈值下的 TPR 和 FPR,最后使用 auc 函数计算 ROC 曲线下的面积,即 AUC 值。最后使用 matplotlib 库绘制 ROC 曲线。

需要注意的是,计算 ROC 曲线和 AUC 值时,需要使用模型在测试集上的预测分数,因为模型在不同阈值下的表现不同,所以 ROC 曲线展现了模型在不同阈值下的表现,是评估模型性能的一种常用方法。如果模型的 ROC 曲线在左上角,说明模型具有很好的性能;如果 ROC 曲线与对角线重合,则说明模型的性能等同于随机猜测。

在实际应用中,我们可以根据 ROC 曲线的形状和 AUC 值来选择最优的模型。如果我们有多个二分类模型可供选择,我们可以使用交叉验证等方法来计算每个模型的 ROC 曲线和 AUC 值,然后选择 AUC 值最大的模型。

除了二分类问题,ROC 曲线也可以用于多分类问题。在这种情况下,我们可以使用 One-vs-Rest 或 One-vs-One 等方法将多分类问题转化为多个二分类问题,然后计算每个二分类问题的 ROC 曲线和 AUC 值。

总之,ROC 曲线是评估二分类模型性能的一种重要工具,可以帮助我们选择最优的模型。同时,它也是一个非常直观的工具,因为它展现了模型在不同阈值下的表现。