科普:WOE编码与One-Hot编码

WOE编码是业务逻辑与统计建模的结合,适合强业务导向的场景;
One-Hot编码是数据驱动的特征工程,适合追求模型性能的场景。

编码方式核心价值典型案例
WOE编码保留变量预测能力,适配线性模型银行违约预测逻辑回归
One-Hot编码释放特征空间表达能力,适配非线性模型图像分类神经网络

一、WOE编码(Weight of Evidence)

WOE 是一种用于将分类变量转化为连续变量的编码方法,主要用于金融风控、信用评分等领域。它通过计算每个类别对目标变量(如违约、欺诈)的预测能力,将分类特征转化为带有业务含义的数值,从而增强模型的解释性和预测效果。

WOE的计算基于以下公式:
WOE = ln(好样本比例 / 坏样本比例)

  • 好样本:目标变量为正例(如未违约、正常用户)。
  • 坏样本:目标变量为负例(如违约、欺诈用户)。

以“性别”特征为例,假设目标是预测用户是否违约:

性别总样本数违约样本数未违约样本数违约率(坏样本比例)未违约率(好样本比例)WOE值
1000150850150/1000 = 0.15850/1000 = 0.85ln(0.85/0.15) ≈ 1.76
8008072080/800 = 0.10720/800 = 0.90ln(0.90/0.10) ≈ 2.19

结论

  • 女性的WOE值更高(2.19 > 1.76),表明女性用户违约概率更低,对目标变量的预测能力更强。
  • 最终,“性别”特征被转化为两个WOE值(男→1.76,女→2.19)。
WOE的作用
  1. 处理高基数特征
    对于类别较多的变量(如城市、职业),WOE可通过合并低预测能力的类别减少维度。
  2. 业务解释性
    WOE值直接反映特征与目标变量的相关性,例如:
    • 正WOE值:类别对应的好样本比例更高(如女性未违约率高)。
    • 负WOE值:类别对应的坏样本比例更高(如某职业违约率高)。
  3. 与IV值结合
    **信息值(IV)**可基于WOE计算,用于评估特征的整体预测能力。

业务逻辑、提升模型效果 | 依赖目标变量、需分箱处理 | 金融风控、信用评分 |

实际应用注意事项
  1. 分箱处理
    连续变量需先分箱(如将年龄划分为“<25”“25-40”“>40”),再计算WOE。
  2. 处理极端情况
    若某类别无好样本或坏样本(如违约率为0%或100%),需通过平滑处理(如加1)避免无穷大。
  3. 模型适配
    WOE编码后的变量适合逻辑回归、决策树等模型,但需注意异常值对线性模型的影响。

通过WOE编码,分类特征可更有效地融入模型,同时保持业务含义的可解释性。

二、差异对比表

对比维度WOE编码One-Hot编码
编码原理基于分箱后正负样本比例计算(WOE公式:ln(好样本率/坏样本率))将每个类别转换为独立的0/1二值特征
适用模型逻辑回归、线性模型树模型(决策树、随机森林)、神经网络、支持向量机
特征维度维度不变(每个特征1个WOE值)维度膨胀(n个类别→n个特征)
信息保留保留变量的预测能力(与目标变量相关性)仅保留类别存在性,丢失顺序和数值信息
业务解释性可解释性强(WOE值大小直接反映风险程度)可解释性弱(需结合模型特征重要性分析)
计算复杂度需分箱并计算统计量(需目标变量信息)简单直接(无需目标变量)
稀疏性无稀疏问题(单值连续特征)高稀疏性(大量0值)
单调性要求强制单调性(分箱需满足WOE单调)无要求
二、典型应用场景对比
  1. WOE编码的典型场景

    • 银行风控模型:将年龄分箱后计算WOE值,直接输入逻辑回归模型
      # WOE计算示例
      def calculate_woe(bin, target):good = target[bin].mean()bad = 1 - goodreturn np.log(good / bad) if bad !=0 else 0
      
    • 优势:保留变量与违约率的单调关系,提升模型稳定性
  2. One-Hot编码的典型场景

    • 电商推荐系统:将用户省份转换为One-Hot特征,输入神经网络
      # One-Hot转换示例
      df = pd.get_dummies(df, columns=['省份'])
      
    • 优势:允许模型自动学习省份与购买行为的非线性关系

三、关键选择建议

  1. 模型类型决定编码方式

    • 线性模型(逻辑回归):必须使用WOE编码(保持线性关系)
    • 树模型/神经网络:优先使用One-Hot编码(处理高维稀疏数据能力强)
  2. 数据特性的影响

    • 高基数特征(如IP地址):One-Hot会导致维度爆炸,需结合特征选择
    • 有序特征(如收入等级):WOE编码能保留顺序信息,优于One-Hot
  3. 业务需求的权衡

    • 需模型可解释性:WOE编码的系数可直接解读(如WOE=0.5表示该箱风险比基准高50%)
    • 追求预测精度:对于树模型,One-Hot可能比WOE效果更好(但需注意过拟合)
