目录

一、数据探索:

1.1 读取数据

1.2查看数据

1.3 数据预处理

二、字段描述

2.1 非离散型数据

2.2离散数值字段

三、数据建模

四、评估指标:

4.1:混淆矩阵

4.2: 准确率,回归率,F1

五、测试集准确率

六、模型优化


环境:使用python+jupter nodebook

数据:本文数据来源2023年【教学赛】金融数据分析赛题1:银行客户认购产品预测

赛题(数据)网址:【教学赛】金融数据分析赛题1:银行客户认购产品预测-天池大赛-阿里云天池

一、数据探索:

1.1 读取数据

所需要的库包:

import pandas as pd
import numpy as np
trian=pd.read_csv("train.csv")
test=pd.read_csv("test.csv")

1.2查看数据

是否正常,有无异常值:

查看统计量

print(df.describe().T)

查看数据分布(散点图):

# 1 查看统计量
print(df.describe().T)
# 2 duration分箱展示
import matplotlib.pyplot as plt
import seaborn as sns# 3.查看数据分布
# 分离数值变量与分类变量
Nu_feature = list(df.select_dtypes(exclude=['object']).columns)
Ca_feature = list(df.select_dtypes(include=['object']).columns)
Ca_feature.remove('subscribe')
col1=Ca_feature
plt.figure(figsize=(20,10))
j=1
for col in col1:ax=plt.subplot(4,5,j)ax=plt.scatter(x=range(len(df)),y=df[col],color='red')plt.title(col)j+=1
k=11
for col in col1:ax=plt.subplot(4,5,k)ax=plt.scatter(x=range(len(test)),y=test[col],color='cyan')plt.title(col)k+=1
plt.subplots_adjust(wspace=0.4,hspace=0.3)
plt.show()

数据相关图(热力图)

# # 4.数据相关图
from sklearn.preprocessing import LabelEncoder
lb = LabelEncoder()
cols = Ca_feature
for m in cols:df[m] = lb.fit_transform(df[m])test[m] = lb.fit_transform(test[m])
#
df['subscribe'] = df['subscribe'].replace(['no', 'yes'], [0, 1])correlation_matrix = df.corr()
plt.figure(figsize=(12, 10))
sns.heatmap(correlation_matrix, vmax=0.9, linewidths=0.05, cmap="RdGy")
plt.show()

查看数据是否有空值或者unkonw

#数据没有NA值但是有unknow值
train_set.isin(['unknown']).mean()*100
test_set.isin(['unknown']).mean()*100
# 工作,教育和沟通方式用众数填充

1.3 数据预处理

对训练集和测试集数据进行填充:

trian['default'].replace(['unknown'], test['default'].mode(), inplace=True)
trian['job'].replace(['unknown'], trian['job'].mode(), inplace=True)
trian['education'].replace(['unknown'], trian['education'].mode(), inplace=True)
trian['marital'].replace(['unknown'], trian['marital'].mode(), inplace=True)
trian['housing'].replace(['unknown'], trian['housing'].mode(), inplace=True)
trian['loan'].replace(['unknown'], trian['loan'].mode(), inplace=True)# test.drop(['default'], inplace=True, axis=1)
test['default'].replace(['unknown'], test['default'].mode(), inplace=True)
test['job'].replace(['unknown'], test['job'].mode(), inplace=True)
test['education'].replace(['unknown'], test['education'].mode(), inplace=True)
test['marital'].replace(['unknown'], test['marital'].mode(), inplace=True)
test['housing'].replace(['unknown'], test['housing'].mode(), inplace=True)
test['loan'].replace(['unknown'], test['loan'].mode(), inplace=True)
print(trian["job"].value_counts())

二、字段描述

2.1 非离散型数据

