本文是对天池教学赛,银行客户认购产品预测的记录,教学赛网址如下:

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

1. 读取数据

import pandas as pd# 加载数据
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')

2. 数据处理

2.1 合并数据

# 训练集和测试集合并, 以便于处理特征的数据
df = pd.concat([train, test], axis=0) #将训练数据和测试数据在行的方向拼接
df

得到的结果:

id   age job marital education   default housing loan    contact month   ... campaign    pdays   previous    poutcome    emp_var_rate    cons_price_index    cons_conf_index lending_rate3m  nr_employed subscribe
0   1   51  admin.  divorced    professional.course no  yes yes cellular    aug ... 1   112 2   failure 1.4 90.81   -35.53  0.69    5219.74 no
1   2   50  services    married high.school unknown yes no  cellular    may ... 1   412 2   nonexistent -1.8    96.33   -40.58  4.05    4974.79 yes
2   3   48  blue-collar divorced    basic.9y    no  no  no  cellular    apr ... 0   1027    1   failure -1.8    96.33   -44.74  1.50    5022.61 no
3   4   26  entrepreneur    single  high.school yes yes yes cellular    aug ... 26  998 0   nonexistent 1.4 97.08   -35.55  5.11    5222.87 yes
4   5   45  admin.  single  university.degree   no  no  no  cellular    nov ... 1   240 4   success -3.4    89.82   -33.83  1.17    4884.70 no
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
7495    29996   49  admin.  unknown university.degree   unknown yes yes telephone   apr ... 50  302 1   failure -1.8    95.77   -40.50  3.86    5058.64 NaN
7496    29997   34  blue-collar married basic.4y    no  no  no  cellular    jul ... 8   440 3   failure 1.4 90.59   -47.29  1.77    5156.70 NaN
7497    29998   50  retired single  basic.4y    no  yes no  cellular    jun ... 3   997 0   nonexistent -2.9    97.42   -39.69  1.29    5116.80 NaN
7498    29999   31  technician  married professional.course no  no  no  cellular    aug ... 3   1028    0   nonexistent 1.4 96.90   -37.68  5.18    5144.45 NaN
7499    30000   46  admin.  divorced    university.degree   no  yes no  cellular    aug ... 2   387 3   success 1.4 97.49   -31.54  3.79    5082.25 NaN
30000 rows × 22 columns

可见数据既有数字也有文字,需要将文字转换为数字

2.2 将非数字的特征转换为数字

# 首先选出所有的特征为object(非数字)的特征
cat_columns = df.select_dtypes(include='object').columns  #选择非数字的列,对其进行处理
df[cat_columns]
# 对非数字特征进行编码
from sklearn.preprocessing import LabelEncoderjob_le = LabelEncoder()
df['job'] = job_le.fit_transform(df['job'])
df['marital'] = df['marital'].map({'unknown':0, 'single':1, 'married':2, 'divorced':3})
df['education'] = df['education'].map({'unknown':0, 'basic.4y':1, 'basic.6y':2, 'basic.9y':3, 'high.school':4, 'university.degree':5, 'professional.course':6, 'illiterate':7})
df['housing'] = df['housing'].map({'unknown': 0, 'no': 1, 'yes': 2})
df['loan'] = df['loan'].map({'unknown': 0, 'no': 1, 'yes': 2})
df['contact'] = df['contact'].map({'cellular': 0, 'telephone': 1})
df['day_of_week'] = df['day_of_week'].map({'mon': 0, 'tue': 1, 'wed': 2, 'thu': 3, 'fri': 4})
df['poutcome'] = df['poutcome'].map({'nonexistent': 0, 'failure': 1, 'success': 2})
df['default'] = df['default'].map({'unknown': 0, 'no': 1, 'yes': 2})
df['month'] = df['month'].map({'mar': 3, 'apr': 4, 'may': 5, 'jun': 6, 'jul': 7, 'aug': 8, \'sep': 9, 'oct': 10, 'nov': 11, 'dec': 12})
df['subscribe'] = df['subscribe'].map({'no': 0, 'yes': 1})

2.3 切分数据

# 将数据集重新划分为训练集和测试集   通过subscribe是不是空来判断
train = df[df['subscribe'].notnull()]
test = df[df['subscribe'].isnull()]# 查看训练集中,标签为0和1的比例,可以看出0和1不均衡,0是1的6.6倍
train['subscribe'].value_counts()

得到

0.0    19548
1.0     2952
Name: subscribe, dtype: int64

