【Kaggle】Telco Customer Churn 数据编码与模型训练

💬在上一部分中,我们已经完成了对数据集背景解读、数据预处理与探索性分析。在数据背景解读中,我们介绍了数据集来源、电信用户流失分析的基本业务背景,并详细解释了每个字段的基本含义;在数据预处理过程中,我们对数据集进行了缺失值和异常值分析,并且根据实际业务情况对缺失值进行了0值填补;而在探索性分析的过程中,我们对比分析了标签不同取值时特征取值的分布情况,并从中初步分析影响用户流失的关键因素。

本节开始,我们将围绕此前已经处理好的数据来进一步来进行用户流失预测。当然,要进行尽可能精准的用户流失预测,就离不开特征工程、模型选择与训练、参数调优和模型融合这些环节。考虑到该数据集的建模目标有两个,其一是希望能够进行尽可能精准的预测,同时由于该案例也包含数据分析背景,要求模型结果也能够为业务人员在业务开展过程中提供具体指导意见,因此无论是在模型选型过程还是特征工程环节,我们都将同时纳入这两个因素进行综合考虑。


本节我们将优先考虑具备模型可解释性的逻辑回归和决策树,这两个算法也是大多数在要求对结果进行解释的场景下优先考虑的模型,此外在实际建模过程中需要注意的是,不同模型需要带入的数据编码类型也各不相同,因此在本节中,我们也将详细介绍各类数据编码方法及其使用过程中的注意事项。

💤根据上一小节的分析结果,再次执行数据预处理过程:

import numpy as np
import pandas as pdimport seaborn as sns
import matplotlib.pyplot as plt# 读取数据
tcc = pd.read_csv('WA_Fn-UseC_-Telco-Customer-Churn.csv')# 标注连续/离散字段
# 离散字段
category_cols = ['gender', 'SeniorCitizen', 'Partner', 'Dependents','PhoneService', 'MultipleLines', 'InternetService', 'OnlineSecurity', 'OnlineBackup', 'DeviceProtection', 'TechSupport', 'StreamingTV', 'StreamingMovies', 'Contract', 'PaperlessBilling','PaymentMethod']# 连续字段
numeric_cols = ['tenure', 'MonthlyCharges', 'TotalCharges']# 标签
target = 'Churn'# ID列
ID_col = 'customerID'# 验证是否划分能完全
assert len(category_cols) + len(numeric_cols) + 2 == tcc.shape[1]

注意,此处我们暂时将tenure划为连续性字段,以防止后续One-Hot编码时候诞生过多特征。然后进行连续变量的缺失值填补:

tcc['TotalCharges']= tcc['TotalCharges'].apply(lambda x: x if x!= ' ' else np.nan).astype(float)
tcc['MonthlyCharges'] = tcc['MonthlyCharges'].astype(float)tcc['TotalCharges'] = tcc['TotalCharges'].fillna(0)tcc['Churn'].replace(to_replace='Yes', value=1, inplace=True)
tcc['Churn'].replace(to_replace='No',  value=0, inplace=True)

当然,清洗完后的数据需要进行进一步重编码后才能带入进行建模,在考虑快速验证不同模型的建模效果时,需要考虑到不同模型对数据编码要求是不同的,因此我们需要先介绍关于机器学习中特征编码的相关内容。

离散字段的数据重编码

在上一小节中,我们对离散特征进行哑变量的变换过程其实就是一个数据重编码的过程。当然,需要注意的是,不同类型的字段由不同的编码方式,例如文本类型字段可能需要用到CountVector或TF-IDF处理、时序字段可能需要分段字典排序等,并且,不同模型对于数据编码类型要求也不一样,例如逻辑回归需要对多分类离散变量进行哑变量变换,而CatBoost则明确要求不能对离散字段字段进行哑变量变换、否则会影响模型速度和效果。因此,本部分我们先介绍较为通用的离散字段的编码方法,然后再根据后续实际模型要求,选择不同编码方式对数据进行处理。

OrdinalEncoder自然数排序 