# #统计图
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
trian['subscribe'] = trian['subscribe'].replace(['no', 'yes'], [0,1])
plt.figure(figsize = [15,10])#画板大小
sns.barplot(x = "job", y ="subscribe" , data = trian)
x_1=["管理者","蓝领","技术员","服务员","经营者","退役人员","企业家","个体经营者","女佣","失业人员","学生"]
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\STHUPO.TTF',size=20)
# plt.xticks(range(len(x_1)),x_1,fontproperties = my_font)
plt.xticks(range(len(x_1)),x_1,fontsize=20,rotation=45)
plt.yticks(fontsize=15)
my= font_manager.FontProperties(size=20)
plt.xlabel("“客户身份”",fontproperties = my)
plt.ylabel("产品购买数量指数",fontproperties = my)
plt.title("客户购买银行产品意向图",fontdict={"size": 25})
plt.tight_layout()
plt.show()

import seaborn as sns
object_columns = ['job', 'marital', 'education', 'default', 'housing','loan', 'contact','month','day_of_week','poutcome']
#连续变量列名
num_columns = ['age', 'duration', 'campaign', 'pdays','previous', "cons_conf_index",'emp_var_rate',"cons_price_index","lending_rate3m","nr_employed"]
# # 统计图# #统计图
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.figure(figsize = [10,10])#画板大小
sns.barplot(x = "marital", y ="subscribe" , data = trian)
x_1=["结婚"," 已婚","单身"]
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\STHUPO.TTF',size=20)
# plt.xticks(range(len(x_1)),x_1,fontproperties = my_font)
plt.xticks(range(len(x_1)),x_1,fontsize=20)
plt.yticks(fontsize=15)
my= font_manager.FontProperties(size=20)
plt.xlabel("客户婚姻状态",fontproperties = my)
plt.ylabel("产品购买数量指数",fontproperties = my)
plt.title("不同婚姻状态的客户购买银行产品意向图",fontdict={"size": 25})
plt.tight_layout()
plt.show()

# #统计图
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.figure(figsize = [10,8])#画板大小
sns.barplot(x = "education", y ="subscribe" , data = trian)
x_1=["大学学历"," 高中","基本9年","教授","基本4年","基本6年","文盲"]
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\STHUPO.TTF',size=20)
# plt.xticks(range(len(x_1)),x_1,fontproperties = my_font)
plt.xticks(range(len(x_1)),x_1,fontsize=25)
plt.yticks(fontsize=15)
my= font_manager.FontProperties(size=20)
plt.xlabel("客户教育程度",fontproperties = my)
plt.ylabel("产品购买数量指数",fontproperties = my)
plt.title("不同教育程度的客户购买银行产品意向图",fontdict={"size": 25})
plt.tight_layout()
plt.show()
print(trian["education"].value_counts())

object_columns = ['job', 'marital', 'education', 'default', 'housing','loan', 'contact','month','day_of_week','poutcome']
# #统计图
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.figure(figsize = [8,8])#画板大小
sns.barplot(x = "month", y ="subscribe" , data = trian)
# x_1=["大学学历"," 高中","基本9年","教授","基本4年","基本6年","文盲"]
from matplotlib import font_manager
# my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\STHUPO.TTF',size=20)
# plt.xticks(range(len(x_1)),x_1,fontproperties = my_font)
plt.xticks(fontsize=25)
plt.yticks(fontsize=15)
my= font_manager.FontProperties(size=20)
plt.xlabel("月份",fontproperties = my)
plt.ylabel("产品购买数量指数",fontproperties = my)
plt.title("不同月份最后联系客户购买银行产品意向图",fontdict={"size": 25})
plt.tight_layout()
plt.show()

其余字段大同小异

下面结合结婚状态字段对产品进行分析:

# print(trian["marital"].value_counts())
marital_colum=["married" ,"single" ,"divorced"]
# # 选取某列含有特定“marital”的行
trian1 = trian[trian['marital'].isin([marital_colum[0]])]
trian1.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
print(trian1["marital"].value_counts())
plt.figure(figsize=[10, 10])
sns.barplot(x="default", y="subscribe", hue="education", data=trian1, palette="muted")
x_1=["yes"," no"]
from matplotlib import font_manager
plt.xticks(range(len(x_1)),x_1,fontsize=25)
plt.yticks(fontsize=15)
my= font_manager.FontProperties(size=20)
plt.xlabel("有无违约记录",fontproperties = my)
plt.ylabel("产品购买数量指数",fontproperties = my)
plt.title("已婚",fontdict={"size": 25})
plt.legend(prop = {'size':18})
plt.tight_layout()
plt.show()