四、混合使用策略
  • 分箱后同时输出WOE和One-Hot
    # 对年龄特征同时生成WOE和One-Hot
    df['年龄_WOE'] = woe_encoder.transform(df[['年龄']])
    df = pd.concat([df, pd.get_dummies(df['年龄区间'])], axis=1)
    
  • 适用场景:模型融合(如逻辑回归与随机森林的stacking)
五、One-Hot编码及其它哑变量

One-Hot编码生成的二进制特征被称为哑变量(Dummy Variables,python程序中的get_dummies),源于其“替代”原分类变量的作用。这些变量本身没有数值意义,仅作为类别存在的标记符号。例如:

  • 将“性别”(男/女)转换为两个哑变量:[男=1, 女=0][男=0, 女=1]
  • 哑变量名称中的“哑”(Dummy)强调其无实际数值含义,仅用于模型识别不同类别。

除One-Hot编码外,常见哑变量技术还包括:

1. 虚拟变量(Dummy Variables)
  • 核心差异:仅创建 k-1 个变量(排除一个基准类别),避免多重共线性。
  • 适用场景:传统统计模型(如线性回归)。
  • 示例:将“学历”(高中/本科/硕士)转换为两个哑变量:
    # 基准类别为“高中”
    本科=1, 硕士=0 → 本科
    本科=0, 硕士=1 → 硕士
    
2. 效应编码(Effect Coding)
  • 编码规则:基准类别用 -1,其他类别用 1
  • 应用场景:方差分析(ANOVA)中对比组效应。
  • 示例
    # 基准类别为“高中”
    本科=1, 硕士=1 → 本科或硕士(对比高中)
    本科=-1, 硕士=-1 → 高中
    
3. 参考编码(Reference Coding)
  • 特点:每个哑变量代表与基准类别的差异。
  • 示例
    # 基准类别为“男性”
    女性=1 → 对比男性的差异
    

哑变量的使用方法:

1. 数据预处理
# 示例:使用Pandas进行One-Hot编码
import pandas as pddf = pd.DataFrame({'颜色': ['红', '蓝', '绿']})
one_hot_df = pd.get_dummies(df, columns=['颜色'])
print(one_hot_df)

输出:

   颜色_红  颜色_蓝  颜色_绿
0      1      0      0
1      0      1      0
2      0      0      1
2. 模型输入
  • 线性模型(如逻辑回归):直接使用哑变量,但需注意多重共线性(建议用虚拟变量)。
  • 树模型(如随机森林):天然支持高维哑变量,无需处理共线性。
  • 神经网络:哑变量可作为输入层特征,模型自动学习类别间关系。
3. 结果解释
  • 系数解读:哑变量系数表示该类别与基准类别的差异。
    # 逻辑回归中,哑变量“颜色_红”系数为0.5
    # 解释:红色用户的转化率比基准类别(假设为绿色)高exp(0.5)=1.65倍
    
技术核心功能典型场景
One-Hot编码完整保留所有类别信息树模型、神经网络
虚拟变量避免共线性,适配统计模型线性回归、逻辑回归
效应编码对比组间差异方差分析(ANOVA)

选择建议

  • 机器学习模型(如树、神经网络):优先使用One-Hot编码。
  • 统计模型(如线性回归):使用虚拟变量(排除基准类别)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python----数据分析(Pandas一:pandas库介绍,pandas操作文件读取和保存)

一、Pandas库 1.1、概念 Pandas是一个开源的、用于数据处理和分析的Python库&#xff0c;特别适合处理表格类数 据。它建立在NumPy数组之上&#xff0c;提供了高效的数据结构和数据分析工具&#xff0c;使得数据操作变得更加简单、便捷和高效。 Pandas 的目标是成为 Python 数据…

Type-C:智能家居的电力革命与空间美学重构

在万物互联的时代浪潮中&#xff0c;家居空间正经历着从功能容器到智慧终端的蜕变。当意大利设计师安东尼奥奇特里奥提出"消失的设计"理念二十年后&#xff0c;Type-C充电技术正以润物无声的方式重塑着现代家居的形态与内核&#xff0c;开启了一场静默的居住革命。 【…

C++ 左值(lvalue)和右值(rvalue)

在 C 中&#xff0c;左值&#xff08;lvalue&#xff09;和右值&#xff08;rvalue&#xff09;是指对象的不同类别&#xff0c;区分它们对于理解 C 中的表达式求值和资源管理非常重要&#xff0c;尤其在现代 C 中涉及到移动语义&#xff08;Move Semantics&#xff09;和完美转…

【含文档+PPT+源码】基于SpringBoot和Vue的编程学习系统

项目介绍 本课程演示的是一款 基于SpringBoot和Vue的编程学习系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项…

关于新奇的css