首先是自然数排序方法,该方法的过程较为简单,即先对离散字段的不同取值进行排序,然后对其进行自然数值取值转化;对于自然数排序过程,我们可以通过简单的pandas中的列取值调整来进行,例如就像此前对标签字段取值的调整过程,此外也可以直接考虑调用sklearn中的OrdinalEncoder()评估器(转化器)。

from sklearn import preprocessing
preprocessing.OrdinalEncoder()
X1 = np.array([['F'], ['M'], ['M'], ['F']])
enc = preprocessing.OrdinalEncoder()enc.fit(X1)
enc.transform(X1) # 进行转换 类似模型的predict方法array([[0.],[1.],[1.],[0.]])

这种转化器的使用方式,也为非常便于我们执行在训练集上进行训练、在测试集上进行测试这一过程。

💥独热编码与哑变量区别:

  • 哑变量:生成的特征数量为n-1(n为原始分类变量的类别数),因为需要选择一个基准类别。
  • 独热编码:生成的特征数量为n,即每个类别都对应一个独立的特征。

OneHotEncoder独热编码

独热编码过程其实和我们此前介绍的哑变量创建过程一致(至少在sklearn中并无差别)。对于独热编码的过程,我们可以通过pd.get_dummies函数实现,也可以通过sklearn中OneHotEncoder评估器(转化器)来实现。

preprocessing.OneHotEncoder()
X1array([['F'],['M'],['M'],['F']], dtype='<U1')

enc = preprocessing.OneHotEncoder()
enc.fit_transform(X1).toarray()

💢同样,训练完成后的转化器会记录转化规则:

enc.categories_[array(['F', 'M'], dtype='<U1')]
# 该排序实际上也是字典顺序
'M' > 'F'

💢并能够对新的数据依据原转化规则进行转化:

X2# array([['M'],['F']], dtype='<U1')enc.transform(X2).toarray()#
array([[0., 1.],[1., 0.]])

对于独热编码的使用,有一点是额外需要注意的,那就是对于二分类离散变量来说,独热编码往往是没有实际作用的。例如对于上述极简数据集而言,Gender的取值是能是M或者F,独热编码转化后,某行Gender_F取值为1、则Gender_M取值必然为0,反之亦然。因此很多时候我们在进行独热编码转化的时候会考虑只对多分类离散变量进行转化,而保留二分类离散变量的原始取值。此时就需要将OneHotEncoder中drop参数调整为'if_binary',以表示跳过二分类离散变量列。

X3 = pd.DataFrame({'Gender': ['F', 'M', 'M', 'F'], 'Income': ['High', 'Medium', 'High', 'Low']})
drop_enc = preprocessing.OneHotEncoder(drop='if_binary')  # 跳过二分类离散变量
drop_enc.fit_transform(X3).toarray()

drop_enc.categories_[array(['F', 'M'], dtype=object),array(['High', 'Low', 'Medium'], dtype=object)]

不过需要注意的是,对于sklearn的独热编码转化器来说,尽管其使用过程会更加方便,但却无法自动创建转化后的列名称,而在需要考察字段业务背景含义的场景中,必然需要知道每一列的实际名称(就类似于极简示例中每一列的名字,通过“原列名_字段取值”来进行命名),因此我们需要定义一个函数来批量创建独热编码后新数据集各字段名称的函数。

💢首先我们先尝试围绕上述极简数据集来提取(创建)独热编码后新数据集的字段名称:

# 提取原始列名称
cate_cols = X3.columns.tolist()
cate_cols# ['Gender', 'Income']# 新编码字段名称存储
cate_cols_new = []# 提取独热编码后所有特征的名称
for i, j in enumerate(cate_cols):if len(drop_enc.categories_[i]) == 2:cate_cols_new.append(j)else:for f in drop_enc.categories_[i]:feature_name = j + '_' + fcate_cols_new.append(feature_name)# 查看新字段名称提取结果
cate_cols_new# ['Gender', 'Income_High', 'Income_Low', 'Income_Medium']# 组合成新的DataFrame
pd.DataFrame(drop_enc.fit_transform(X3).toarray(), columns=cate_cols_new)