# print(trian["marital"].value_counts())
marital_colum=["married" ,"single" ,"divorced"]
# # 选取某列含有特定“marital”的行
trian1 = trian[trian['marital'].isin([marital_colum[1]])]
trian1.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
print(trian1["marital"].value_counts())
plt.figure(figsize=[10, 10])
sns.barplot(x="default", y="subscribe", hue="education", data=trian1, palette="muted")
x_1=["no"," yes"]
from matplotlib import font_manager
plt.xticks(range(len(x_1)),x_1,fontsize=25)
plt.yticks(fontsize=15)
my= font_manager.FontProperties(size=20)
plt.xlabel("有无违约记录",fontproperties = my)
plt.ylabel("产品购买数量指数",fontproperties = my)
plt.title("单身",fontdict={"size": 25})
plt.legend(prop = {'size':18})
plt.tight_layout()
plt.show()

2.2离散数值字段

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
z=0
while(z<=9):trian1 = trian.loc[:,[num_columns[z],'subscribe']]# ax = plt.subplot(3, 3, z + 1)f = pd.melt(trian1, value_vars=num_columns[z], id_vars='subscribe')g = sns.FacetGrid(f,col='variable', hue='subscribe')z = z + 1g = g.map(sns.distplot,"value",bins=20)plt.show()

三、数据建模

from lightgbm.sklearn import LGBMClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score, auc, roc_auc_scoreX = df.drop(columns=['id', 'subscribe'])
Y = df['subscribe']
testA = test.drop(columns='id')
# 划分训练及测试集
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=1)from xgboost import XGBClassifier
import xgboost as xgb
from sklearn.metrics import precision_score, recall_score, f1_score
model = xgb.XGBClassifier()
# 交叉验证
result1 = []
mean_score1 = 0
n_folds = 10
import time
start =time.time()
kf = KFold(n_splits=n_folds, shuffle=True, random_state=2022)
for train_index, test_index in kf.split(X):x_train = X.iloc[train_index]y_train = Y.iloc[train_index]x_test = X.iloc[test_index]y_test = Y.iloc[test_index]model.fit(x_train, y_train)y_pred1 = model.predict_proba((x_test))[:, 1]print('验证集AUC:{}'.format(roc_auc_score(y_test, y_pred1)))mean_score1 += roc_auc_score(y_test, y_pred1) / n_foldsy_pred_final1 = model.predict_proba((testA))[:, 1]y_pred_test1 = y_pred_final1result1.append(y_pred_test1)
end =time.time()
print('程序运行时间为: %s Seconds'%(end-start))

使用验证集AUC模型评估模型:

ROC曲线:

AUC值:

四、评估指标:

4.1:混淆矩阵

4.2: 准确率,回归率,F1

五、测试集准确率

输出文件为:

cat_pre1 = sum(result1) / n_folds
ret1 = pd.DataFrame(cat_pre1, columns=['subscribe'])
ret1['subscribe'] = np.where(ret1['subscribe'] > 0.5, 'yes', 'no').astype('str')
ret1.to_csv('./XGB预测.csv', index=False)

最终提交结果为:

六、模型优化

本文章未调参,如果进行网格优化调参可以让模型进一步变好

