【特征工程】特征分箱

2024-02-22 09:38
文章标签 工程 特征 分箱

本文主要是介绍【特征工程】特征分箱,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


  对数据分析、机器学习、数据科学、金融风控等感兴趣的小伙伴,需要数据集、代码、行业报告等各类学习资料,可添加微信:wu805686220(记得要备注喔!),也可关注微信公众号:风控圏子(别打错字,是圏子,不是圈子,算了直接复制吧!)

关注公众号后,可联系圈子助手加入如下社群:

  • 机器学习风控讨论群(微信群)
  • 反欺诈讨论群(微信群)
  • python学习交流群(微信群)
  • 研习社资料(qq群:102755159)(干货、资料、项目、代码、报告、课件)

相互学习,共同成长。


脚本介绍:

  1)一份完整的自动化特征评估脚本

  2)包括数据预处理、特征分箱、特征重要性评估

作者:研习社-正阳

一. 导入相关工具和路径

在这里插入图片描述

二. 数据预处理

1.自定义缺失值处理函数

1.1 缺失值计算

计算特征数据缺失占比
在这里插入图片描述

1.2 按特征(列)删除
  • 若字段数据缺失严重,可先检查字段特性,是业务层面设计需求,或者是数据抓取异常
  • 如无上述问题,建议删除缺失值占比大于设定阈值的字段
  • 常见阈值为90%以上或者40%~50%以上,根据特征是否对应明确的业务含义而决定是否保留
    在这里插入图片描述
1.3 按样本(行)删除
  • 在无数据采集问题的情况下,若单样本数据缺失严重,可认为样本数据无效,建议删除。
    在这里插入图片描述

2. 自定义常变量处理函数

  • 同值化较严重的字段,如无特殊业务含义,某一数据占比超过阈值时,建议删除
    在这里插入图片描述

3. 自定义data_processing函数,执行完整数据预处理步骤:

1、导入数据

2、删除缺失值(自定义函数)

3、删除常变量(自定义函数)

  1)常变量(自定义函数)

  2)方差为0

4、缺失值填充

  1)分类型特征填充(自定义函数)

  2)连续型特征填充(自定义函数)


def data_processing(df, target):"""df:包含了label和特征的宽表return:df :清洗后的数据集"""# 特征缺失处理df = missing_delete_var(df, threshold=0.8)# 样本缺失处理df = missing_delete_user(df, threshold=int(df.shape[1] * 0.8))col_list = [x for x in df.columns if x != target]# 常变量处理df = const_delete(df, col_list, threshold=0.9)desc = df.describe().T# 剔除方差为0的特征std_0_col = list(desc[desc['std'] == 0].index)if len(std_0_col) > 0:df = df.drop(std_0_col, axis=1)df.reset_index(drop=True, inplace=True)# 缺失值计算和填充miss_df = missing_cal(df)cate_col = list(df.select_dtypes(include=['O']).columns)num_col = [x for x in list(df.select_dtypes(include=['int64', 'float64']).columns) if x != 'label']# 分类型特征填充cate_miss_col1 = [x for x in list(miss_df[miss_df.missing_pct > 0.05]['col']) if x in cate_col]cate_miss_col2 = [x for x in list(miss_df[miss_df.missing_pct <= 0.05]['col']) if x in cate_col]# 连续型特征填充num_miss_col1 = [x for x in list(miss_df[miss_df.missing_pct > 0.05]['col']) if x in num_col]num_miss_col2 = [x for x in list(miss_df[miss_df.missing_pct <= 0.05]['col']) if x in num_col]for col in cate_miss_col1:df[col] = df[col].fillna('未知')for col in cate_miss_col2:df[col] = df[col].fillna(df[col].mode()[0])for col in num_miss_col1:df[col] = df[col].fillna(-999)for col in num_miss_col2:df[col] = df[col].fillna(df[col].median())return df, miss_df

三、特征分箱

分箱逻辑:

1、类别型特征

  1)类别数在5个以下,可以直接根据类别来分箱 (binning_cate)

  2)类别数在5个以上,建议做降基处理,再根据降基后的类别做分箱

2、数值型特征

  1)离散型数值特征(特征value的变动幅度较小):

    若特征value的非重复计数在5个以下,可以直接根据非重复计数值来分箱(binning_cate)

    若特征value的非重复计数在5个以上,建议根据业务解释或者数据分布做自定义分箱(binning_self)

  2)连续型数值特征(特征value的变动幅度较大):

    可以用卡方分箱或自定义分箱。(binning_num,binning_self)

    PS:一些特征用卡方分可能会报错,建议这些特征改为手动自定义分箱

3、特征有缺失

  1)缺失率在5%以下,可以先对缺失做填充处理再分箱(binning_num)

  2)缺失率在5%以上,建议将缺失当作一个类别来分箱(binning_sparse_col)

4、稀疏特征分箱

  建议将稀疏值(一般为0)单独分为一箱,剩下的值做卡方或者自定义分箱(binning_sparse_col)