💫然后将上述过程封装为一个函数:

def cate_colName(Transformer, category_cols, drop='if_binary'):"""离散字段独热编码后字段名创建函数:param Transformer: 独热编码转化器:param category_cols: 输入转化器的离散变量:param drop: 独热编码转化器的drop参数"""cate_cols_new = []col_value = Transformer.categories_for i, j in enumerate(category_cols):if (drop == 'if_binary') & (len(col_value[i]) == 2):cate_cols_new.append(j)else:for f in col_value[i]:feature_name = j + '_' + fcate_cols_new.append(feature_name)return(cate_cols_new)

测试函数效果:

cate_colName(drop_enc, cate_cols)
# ['Gender', 'Income_High', 'Income_Low', 'Income_Medium']

💯至此完整介绍独热编码相关功能与数据集列名称提取函数的使用方法。

ColumnTransformer转化流水线

在执行单独的转化器时,我们需要单独将要转化的列提取出来,然后对其转化,并且在转化完成后再和其他列拼接成新的数据集。尽管很多时候表格的拆分和拼接不可避免,但该过程显然不够“自动化”。在sklearn的0.20版本中,加入了ColumnTransformer转化流水线评估器,使得上述情况得以改善。该评估器和pipeline类似,能够集成多个评估器(转化器),并一次性对输入数据的不同列采用不同处理方法,并输出转化完成并且拼接完成的数据。
from sklearn.compose import ColumnTransformer

 ColumnTransformer的使用过程并不复杂,其基本说明如下:

ColumnTransformer?

其中,transformers表示集成的转化器,例如,如果我们需要对tcc数据集中的离散字段进行多分类独热编码,则需要输入这样一个转化器参数:

('cat', preprocessing.OneHotEncoder(drop='if_binary'), category_cols)

当然,ColumnTransformer可以集成多个转化器,即可以在一个转化流水线中说明对所有字段的处理方法。例如上述转化器参数只说明了需要对数据集中所有category_cols字段进行OneHotEncoder(drop='if_binary')转化,而对于tcc数据集来说,还有numeric_cols,也就是连续性字段,当然我们其实目前并不需要对这些连续型字段进行处理,但仍然不妨输入一个处理连续型字段的转化器参数(原因稍后解释),该参数可以写成如下形式:

('num', 'passthrough', numeric_cols)

如果需要对连续变量进行处理,如需要对其进行归一化或者分箱,则将'passthrough'cabs关于改为对应转化器。

preprocess_col = ColumnTransformer([('cat', preprocessing.OneHotEncoder(drop='if_binary'), category_cols), ('num', 'passthrough', numeric_cols)
])

而此时preprocess_col则表示对数据集的离散变量进行多分类独热编码处理,对连续变量不处理。如果从效果上看,preprocess_col和我们单独使用多分类独热编码处理离散变量过程并无区别,但实际上我们更推荐使用preprocess_col来进行处理,原因主要有以下几点:其一,通过preprocess_col处理后的数据集无需再进行拼接工作,preprocess_col能够直接输出离散变量独热编码+连续变量保持不变的数据集;其二,preprocess_col过程还能够对未选择的字段进行删除或者保留、或者统一再使用某种转化器来进行转化(默认是删除其他所有列),通过remainder参数来进行说明。例如,我们现在可以借助preprocess_col直接对tcc数据集进行离散变量独热编码、连续变量保留、以及剔除ID列和标签列的操作:

# 训练转化器
preprocess_col.fit(tcc)
#
ColumnTransformer(transformers=[('cat', OneHotEncoder(drop='if_binary'),['gender', 'SeniorCitizen', 'Partner','Dependents', 'PhoneService', 'MultipleLines','InternetService', 'OnlineSecurity','OnlineBackup', 'DeviceProtection','TechSupport', 'StreamingTV','StreamingMovies', 'Contract','PaperlessBilling', 'PaymentMethod']),('num', 'passthrough',['tenure', 'MonthlyCharges', 'TotalCharges'])])# 输出转化结果
pd.DataFrame(preprocess_col.transform(tcc))

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

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