【数据分析】基于XGboost(决策树)的银行产品认购预测--小林月相关推荐

  1. 天池案例赛--银行产品认购预测

    大赛是以银行产品认购预测为背景,根据记录的用户信息来推测该银行的用户是否会购买银行的产品. 赛题提供的数据集有3万条(训练集2.25万,测试集0.75万),包括20个特征变量,本文构建了XGBoost ...

  2. 基于 XGBoost 对 Santander 银行用户购买行为进行预测

    Santander Product Recommendation 是我去年做的一个数据挖掘 project,简单来说就是,给了一定量的数据,用合适的算法对这些数据进行建模分析,给出预测,从而挖掘出有价 ...

  3. python信用卡违约预测分析_Python数据分析及可视化实例之银行信用卡违约预测(24)...

    1.项目背景: 银行体系对于信用可违约进行预测,原始数据集如下: 2.分析步骤: (1)数据清洗(Data Cleaning) (2) 探索性可视化(Exploratory Visualization ...

  4. 数据分析实战之决策树(泰坦尼克号乘客生存预测)

    本文利用已给特征属性和存活与否标签的训练集和只包含特征信息测试集数据,通过决策树模型来预测测试集数据乘客的生存情况 数据集来源为https://github.com/cystanford/Titani ...

  5. python信用卡违约_Python数据分析及可视化实例之银行信用卡违约预测(24)

    1.项目背景: 银行体系对于信用可违约进行预测,原始数据集如下: 2.分析步骤: (1)数据清洗(Data Cleaning) (2) 探索性可视化(Exploratory Visualization ...

  6. 评分卡模型(二)基于评分卡模型的用户付费预测

    评分卡模型(二)基于评分卡模型的用户付费预测 小P:小H,这个评分卡是个好东西啊,那我这想要预测付费用户,能用它吗 小H:尽管用- (本想继续薅流失预测的,但想了想这样显得我的业务太单调了,所以就改成 ...

  7. python决策树分类案例_银行产品销售案例与决策树分类算法

    案例数据集来源于UCI网站.案例是基于一家葡萄牙金融机构的电话销售数据.营销目标是确认客户是否愿意认购银行发行的一款定期储蓄产品.该数据集内包含41188条记录和20个特征变量,和1个分类变量.变量包 ...

  8. R语言(把银行已认购定期存款的客户原始数据建立决策树模型,从而预测新一批客户是否会认购定期存款)

    原始数据:bank 输入变量: #银行客户资料: 1-年龄(数字) 2-工作:工作类型(分类:"管理","未知","失业","管理 ...

  9. 【数据竞赛】风控实操案例 | 基于Xgboost与Catboost实现非法集资企业识别

    本文详解2020CCF大赛「企业非法集资风险预测」赛题的获奖参赛作品[风控案例-基于Xgboost与Catboost实现非法集资企业识别],包括数据分析.特征工程.模型训练.模型融合.模型结果展示和方 ...

最新文章

  1. python打包为exe文件_Pyinstaller(python打包为exe文件)
  2. 新的一年,开始新的学习旅途
  3. Postman中几个body请求格式区别及使用说明
  4. 河北计算机科学与技术研究生,2021年河北工业大学计算机科学与技术(081200)硕士研究生招生信息_考研招生计划和招生人数 - 学途吧...
  5. 正则表达式及其在python上的应用
  6. 苹果充电配件MagSafe Duo Charger现已发售
  7. JavaScript按概率随机生成事件
  8. redis(redis概念,运用场景,如何操作基本数据类型)
  9. mysql with roll up_GROUP BY...WITH ROLL UP 分组统计后的再合计
  10. fst和skiplist
  11. windows server 2003 远程拨号服务器
  12. Google at KDD 2020,提出MoSE框架显式建模用户行为序列提升多任务学习效果
  13. 就业和工作?毕业生何去何从?
  14. 日记侠:如何用手机月入万元,只需从这5步开始
  15. 功能强大的截图软件——Snipaste
  16. dnf剑魂buff等级上限_DNF:剑魂职业改版加强,超一线剑魂职业如何技能加点?...
  17. 李刚疯狂JAVA面向对象章节
  18. 苹果ipad怎么刷机_苹果iPhone SE 2(3GB/64GB/全网通)手机密码忘记怎么刷机?
  19. 数据库作业7:SQL练习4 - SELECT(连接查询、嵌套查询)
  20. Vector2.js详解

热门文章

  1. 合金装备幸存服务器维护,游戏新消息:MSI第四日比赛SKT两连胜回勇CLG终结RNG七连胜...
  2. 读《人生的智慧》有感
  3. [暗黑破坏神2]数据库文件修改
  4. activitygroup activity 启动时白屏、黑屏
  5. C语言基础-病人取药
  6. xml+js+html的二级联动
  7. 冒泡排序法和二分法排序
  8. 如何利用新浪博客做关键词霸屏
  9. facenet识别准确率_GitHub - zjj-2015/tf_facenet: facenet人脸检测与识别系统
  10. 前端html与css基础案例