Kaggle竞赛——桑坦德银行客户满意度预测(一)

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

本文所用代码及教学内容均来自于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
### Kaggle Santander Customer Satisfaction 预测赛题的机器学习解决方案 Kaggle Santander Customer Satisfaction 是项二分类问题,目标是预测银行客户的交易体验是否满意。此竞赛数据具有不平衡性,因此模型优化的目标是最大化 AUC 值(ROC 曲线下面积)。以下是个完整的解决方案框架: --- #### 1. 数据预处理 数据预处理是构建高质量模型的基础步骤之。以下是关键步骤: - **特征分析**:检查特征分布、缺失值和异常值[^1]。 - **类别平衡处理**:由于这是个不平衡分类问题,可以使用 SMOTE 或 ADASYN 等技术生成少数类样本[^4]。 - **特征缩放**:对于某些算法(如逻辑回归或支持向量机),需要对数值型特征进行标准化或归化。 ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) ``` --- #### 2. 特征选择与降维 - **特征重要性评估**:通过随机森林等模型计算特征的重要性,筛选出对目标变量影响较大的特征。 - **降维方法**:如果特征维度较高,可以使用主成分分析(PCA)或线性判别分析(LDA)降低维度。 ```python from sklearn.ensemble import RandomForestClassifier from sklearn.feature_selection import SelectFromModel model = RandomForestClassifier() model.fit(X, y) # 根据特征重要性选择子集 sfm = SelectFromModel(model, threshold="mean") X_important = sfm.transform(X) ``` --- #### 3. 模型选择与训练 根据引用内容,不同模型的表现差异较大。以下是几种常用的分类模型及其优缺点: - **RandomForestClassifier**:效果较好且速度较快,适合初步建模[^4]。 - **GradientBoostingClassifier**:性能最优但速度较慢,适用于最终模型优化[^4]。 - **XGBoost/LightGBM/CatBoost**:这些梯度提升框架在处理大规模数据时表现优异,推荐作为主要模型[^2]。 ```python from sklearn.ensemble import GradientBoostingClassifier gb_model = GradientBoostingClassifier() gb_model.fit(X_train, y_train) ``` --- #### 4. 概率校准 概率校准旨在改进模型输出的概率估计质量,使其更接近真实值。这是分类任务中个重要的后处理步骤[^3]。 - **校准方法**:常用的方法包括 Platt Scaling 和 Isotonic Regression。 - **实现方式**:可以使用 `CalibratedClassifierCV` 对模型进行校准。 ```python from sklearn.calibration import CalibratedClassifierCV calibrated_gb = CalibratedClassifierCV(gb_model, method='sigmoid', cv=5) calibrated_gb.fit(X_train, y_train) ``` --- #### 5. 模型评估与调优 - **评估指标**:由于目标是最大化 AUC,建议使用 ROC 曲线和 AUC 分数作为主要评估标准。 - **超参数调优**:使用网格搜索(Grid Search)或贝叶斯优化(Bayesian Optimization)调整模型参数。 ```python from sklearn.model_selection import GridSearchCV param_grid = { 'n_estimators': [100, 200], 'learning_rate': [0.01, 0.1] } grid_search = GridSearchCV(GradientBoostingClassifier(), param_grid, scoring='roc_auc', cv=5) grid_search.fit(X_train, y_train) ``` --- #### 6. 提交结果 将测试集的预测结果保存为 CSV 文件,并按照竞赛要求格式提交。 ```python import pandas as pd test_predictions = calibrated_gb.predict_proba(X_test)[:, 1] submission = pd.DataFrame({'ID': test_ids, 'TARGET': test_predictions}) submission.to_csv('submission.csv', index=False) ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值