桑坦德银行客户满意度预测
本文所用代码及教学内容均来自于B站:讯飞AI大学堂 kaggle教学合集
从一线支持团队到最高管理层,客户满意度是衡量成功的关键。不满意的客户不会留下来,更重要的是,不满意的顾客很少在离开前表达他们的不满。
因此,桑坦德银行(Santander Bank)向 Kaggle 社区求助,希望帮助他们在早期识别不满意的客户。这样做就可以让桑坦德银行采取积极措施,来改善客户的满意度,以免为时已晚。在本次比赛中,你将使用数百个匿名特征来预测客户是否对他们的银行业务体验感到满意或不满意。
数据及具体目标
★ 文件描述
train.csv - 包含目标变量的训练集
test.csv - 不包含目标变量的测试集
sample_submission.csv - 格式正确的示例提交文件
★ 数据字段
训练集是一个包含大量数值变量的匿名数据集,匿名数据集是指所有变量丧失原有的业务含义,所有变量经过了脱敏变换,这样我们就很难从业务角度去寻找突破口。来看一下里面具体的数据字段:
第一列是ID,中间有 369 列是经过处理的匿名变量,最后一列是目标变量 TARGET,取值为 0 表示满意的客户,取值为 1 表示不满意的客户。测试集不包含目标变量列,其余列与训练集一致,因此不再赘述。
★ 最终目标:对于测试集中的每个 ID,预测 TARGET 变量的概率。
★ 评估指标:要求用 AUC 作为评判标准,即预测概率和观察到的目标之间的 ROC 曲线下的区域面积。
实施流程

代码实现
导入数据包
# 数据处理
import numpy as np
import pandas as pd
import random
import itertools
from scipy import stats
from scipy.sparse import hstack
# 数据可视化
import matplotlib.pyplot as plt
import seaborn as sns
# 特征工程
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import OneHotEncoder
# 模型
from sklearn.model_selection import train_test_split
from sklearn.model_selection import RandomizedSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.calibration import CalibratedClassifierCV
from sklearn.ensemble import RandomForestClassifier
import xgboost as xgb
import lightgbm as lgb
from sklearn.metrics import roc_curve, roc_auc_score, log_loss
# 杂项
from tqdm import tqdm
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline
sns.set(palette='muted', style='whitegrid')
np.random.seed(13154)
导入数据
train = pd.read_csv('./data/santander-customer-satisfaction/train.csv')
test = pd.read_csv('./data/santander-customer-satisfaction/test.csv')
print('训练集样本数为 %i, 变量数为 %i' % (train.shape[0],train.shape[1]))
print('测试集样本数为 %i, 变量数为 %i' % (test.shape[0],test.shape[1]))
训练集和测试集的shape为:
训练集样本数为 76020, 变量数为 371
测试集样本数为 75818, 变量数为 370
我们打印出训练集的前五行:
train.head()

探索性数据分析(EDA)
在基于机器学习方法的数据分析过程中,我们往往要面临数据格式的不规范,单位的不统一,数据的分布不符合模型的需求等等问题。事实上,这也是在数据分析行业中人们更多的选择传统统计分析方法的原因之一。为了让数据易于被模型拟合,提升测试集的分类效果,我们需要对数据进行一定的调整。那么,应该如何选择调整策略呢?对于这种具有300多个特征的高维数据,逐个分析显然是不现实的,这里我们采取探索性数据分析方法对数据的特点进行提取。
在最初的数据处理过程中,我们有一些基本的原则是可以借鉴采纳的:
1、一个特征如果具有0方差,即对每一行记录该字段的数据都相同,那么我们认为他对目标变量是没有影响的,这样的特征我们选择删除。
2、通常来说,我们会将信息很少的特征称为稀疏特征,这里我们对“稀疏”一词作如下定义:该特征的0值的个数占到了所有值的99%。
3、判断特征是否重复。如果发现,我们仅保留其一,并删除重复特征之外的所有特征
4、删除/插补特征中带有缺失值的行
删除零方差特征
i = 0
for col in train.columns:
if train[col].var() == 0:
i += 1
del train[col]
del test[col]
print('%i 个特征具有零方差并且已被删除' % i)
删除稀疏特征
#过滤稀疏特征
#函数numpy.percentile():百分位数是统计中使用的度量,表示小于这个值的观察值的百分比。
i=0
for col in train.columns:
if np.percentile(train[col],99) == 0:
i += 1
del train[col]
del test[col]
print('%i 个特征是稀疏的并且已被删除' % (i))
删除重复特征
#获取所有列的两两组合
#来自 itertools 模块的函数 combinations(list_name, x) 将一个列表和数字 ‘x’ 作为参数,并返回一个元组列表,每个元组的长度为 ‘x’,其中包含x个元素的所有可能组合。
# 列表中元素不能与自己结合,不包含列表中重复元素
combinations = list(itertools.combinations(train.columns,2))
print(combinations[:20])
'''
[('ID', 'var3'), ('ID', 'var15'), ('ID', 'imp_ent_var16_ult1'), ('ID', 'imp_op_var39_comer_ult1'), ('ID', 'imp_op_var39_comer_ult3'), ('ID', 'imp_op_var41_comer_ult1'), ('ID', 'imp_op_var41_comer_ult3'), ('ID', 'imp_op_var41_efect_ult1'), ('ID', 'imp_op_var41_efect_ult3'), ('ID', 'imp_op_var41_ult1'), ('ID', 'imp_op_var39_efect_ult1'), ('ID', 'imp_op_var39_efect_ult3'), ('ID', 'imp_op_var39_ult1'), ('ID', 'ind_var1_0'), ('ID', 'ind_var5_0'), ('ID', 'ind_var5'), ('ID', 'ind_var8_0'), ('ID', 'ind_var8'), ('ID', 'ind_var12_0'), ('ID', 'ind_var12')]
'''
len(combinations)#11026
#删除重复特征,保留其一
remove = []
keep = []
for f1

本文介绍了针对桑坦德银行客户满意度的预测问题,包括数据导入、EDA、特征工程(删除零方差、稀疏和重复特征)和缺失值处理。接着探讨了目标变量分布和部分关键特征如var3(Region)、var15(Age)和var38(Mortgagevalues)的分析,展示了数据分布和年龄对满意度的影响。最后,提到了使用LogisticRegression、XGBoost和LightGBM等模型进行预测的初步步骤。
最低0.47元/天 解锁文章
1669

被折叠的 条评论
为什么被折叠?