相关文章

安全隔离上网的有效途径:沙箱

在数字化浪潮日益汹涌的今天&#xff0c;网络安全成为了不可忽视的重要议题。沙箱技术作为一种高效的隔离机制&#xff0c;为企业和个人提供了一种在享受网络便利的同时&#xff0c;保障系统安全的解决方案。本文旨在深入探讨沙箱技术如何做到隔离上网&#xff0c;从而为用户提…

AI系统:未来科技的驱动力

引言 人工智能&#xff08;Artificial Intelligence, AI&#xff09;是一门研究如何使计算机模拟、延伸和扩展人类智能的学科。自20世纪50年代起&#xff0c;人工智能作为一项科学研究领域开始兴起。早期的AI系统主要集中在简单的任务&#xff0c;如棋类游戏和数学证明。随着计…

华为云物联网的使用

这里我们设置三个属性 1.温度DHT11_T 上传 2.湿度DHT11_H 上传 3.风扇motor 远程控制&#xff08;云平台控制设备端&#xff09; 发布主题&#xff1a; $oc/devices/{device_id}/sys/properties/report 发布主题时&#xff0c;需要上传数据&#xff0c;这个数据格式是JSON格式…

2007年上半年软件设计师【上午题】试题及答案

文章目录 2007年上半年软件设计师上午题--试题2007年上半年软件设计师上午题--答案2007年上半年软件设计师上午题–试题

公司管理系统

准备工作 上图mapper类型错了&#xff0c;不是class&#xff0c;是interface&#xff0c;修正过后的图片&#xff0c;如下所示 修正如下 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.urljdbc:mysql://localhost:3306/webm spring.datasour…

【Tech Point】

ARM加速LLama C 加速对象 LLama C 加速对象 LLama C 关键技术&#xff1a; 使用neon加速指令进行SIMD操作&#xff1b;优化数据排布&#xff0c;降低数据读取的中断

【区块链+基础设施】区块链服务网络 BSN | FISCO BCOS应用案例

BSN&#xff08;Blockchain-based Service Network&#xff0c;区块链服务网络&#xff09;是一个跨云服务、跨门户、跨底层框架&#xff0c;用于部 署和运行各类区块链应用的全球性基础设施网络&#xff0c;旨在为开发者提供低成本和技术互通的区块链一站式服务。 2019 年 12…

网络安全等级保护2.0(等保2.0)全面解析

一、等保2.0的定义和背景 网络安全等级保护2.0&#xff08;简称“等保2.0”&#xff09;是我国网络安全领域的基本制度、基本策略、基本方法。它是在《中华人民共和国网络安全法》指导下&#xff0c;对我国网络安全等级保护制度进行的重大升级。等保2.0的发布与实施&#xff0c…

主成分分析(PCA)详解与Python实现

1. 引言 主成分分析&#xff08;PCA&#xff09;是一种统计方法&#xff0c;它通过正交变换将一组可能相关的变量转换成一组线性不相关的变量&#xff0c;这些不相关变量称为主成分。PCA常用于降维、数据压缩和模式识别等领域。 喜欢的伙伴们点个关注哦~~❤❤❤ 2. 理论基础…

C++封装

1. 封装 1.1. struct 当单一变量无法完成描述需求的时候&#xff0c;结构体类型解决了这一问题。可以将多个类型打包成一体&#xff0c;形成新的类型&#xff0c;这是c语言中的封装 但是&#xff0c;新类型并不包含&#xff0c;对数据类的操作。所有操作都是通过函数的方式进…

【C++】——【 STL简介】——【详细讲解】