2.4 分析数据

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warningswarnings.filterwarnings('ignore')
%matplotlib inline
num_features = [x for x in train.columns if x not in cat_columns and x!='id']fig = plt.figure(figsize=(80,60))for i in range(len(num_features)):plt.subplot(7,2,i+1)sns.boxplot(train[num_features[i]])plt.ylabel(num_features[i], fontsize=36)
plt.show()

存在离群点,对离群点进行处理

2.5 处理离群点

for colum in num_features:temp = train[colum]q1 = temp.quantile(0.25)q2 = temp.quantile(0.75)delta = (q2-q1) * 10train[colum] = np.clip(temp, q1-delta, q2+delta)
## 将超过10倍的值,进行处理

2.6 其他处理

进行数据均衡和特征选择,但是做完处理后都导致了分类效果变差,此处省略。但是把原码贴出来,供参考。

'''# 采用SMOTE进行过采样,虽然训练的效果好了,但是对于最终的分类效果反而降低了,此处先不采用过采样
from imblearn.over_sampling import SMOTE
from imblearn.over_sampling import ADASYN#smo = SMOTE(random_state=0, k_neighbors=10)
adasyn = ADASYN()
X_smo, y_smo = adasyn.fit_resample(train.iloc[:,:-1], train.iloc[:,-1])
train_smo = pd.concat([X_smo, y_smo], axis=1)train_smo['subscribe'].value_counts()'''
'''# 特征选择方法采用SelectFromModel,Model选择树模型
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.feature_selection import SelectFromModel# 提取出训练数据和标签
train_X = train.iloc[:,:-1]
train_y = train.iloc[:,-1]# clf_ect是模型名,FeaSel为特征选择模型
clf_etc = ExtraTreesClassifier(n_estimators=50)
clf_etc = clf_etc.fit(train_X, train_y)
FeaSel = SelectFromModel(clf_etc, prefit=True)
train_sel = FeaSel.transform(train_X)
test_sel = FeaSel.transform(test.iloc[:,:-1])# 提取特征名,并把特征名写回原始数据
train_new = pd.DataFrame(train_sel)
feature_idx = FeaSel.get_support() #提取选择的列名
train_new.columns = train_X.columns[feature_idx]  #将列名写回选择后的数据train_new = pd.concat([train_new, train_y],axis=1)
test_new = pd.DataFrame(test_sel)
test_new.columns = train_X.columns[feature_idx]'''

此部门内容可能存在变量命名方面的问题。

2.7 数据保存

train_new = train
test_new = test# 将处理完的数据写回到train_new和test_new进行保存
train_new.to_csv('train_new.csv', index=False)
test_new.to_csv('test_new.csv', index=False)

3. 模型训练

3.1 导入包和数据

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import AdaBoostClassifier
from xgboost import XGBRFClassifier
from lightgbm import LGBMClassifier
from sklearn.model_selection import cross_val_score
import timeclf_lr = LogisticRegression(random_state=0, solver='lbfgs', multi_class='multinomial')
clf_dt = DecisionTreeClassifier()
clf_rf = RandomForestClassifier()
clf_gb = GradientBoostingClassifier()
clf_adab = AdaBoostClassifier()
clf_xgbrf = XGBRFClassifier()
clf_lgb = LGBMClassifier()from sklearn.model_selection import train_test_split
train_new = pd.read_csv('train_new.csv')
test_new = pd.read_csv('test_new.csv')
feature_columns = [col for col in train_new.columns if col not in ['subscribe']]
train_data = train_new[feature_columns]
target_data = train_new['subscribe']

3.2 模型调参

