label_binarize 函数详解
label_binarize是用于多类别分类问题中将标签转换为二值化格式的函数以便计算 ROC 曲线和 PR 曲线等需要二分类的指标。1. 基本概念from sklearn.preprocessing import label_binarize # 原始标签多类别 y_test [0, 1, 2, 0, 2, 1, ...] # 0,1,2 代表不同类别 # 二值化后 y_test_bin label_binarize(y_test, classes[0, 1, 2]) # 结果每个样本变成一个长度为3的向量 # [[1, 0, 0], # 类别0 # [0, 1, 0], # 类别1 # [0, 0, 1], # 类别2 # [1, 0, 0], # 类别0 # ...]2. 具体示例import numpy as np from sklearn.preprocessing import label_binarize # 示例数据3个类别0,1,2 y_test np.array([0, 1, 2, 0, 1, 2, 0, 1, 2]) # 二值化 y_test_bin label_binarize(y_test, classes[0, 1, 2]) print(原始标签:, y_test) print(\n二值化后的标签:) print(y_test_bin) # 输出 # 原始标签: [0 1 2 0 1 2 0 1 2] # # 二值化后的标签: # [[1 0 0] # 样本1属于类别0 # [0 1 0] # 样本2属于类别1 # [0 0 1] # 样本3属于类别2 # [1 0 0] # 样本4属于类别0 # [0 1 0] # 样本5属于类别1 # [0 0 1] # 样本6属于类别2 # [1 0 0] # 样本7属于类别0 # [0 1 0] # 样本8属于类别1 # [0 0 1]] # 样本9属于类别23. 为什么需要二值化ROC 曲线和 PR 曲线本质上是为二分类设计的对于多分类问题我们使用一对多 (One-vs-Rest)策略python# 假设我们有3个类别猫、狗、鸟 # 对于猫类别我们将其视为正类其他类别狗、鸟视为负类 # 原始预测概率 y_pred_proba [[0.7, 0.2, 0.1], # 样本170%猫20%狗10%鸟 [0.1, 0.8, 0.1], # 样本210%猫80%狗10%鸟 [0.2, 0.1, 0.7]] # 样本320%猫10%狗70%鸟 # 真实标签二值化后 y_test_bin [[1, 0, 0], # 样本1真实是猫 [0, 1, 0], # 样本2真实是狗 [0, 0, 1]] # 样本3真实是鸟 # 计算猫类别的ROC曲线 # 正类第1列 [1, 0, 0] # 预测分数第1列 [0.7, 0.1, 0.2]4. 完整的多分类 ROC 计算示例import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import label_binarize from sklearn.metrics import roc_curve, auc # 模拟数据 n_samples 100 n_classes 4 class_names [高价值客户, 潜在价值客户, 普通客户, 流失风险客户] # 真实标签0-3 y_true np.random.randint(0, n_classes, n_samples) # 模拟预测概率每个样本对4个类别的概率 y_pred_proba np.random.rand(n_samples, n_classes) y_pred_proba y_pred_proba / y_pred_proba.sum(axis1, keepdimsTrue) # 二值化真实标签 y_true_bin label_binarize(y_true, classesrange(n_classes)) print(f原始标签形状: {y_true.shape}) print(f二值化后形状: {y_true_bin.shape}) print(f\n前5个样本:) print(原始标签:, y_true[:5]) print(二值化后:) print(y_true_bin[:5]) # 为每个类别计算ROC曲线 plt.figure(figsize(10, 8)) for i in range(n_classes): # 第i个类别的真实标签二值化后的第i列 y_true_class y_true_bin[:, i] # 第i个类别的预测概率预测概率的第i列 y_score_class y_pred_proba[:, i] # 计算ROC曲线 fpr, tpr, _ roc_curve(y_true_class, y_score_class) roc_auc auc(fpr, tpr) plt.plot(fpr, tpr, lw2, labelf{class_names[i]} (AUC {roc_auc:.3f})) plt.plot([0, 1], [0, 1], k--, lw2) plt.xlabel(假阳性率, fontsize12) plt.ylabel(真阳性率, fontsize12) plt.title(多类别ROC曲线 - One-vs-Rest策略, fontsize14) plt.legend() plt.grid(True, alpha0.3) plt.show()5. 参数详解label_binarize(y_test, classesrange(len(class_names))) # 参数说明 # y_test: 原始标签数组形状为 (n_samples,) # 例如: [0, 2, 1, 0, 2, ...] # # classes: 指定所有可能的类别 # range(len(class_names)) 生成 [0, 1, 2, ..., n_classes-1] # 确保二值化后的矩阵有正确的列数 # # 返回值: 形状为 (n_samples, n_classes) 的二进制矩阵6. 实际应用场景# 在你的代码中 class_names [高价值客户, 潜在价值客户, 普通客户, 流失风险客户] n_classes len(class_names) # n_classes 4 # y_test 是整数标签例如 [0, 2, 1, 3, 0, ...] # 0: 高价值客户 # 1: 潜在价值客户 # 2: 普通客户 # 3: 流失风险客户 y_test_bin label_binarize(y_test, classesrange(n_classes)) # 结果每个样本变成4维向量 # 样本真实为高价值客户(0) - [1, 0, 0, 0] # 样本真实为潜在价值客户(1) - [0, 1, 0, 0] # 样本真实为普通客户(2) - [0, 0, 1, 0] # 样本真实为流失风险客户(3) - [0, 0, 0, 1]7. 不使用 label_binarize 的手动实现# 手动实现相同的功能 def manual_label_binarize(y, classes): n_samples len(y) n_classes len(classes) y_bin np.zeros((n_samples, n_classes)) for i, label in enumerate(y): y_bin[i, label] 1 return y_bin # 测试 y_test np.array([0, 1, 2, 0, 1, 2]) classes [0, 1, 2] y_bin_manual manual_label_binarize(y_test, classes) y_bin_sklearn label_binarize(y_test, classesclasses) print(手动实现:\n, y_bin_manual) print(\nSklearn实现:\n, y_bin_sklearn) print(\n是否相同:, np.array_equal(y_bin_manual, y_bin_sklearn))8. 为什么 classesrange(len(class_names))# 你的代码中 class_names [高价值客户, 潜在价值客户, 普通客户, 流失风险客户] len(class_names) 4 range(len(class_names)) range(0, 4) [0, 1, 2, 3] # 这意味着你的类别标签必须是 0,1,2,3 # 如果你的标签是字符串需要先转换为数字 from sklearn.preprocessing import LabelEncoder # 将字符串标签转换为数字 label_encoder LabelEncoder() y_test_numeric label_encoder.fit_transform(y_test_strings) # 转换后高价值客户 - 0, 潜在价值客户 - 1, 等等 # 然后再二值化 y_test_bin label_binarize(y_test_numeric, classesrange(4))总结label_binarize的作用是将多分类标签转换为二值化矩阵使得每个类别可以独立地计算二分类指标ROC、PR实现 One-vs-Rest 策略便于计算宏平均和微平均等汇总指标这是处理多分类问题中计算 ROC/PR 曲线的标准做法