1.自定义指标评估函数

  • KS、precision、 tpr、 fpr
def cal_ks(df, col, target):"""df:数据集col:输入的特征target:好坏标记的字段名return:ks: KS值precision:准确率tpr:召回率fpr:打扰率"""bad = df[target].sum()good = df[target].count() - badvalue_list = list(df[col])label_list = list(df[target])value_count = df[col].nunique()items = sorted(zip(value_list, label_list), key=lambda x: x[0])value_bin = []ks_list = []if value_count <= 200:for i in sorted(set(value_list)):value_bin.append(i)label_bin = [x[1] for x in items if x[0] < i]badrate = sum(label_bin) / badgoodrate = (len(label_bin) - sum(label_bin)) / goodks = abs(goodrate - badrate)ks_list.append(ks)else:for i in range(1, 201):step = (max(value_list) - min(value_list)) / 200idx = min(value_list) + i * stepvalue_bin.append(idx)label_bin = [x[1] for x in items if x[0] < idx]badrate = sum(label_bin) / badgoodrate = (len(label_bin) - sum(label_bin)) / goodks = abs(goodrate - badrate)ks_list.append(ks)ks = round(max(ks_list), 3)ks_value = [value_bin[i] 

这篇关于【特征工程】特征分箱的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/734839

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

OmniGlue论文详解(特征匹配)

OmniGlue论文详解(特征匹配) 摘要1. 引言2. 相关工作2.1. 广义局部特征匹配2.2. 稀疏可学习匹配2.3. 半稠密可学习匹配2.4. 与其他图像表示匹配 3. OmniGlue3.1. 模型概述3.2. OmniGlue 细节3.2.1. 特征提取3.2.2. 利用DINOv2构建图形。3.2.3. 信息传播与新的指导3.2.4. 匹配层和损失函数3.2.5. 与Super

《计算机视觉工程师养成计划》 ·数字图像处理·数字图像处理特征·概述~

1 定义         从哲学角度看:特征是从事物当中抽象出来用于区别其他类别事物的属性集合,图像特征则是从图像中抽取出来用于区别其他类别图像的属性集合。         从获取方式看:图像特征是通过对图像进行测量或借助算法计算得到的一组表达特性集合的向量。 2 认识         有些特征是视觉直观感受到的自然特征,例如亮度、边缘轮廓、纹理、色彩等。         有些特征需要通

二、Maven工程的创建--JavaSEJavaEE

1、idea创建Maven JavaSE工程:  2、idea创建Maven JavaEE工程:   (1)手动创建 (2)插件方式创建 在idea里安装插件JBLJavaToWeb; 选择需要生成的项目文件后,右击: 项目的webapp文件夹出现小蓝点,代表成功。

HalconDotNet中的图像特征与提取详解

文章目录 简介一、边缘特征提取二、角点特征提取三、区域特征提取四、纹理特征提取五、形状特征提取 简介   图像特征提取是图像处理中的一个重要步骤,用于从图像中提取有意义的特征,以便进行进一步的分析和处理。HalconDotNet提供了多种图像特征提取方法,每种方法都有其特定的应用场景和优缺点。 一、边缘特征提取   边缘特征提取是图像处理中最基本的特征提取方法之一,通过检

三、Maven工程的构建

首先,创建和构建是两个概念。 构建是指将源代码、依赖库和资源文件等转换为可执行或可部署的应用程序的过程。 在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。 项目构建是软件开发过程中至关重要的一部分,它能够大大提高软件开发效率,使得开发人员更加专注于应用程序的开发和维护,而不必关心应用程序的构建细节。 同时,项目构建还能将多人写的代码聚合,并能够自动化项目的构建和部署,

我在高职教STM32——准备HAL库工程模板(1)

新学期开学在即,又要给学生上 STM32 嵌入式课程了。这课上了多年了,一直用的都是标准库来开发,已经驾轻就熟了。人就是这样,有了自己熟悉的舒适圈,就很难做出改变,老师上课也是如此,排斥新课和不熟悉的内容。显然,STM32 的开发,HAL 库已是主流,自己其实也在使用,只不过更换库就意味着教学内容有很大变化,自己也就迟迟没有迈出调整这一步。现在,是时候做出变化了,笔者计划保持教学项

java工程的导入jar包

由于现在学习java web,java工程导入jar包都忘记了。 在此想记录一下:工程项目名:右击 -- Build Path --add External Archives 点击会弹出一个框 ,选择你要导入的jar路径就可以了。

WebShell流量特征检测_哥斯拉篇

90后用菜刀,95后用蚁剑,00后用冰蝎和哥斯拉,以phpshell连接为例,本文主要是对后三款经典的webshell管理工具进行流量分析和检测。 什么是一句话木马? 1、定义 顾名思义就是执行恶意指令的木马,通过技术手段上传到指定服务器并可以正常访问,将我们需要服务器执行的命令上传并执行 2、特点 短小精悍,功能强大,隐蔽性非常好 3、举例 php一句话木马用php语言编写的,运行