目录 ​编辑 1. 什么是STL 2. STL的版本 3. STL的六大组件 1.容器(Container)&#xff1a; 2.算法(Algorithm)&#xff1a; 3.迭代器(Iterator)&#xff1a; 4.函数(Function)&#xff1a; 5.适配器(Adapter)&#xff1a; 6.分配器(Allocator)&#xff1a; 4. STL的…

调度器APScheduler定时执行任务

APScheduler&#xff08;Advanced Python Scheduler&#xff09;是一个Python库&#xff0c;用于调度任务&#xff0c;使其在预定的时间间隔或特定时间点执行。它支持多种调度方式&#xff0c;包括定时&#xff08;interval&#xff09;、日期&#xff08;date&#xff09;和Cr…

探索IT世界的第一步:高考后的暑期学习指南

目录 前言1. IT领域概述1.1 IT领域的发展与现状1.2 IT领域的主要分支1.2.1 软件开发1.2.2 数据科学1.2.3 网络与安全1.2.4 系统与运维 2. 学习路线图2.1 基础知识的学习2.1.1 编程语言2.1.2 数据结构与算法 2.2 实战项目的实践2.2.1 个人项目2.2.2 团队项目 2.3 学习资源的利用…

综合项目实战--jenkins流水线

一、流水线定义 软件生产环节,如:需求调研、需求设计、概要设计、详细设计、编码、单元测试、集成测试、系统测试、用户验收测试、交付等,这些流程就组成一条完整的流水线。脚本式流水线(pipeline)的出现代表企业人员可以更自由的通过代码来实现不同的工作流程。 二、pi…

气膜建筑照明:吊式与落地灯杆的利弊—轻空间

气膜建筑以其独特的设计和高效的功能性&#xff0c;广泛应用于体育场馆、工厂等各类场所。在这些气膜建筑中&#xff0c;照明方式的选择尤为重要。尽管有多种照明方式可供选择&#xff0c;但常用的反射光源形式在气膜建筑中尤为普遍。轻空间将重点介绍两种常用的反射照明方式&a…

Node端使用工作线程来解决日志开销-处理IO密集型任务

我们的BBF层很多时候会作为中间层处理后端到前端的数据&#xff0c;当然大部分时候都只是作为请求 / 响应的数据组装中心&#xff0c;但是有一个插件是怎么都绕不过去的&#xff1a;Log4js。 内部我们在Node层打印了很多日志。结果这周仔细分析了一下服务器处理请求到响应的中间…

音乐:触动心灵的艺术语言

Enjoy your music 音 乐 作为一种跨越时空和文化的艺术形式&#xff0c;拥有着无穷的魅力和力量。 它不仅能够带给我们愉悦的听觉享受&#xff0c;还对我们的身心健康、认知发展和社会交往产生着深远的影响。 一、音乐的基本元素 音乐由多个基本元素构成&#xff0c;包括…

【CentOS7.6】yum 报错:Could not retrieve mirrorlist http://mirrorlist.centos.org

一、报错 1.报错内容如下 在使用 yum makecache 命令时报错&#xff0c;在 yum install -y xxx 的时候报错等等 [roothcss-ecs-a901 yum.repos.d]# yum makecache Loaded plugins: fastestmirror Determining fastest mirrors Could not retrieve mirrorlist http://mirrorl…

【web APIs】快速上手Day03

目录 Web APIs - 第3天全选文本框案例事件流事件捕获事件冒泡阻止冒泡解绑事件on事件方式解绑addEventListener方式解绑 注意事项-鼠标经过事件的区别两种注册事件的区别 事件委托综合案例-tab栏切换改造 其他事件页面加载事件元素滚动事件页面滚动事件-获取位置页面滚动事件-滚…

巴西东南湾乌巴图巴 ANTARES 监测站数据

ANTARES monitoring station in Ubatuba, Southeast Brazilian Bight 巴西东南湾乌巴图巴 ANTARES 监测站 简介 ANTARES 区域网络由分布在拉丁美洲的沿岸时间序列站组成。主要目的是研究气候和人为影响引起的长期变化&#xff0c;以及用于卫星匹配和算法开发的海洋颜色。Uba…