background: linear-gradient(154deg, #07070915 30%, hsl(var(--primary) / 30%) 48%, #07070915 64%); filter: blur(100px); background: linear-gradient(154deg, #07070915 30%, hsl(var(--primary) / 30%) 48%, #07070915 64%); 这是一个线性渐变背景设置&#xff0c;角度…

Maxscript如何通过单击现有按钮添加新按钮?

创建一个按钮,你可以单击它,然后添加一个新按钮。 你必须创建一个动态UI,使用maxscript UI元素,将卷展栏构建为字符串,然后评估该字符串并打开新的卷展栏以更新你的UI;使用RolloutCreator(请参阅帮助文件)帮助您构建卷展栏,并打开新的卷展栏以更新您的UI,看下面的示…

Android控件Selector封装优化指南:高效实现动态UI效果

本文详细介绍了如何在Android开发中优化selector的封装&#xff0c;涵盖Button、TextView、ImageView、CheckBox、RadioButton等常见控件的动态效果实现。通过结合Material Design组件、矢量图、Ripple效果以及动画Selector&#xff0c;提供了一套现代化、高性能的解决方案&…

pytest+allure+jenkins

本地运行参考&#xff1a;pytestallure 入门-CSDN博客 jenkins运行如下&#xff1a; 安装插件&#xff1a;allure 配置allure安装目录 配置pytest、allure 环境变量 配置流水线 进行build,结果如下 ,点击allure report 查看结果

C#核心笔记——(五)框架概述

.NET Ftamework中几乎所有功能都是通过大量的托管类型提供的。这些类型组织在层次化的命名空间中&#xff0c;并打包为一套程序集&#xff0c;与CLR一起构成了.NET平台。 有些.NET类型是由CLR直接使用的&#xff0c;且对于托管宿主环境而言是必不可少的。这些类型位于一个名为…

phpstudy+phpstorm+xdebug【学习笔记】

配置PHPStudy 配置PHPSTORM phpstorm选择PHP版本 配置DEBUG 设置服务器 编辑配置 学习参考链接&#xff1a;&#xff1a;https://blog.csdn.net/m0_60571842/article/details/133246064

Vue:Vue+TS学习笔记

文章目录 前文Vue 3学习 Vue3 的重要性变更内容 底层逻辑选项式 API 和组合式 API体验组合式 API很多钩子组件通信 和 TS 结合开发为什么要用 TS? 正式上手 Vuets 开发给 ref 添加类型标记。ref, reactive, computed 综合代码模板引用类型传值写法 解决问题: 第三方包想要有类…

ACwing—01背包(暴力bfs+dp+递归+记忆化搜索算法)

问题 有 N件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数&#xff0c…

洛谷 P2801 教主的魔法 题解

之前学过 莫队 算法&#xff0c;其运用了分块思想&#xff1b;但是我居然是第一次写纯种的分块题目。 题意 给你一个长度为 n n n 的序列 a a a&#xff08;一开始 ∀ a i ∈ [ 1 , 1000 ] \forall a_i\in[1,1000] ∀ai​∈[1,1000]&#xff09;。要求执行 q q q 次操作&…

leetcode 75.颜色分类(荷兰国旗问题)

题目描述 题目分析 本题是经典的「荷兰国旗问题」&#xff0c;由计算机科学家 Edsger W. Dijkstra 首先提出。 要想单独解决这道题本身还是很简单的&#xff0c;统计0、1、2的数量然后按顺序赋值&#xff0c;或者手写一个冒泡排序&#xff0c;whatever。 但是在这一题中我们主…

rc4算法简单介绍及实现

0. 介绍 RC4是一种流密码&#xff0c;但因为安全性问题已经被弃用。 1. 算法描述 1.1 初始化 Key为生成的随机密钥&#xff1a;1-256B S为一数组&#xff1a;256B T为辅助数组&#xff1a;keylenB for (int i 0;i < 256;i) {S[i] i;T[i] S[i % keylen]; }1.2 初始化…

OpenEuler20.3 安装 Elasticsearch7.17

1、下载elasticsearch wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.17-linux-x86_64.tar.gz wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.17-linux-x86_64.tar.gz.sha512 shasum -a 512 -c elasticsea…

单元测试知识总结

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是单元测试&#xff1f; 单元测试是指&#xff0c;对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&#xff0c;这里的…

python爬虫笔记(一)

文章目录 html基础标签和下划线无序列表和有序列表表格加边框 html的属性a标签&#xff08;网站&#xff09;target属性换行线和水平分割线 图片设置宽高width&#xff0c;height html区块——块元素与行内元素块元素与行内元素块元素举例行内元素举例 表单from标签type属性pla…

【mysql】centOS7安装mysql详细操作步骤!—通过tar包方式

【mysql】centOS7安装mysql详细操作步骤&#xff01; linux系统安装mysql版本 需要 root 权限&#xff0c;使用 root 用户进行命令操作。使用tar文件包&#xff0c;安装&#xff0c;gz包也可以但是还需要配置用户&#xff0c;tar包虽然大&#xff0c;但是全啊&#xff01; 1. …

[新能源]新能源汽车快充与慢充说明

接口示意图 慢充接口为交流充电口&#xff08;七孔&#xff09;&#xff0c;快充接口为直流充电口&#xff08;九孔&#xff09;。 引脚说明 上图给的是充电口的引脚图&#xff0c;充电枪的为镜像的。 慢充接口引脚说明 快充接口引脚说明 充电流程 慢充示意图 慢充&…