from lightgbm import LGBMClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(train_data, target_data, test_size=0.2,shuffle=True, random_state=2023)
#X_test, X_valid, y_test, y_valid = train_test_split(X_test, y_test, test_size=0.5,shuffle=True,random_state=2023)n_estimators = [300]
learning_rate = [0.02]#中0.2最优
subsample = [0.6]
colsample_bytree = [0.7]   ##在[0.5, 0.6, 0.7]中0.6最优
max_depth = [9, 11, 13] ##在[7, 9, 11, 13]中11最优
is_unbalance = [False]
early_stopping_rounds = [300]
num_boost_round = [5000]
metric = ['binary_logloss']
feature_fraction = [0.6, 0.75, 0.9]
bagging_fraction = [0.6, 0.75, 0.9]
bagging_freq = [2, 4, 5, 8]
lambda_l1 = [0, 0.1, 0.4, 0.5]
lambda_l2 =  [0, 10, 15, 35]
cat_smooth = [1, 10, 15, 20]param = {'n_estimators':n_estimators,'learning_rate':learning_rate,'subsample':subsample,'colsample_bytree':colsample_bytree,'max_depth':max_depth,'is_unbalance':is_unbalance,'early_stopping_rounds':early_stopping_rounds,'num_boost_round':num_boost_round,'metric':metric,'feature_fraction':feature_fraction,'bagging_fraction':bagging_fraction,'lambda_l1':lambda_l1,'lambda_l2':lambda_l2,'cat_smooth':cat_smooth}model = LGBMClassifier()clf = GridSearchCV(model, param, cv=3, scoring='accuracy', verbose=1, n_jobs=-1)
clf.fit(X_train, y_train, eval_set=[(X_train, y_train),(X_test, y_test)])print(clf.best_params_, clf.best_score_)

里面只有1个值的,是已经通过GridSearchCV找到的最优优值了,程序显示的是最后的6个参数的寻优,都放到一起训练时间太长了,所以选择分开寻找。

得到的结果:

Early stopping, best iteration is:
[287]   training's binary_logloss: 0.22302 valid_1's binary_logloss: 0.253303
{'bagging_fraction': 0.6, 'cat_smooth': 1, 'colsample_bytree': 0.7, 'early_stopping_rounds': 300, 'feature_fraction': 0.75, 'is_unbalance': False, 'lambda_l1': 0.4, 'lambda_l2': 10, 'learning_rate': 0.02, 'max_depth': 11, 'metric': 'binary_logloss', 'n_estimators': 300, 'num_boost_round': 5000, 'subsample': 0.6} 0.8853333333333334

3.3 预测结果

y_true, y_pred = y_test, clf.predict(X_test)
accuracy = accuracy_score(y_true,y_pred)
print(classification_report(y_true, y_pred))
print('Accuracy',accuracy)

结果

precision    recall  f1-score   support0.0       0.91      0.97      0.94      39331.0       0.60      0.32      0.42       567accuracy                           0.89      4500macro avg       0.75      0.64      0.68      4500
weighted avg       0.87      0.89      0.87      4500Accuracy 0.8875555555555555

查看混淆矩阵

from sklearn import metrics
confusion_matrix_result = metrics.confusion_matrix(y_true, y_pred)
plt.figure(figsize=(8,6))
sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
plt.xlabel('predict')
plt.ylabel('true')
plt.show()

4. 输出结果

test_x = test[feature_columns]
pred_test = clf.predict(test_x)
result = pd.read_csv('./submission.csv')
subscribe_map ={1: 'yes', 0: 'no'}
result['subscribe'] = [subscribe_map[x] for x in pred_test]
result.to_csv('./baseline_lgb1.csv', index=False)
result['subscribe'].value_counts()

结果:

no     6987
yes     513
Name: subscribe, dtype: int64

5. 提交结果

6. 总结

本人的方法只获得了0.9676的结果,希望您能在本人的程序基础上进行改进,以得到更佳的效果。如果有了更好的方法,欢迎在留言区告诉我,相互讨论。

改进的思路:

1. 数据处理方面,本人在进行数据均衡时,训练的效果很好,但是最终的效果较差,应该是数据过拟合了;另外在数据的离群点处理方面也可以做更进一步的考虑;

2.方法的改进,本人对比了lr, dt, rf, gb, adab, xgbrf, lgb最终lgb的效果最好,所以最终选择lgb进行调参,可以考虑采用多种方法的组合,进行训练;

3.在lgb的基础上进行调参,这个是最没有科技含量的。不过花时间应该会得到比我的结果更好的效果。

