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

news2024/11/16 9:55:46

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

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


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

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

import numpy as np
import pandas as pd

import 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()
X1

array([['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 + '_' + f
            cate_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 + '_' + f
                cate_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.coloradmin.cn/o/1884981.html

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

相关文章

全国WMS厂商大盘点,哪家未来能杀出重围?

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 一、引言 随着物流行业的快速发展&#xff0c;仓储管理作为其重要的一环&#xff0c;正逐步受到越来越多企业的重视。当前&#xff0c;市…

可燃气体报警器检测标准对比:不同标准的优缺点分析

在工业生产及家庭生活中&#xff0c;可燃气体报警器发挥着至关重要的作用。它能够实时监测空气中可燃气体浓度&#xff0c;一旦超过安全阈值&#xff0c;便会发出警报&#xff0c;避免火灾和爆炸事故的发生。 接下来&#xff0c;佰德将重点探讨可燃气体报警器的检测标准&#…

三层交换基础

一、什么是三层交换 三层交换是一种在OSI模型第三层&#xff0c;即网络层上工作的网络设备技术&#xff0c;它整合了二层交换机的功能和路由器的部分功能&#xff0c;以实现更高效的网络数据转发和路由选择。三层交换技术的核心在于结合了二层交换技术和三层转发技术&#xff…

Java服务器代码远程调试(IDEA版)

Java服务器代码远程调试 配置启动脚本参数配置IDEA远程调试工具操作步骤 注意&#xff1a;远程调试的代码需要与本地代码一致&#xff0c;远程调试目的是解决本地环境无法支持调试的情况下&#xff0c;解决线上&#xff08;测试&#xff09;环境调试问题。 配置启动脚本参数 n…

Java Lambda语法介绍

目录 一、概述 二、Lambda语法的历史 2.1 Lambda名字的含义 2.2 Lambda的历史 三、Lambda语法的核心接口 3.1 Lambda的四大核心接口 3.1.1 概述 3.1.2 Consumer 接口 3.1.3 Supplier 接口 3.1.4 Function 接口,> 3.1.5 Predicate 接口 四、Lambda的引用 4.1 概…

统计鸟:小而美的网站流量统计工具,免费好用

目前常见的网站流量统计平台有百度统计、Google Analytics、51.LA、友盟等&#xff0c;但Google Analytics在国内打不开、友盟已收费、百度统计限制较多、51.LA也很可能走向收费&#xff0c;无奈的我总算在网上搜到一款小众而好用的网站流量统计工具——统计鸟&#xff0c;现给…

探索Toshiba东芝TLP265J光耦合器

在当今的电子元件市场中&#xff0c;寻找高质量和高可靠性的光耦合器解决方案对许多工程师和设计师来说至关重要。TLP265J这款产品在性能、安全性和可靠性方面均表现卓越&#xff0c;适用于多种工业和商业应用。本文将深入探讨TLP265J的特点、应用领域以及其技术优势&#xff0…

探索PcapPlusPlus开源库:网络数据包处理与性能优化

文章目录 0. 本文概要1. PcapPlusPlus介绍1.1 概述1.2主要特性和功能1.3 PcapPlusPlus 主要模块关系和依赖1.4 网络协议层处理过程 2. 实例2.1 基于 PcapPlusPlus 的应用程序设计和封装流程&#xff1a;2.2 多线程示例代码2.3 代码说明&#xff1a; 3. 程序性能进一步优化3.1 避…

基于人脸识别的考勤系统(Qt+opencv+Arm)测试报告

目录 1、项目描述 2、服务器端测试 2.1、注册人脸 A、填写基本信息 B、点击打开摄像头采集信息 C、点击拍照&#xff0c;提示数据库保存人脸信息成功 D、点击注册&#xff0c;提示注册成功 至此&#xff0c;服务器启动测试完毕 3、客户端测试 3.1、人脸验证测试 3.2、服务器端点…

2024 年江西省研究生数学建模竞赛A题:交通信号灯管理问题分析、实现代码及参考论文

2024 年江西省研究生数学建模竞赛题目交通信号灯管理 1 题目 交通信号灯是指挥车辆通行的重要标志&#xff0c;由红灯、绿灯、 黄灯组成。红灯停、绿灯行&#xff0c;而黄灯则起到警示作用。交通 信号灯分为机动车信号灯、非机动车信号灯、人行横道信号 灯、方向指示灯等。 一…

生产环境 CentOS 7 k8s v1.28.0离线部署

背景描述&#xff1a;CentOS 7 Kubernetes 离线部署 随着云计算和微服务架构的普及&#xff0c;Kubernetes&#xff08;K8s&#xff09;已经成为容器编排的标准工具。它能够自动化应用的部署、扩展和管理&#xff0c;使得开发和运维的工作更加高效和可靠。然而&#xff0c;在一…

(亲测有效)2024代替电视家的app,电视家停了还有什么软件可以看电视?

嘿&#xff0c;大家好&#xff0c;我是阿星&#xff0c;今天又来跟大家聊聊那些让人眼前一亮的电视直播软件。咱们这回不聊那些老掉牙的&#xff0c;来点新鲜的&#xff0c;让咱们的电视屏幕也能跟上潮流&#xff0c;享受一下科技带来的便利和乐趣。 首先&#xff0c;得提一提…

【Sklearn-驯化】一文分析教你如何使用k-means进行数据聚类

【Sklearn-驯化】一文分析教你如何使用k-means进行数据聚类 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#…

工业读码器与商用扫码器的区别

条码二维码在数字信息化应用越来越广泛&#xff0c;扫码器成为了数据收集和处理的重要工具&#xff0c;无论是工厂生产和物流包裹朔源追踪&#xff0c;还是商场超市扫码收银和餐饮娱乐等场景&#xff0c;均能看到扫码器的辅助&#xff0c;市场上的扫码器种类繁多&#xff0c;在…

深入解析:Java爬虫的本质是什么?

深入解析&#xff1a;Java爬虫的本质是什么&#xff1f; 引言&#xff1a; 随着互联网的快速发展&#xff0c;获取网络数据已成为许多应用场景中的重要需求。而爬虫作为一种自动化程序&#xff0c;能够模拟人类浏览器的行为&#xff0c;从网页中提取所需信息&#xff0c;成为了…

生物墨水的重要特性

生物打印技术正以前所未有的速度发展&#xff0c;为组织工程和再生医学领域带来了革命性的变革。然而&#xff0c;成功打印出功能性的三维结构&#xff0c;并将其应用于人体&#xff0c;离不开生物墨水这一关键材料。主要特性包括&#xff1a; 物理性质 表面张力: 表面张力影…

安科瑞新能源系统光储充能量监控管理

一、组网拓扑 安科瑞企业微电网能量管理系统Acrel-2000MG&#xff0c;是安科瑞根据新型电力系统下微电网监控系统与微电网能量管理系统的要求&#xff0c;总结国内外的研究和生产的先进经验&#xff0c;专门研制出的企业微电网能量管理系统。本系统满足光伏系统、风力发电、储…

微信小程序渲染层与逻辑层交互原理

1. 网页开发与小程序开发有何不同&#xff1f; 2. 小程序运行环境 3. 页面渲染技术选型 1. 纯客户端技术&#xff1b; 2. 纯Web技术&#xff1b; 3. 用客户端原生技术与Web技术结合的混合技术&#xff08;Hybrid&#xff09;&#xff0c;小程序就是使用的这种技术&#xff1…

试用笔记之-Delphi 7 发送阿里云短信源代码

Delphi 7 发送阿里云短信源代码 首先下载&#xff1a; http://www.htsoft.com.cn/download/Delphi7_AlliSms_Demo.rar 解压后&#xff0c;可以看到Delphi7的源代码 我们直接运行Alisms_delphi7.exe&#xff0c;出现下图界面&#xff0c;我们输入阿里云帐号和密码&#xff0c…

Langchain-Chatchat本地部署记录,三分钟学会!

1.前言&#xff1a; 最近AI爆发式的火&#xff0c;忆往昔尤记得16,17那会移动互联网是特别火热的&#xff0c;也造富了一批公司和个人&#xff0c;出来了很多精妙的app应用。现在轮到AI发力了&#xff0c;想想自己也应该参与到这场时代的浪潮之中&#xff0c;所以就找了开源的…