【教学赛】金融数据分析赛题1:银行客户认购产品预测(0.9676)相关推荐

  1. 阿里天池--金融数据分析赛题1:银行客户认购产品预测

    赛题简介 银行客户认购产品预测 赛题以银行产品认购预测为背景,想让你来预测下客户是否会购买银行的产品.在和客户沟通的过程中,我们记录了和客户联系的次数,上一次联系的时长,上一次联系的时间间隔,同时在银 ...

  2. 天池项目金融数据分析赛题1:银行客户认购产品预测

    赛题简介 本次教学赛是陈博士发起的数据分析系列赛事第1场 -- 银行客户认购产品预测 赛题以银行产品认购预测为背景,想让你来预测下客户是否会购买银行的产品.在和客户沟通的过程中,我们记录了和客户联系的 ...

  3. 金融数据分析赛题1:银行客户认购产品预测学习赛心得

    目录 一.auto框架介绍 二.赛题背景: 三.赛题数据: 四.项目分析 (一).利用autogluon对训练集进行自动分析 1.首先导入所需要的外部库 2.读取数据,并进行标注 3.输入到Tabul ...

  4. 天池教学赛:银行客户认购产品预测

    目录 前言 一.赛题背景 二.数据探索 1.读取数据 2.查看数据统计量 duration分箱展示 3.查看数据分布 4.数据相关图 5.其它变量可视化展示 三.数据建模 四.特征输出 五.最终成绩 ...

  5. 数据挖掘:银行客户认购产品预测

    数据来源阿里天池学习赛:[教学赛]金融数据分析赛题1:银行客户认购产品预测 直接放代码 import pandas as pd from catboost import CatBoostClassif ...

  6. 记录一下MLP模型的应用_银行客户认购产品预测

    题目背景 预测下客户是否会购买银行的产品,给出了训练集和测试集,具体如下: 天池[教学赛]金融数据分析赛题1:银行客户认购产品预测 1.首先进行数据预处理 因为题目中的特征变量有str格式和float ...

  7. 银行客户认购产品预测

    银行客户认购产品预测 加载数据 合并数据 获取非数字的列 特征编码 去掉相关性不大的列与且分数据集 模型训练 保存为csv文件 其他模型 逻辑回归 KNN 决策树 随机森林 加载数据 import p ...

  8. 阿里天池金融数据分析赛题2:保险反欺诈预测baseline

    金融数据分析赛题2:保险反欺诈预测baseline 好久没写baseline了,最近逛比赛的时候突然看到阿里新人赛又出新题目了,索性写个baseline给初学者,昨天晚上把比赛数据下载了,然后随便跑了 ...

  9. 2022年泰迪杯数据分析_B题:银行客户忠诚度分析赛题数据_任务五

    银行客户长期忠诚度预测建模,此处忠诚度的指标选取为客户的流失情况,该指标分为两类,长期客户忠诚用1表示,不忠诚则用0表示. 对此预测建模中,使用到机器学习分类中的随机森林分类. import pand ...

最新文章

  1. 100万奖金池,这不仅仅是场比赛
  2. python调用dll例子
  3. 云服务器 文件 传输,云服务器文件 传输
  4. 数组模拟队列(代码实现)
  5. Java黑皮书课后题第7章:7.8(求数组的平均值)使用下面的方法头编写两个重载的方法,返回数组的平均数。编写一个测试程序,提示用户输入10个double型值,然后调用这个方法显示平均值
  6. 异常通知(After Throwing Advice)
  7. Android开发笔记1之HelloWorld
  8. 20190826:(leetcode习题)反转链表
  9. python中 将字符串和字典的相互转换
  10. linux 中kafka发送数据,C++ 向kafka中发送数据
  11. springMVC框架下JQuery传递并解析Json数据
  12. 传感器实验——SHT20温湿度传感器
  13. 仿iGoogle自定义首页模块拖拽效果
  14. 2020牛客寒假算法基础集训营3——J.牛牛的宝可梦Go【最短路 DP(01背包) 复杂度优化】(附优化分析)
  15. Win10搭建我的世界Minecraft服务器「内网穿透远程联机」
  16. 吸血鬼数字java_吸血鬼数字
  17. 【Android】RecycleView简单仿漫画APP图片相关样式
  18. C# 浅拷贝与深拷贝
  19. Spring In Action 03 ---面向切面的Spring
  20. 自考本科计算机有哪些专业可以选,自考本科有什么专业可以选择

热门文章

  1. python毕业设计项目源码选题(12)疫苗预约系统毕业设计毕设作品开题报告开题答辩PPT
  2. selenium如何定位选择题中value,选择C
  3. soundtouch android,Android studio NDK + CMake 编译SoundTouch实现wav格式音频的变速、变调功能...
  4. I LOVE YOU
  5. 陈一舟:国内SNS社区的战斗已经结束
  6. 【NXP DN 系列】修改并编译生效 RCW 配置 For ND LS1043ARDB LSDK1906
  7. 硬盘检测软件MHDD的操作方法
  8. python 继承并定制父类的初始化方法,python 继承类的初始化用法
  9. 金算盘干了一年多之后
  10. 机动车辆保费计算器V2.1版(C款)