• 比赛简介

比赛网址:https://www.kesci.com/home/competition/5c234c6626ba91002bfdfdd3/content

比赛题目:「二分类算法」提供银行精准营销解决方案

赛题描述:

数据:

训练集:

测试集(没有标签y):

字段说明:

NO 字段名称 数据类型 字段描述
1 ID Int 客户唯一标识
2 age Int 客户年龄
3 job String 客户的职业
4 marital String 婚姻状况
5 education String 受教育水平
6 default String 是否有违约记录
7 balance Int 每年账户的平均余额
8 housing String 是否有住房贷款
9 loan String 是否有个人贷款
10 contact String 与客户联系的沟通方式
11 day Int 最后一次联系的时间(几号)
12 month String 最后一次联系的时间(月份)
13 duration Int 最后一次联系的交流时长
14 campaign Int 在本次活动中,与该客户交流过的次数
15 pdays Int 距离上次活动最后一次联系该客户,过去了多久(999表示没有联系过)
16 previous Int 在本次活动之前,与该客户交流过的次数
17 poutcome String 上一次活动的结果
18 y Int 预测客户是否会订购定期存款业务

测评算法:

AUC

  • 实验步骤

1.读取数据

import numpy as np
import pandas as pd# 训练集
train_data = pd.read_csv('./train_set.csv')
train_data.drop(['ID'], inplace=True, axis=1)# 测试集
test_data = pd.read_csv('./test_set.csv')
test_data.drop(['ID'], inplace=True, axis=1)

inplace=True代表不创建新的对象,直接对原始对象进行修改。

2.预处理

通过sklearn的preprocessing模块进行预处理,将数据中所有数据格式为object的列通过LabelEncoder()函数转化为类别category。

# 预处理
from sklearn import preprocessing
for col in train_data.columns[train_data.dtypes=='object']:LE = preprocessing.LabelEncoder()LE.fit(train_data[col])# 将string类型转换成categorytrain_data[col] = LE.transform(train_data[col])test_data[col] = LE.transform(test_data[col])

3.标准化

通过preprocessing模块的StandardScaler()函数进行数据标准化。

# 标准化
scaler = preprocessing.StandardScaler()
scaler.fit(train_data[['age','balance','duration','campaign','pdays','previous']])train_data[['age','balance','duration','campaign','pdays','previous']] = scaler.transform(train_data[['age','balance','duration','campaign','pdays','previous']])
test_data[['age','balance','duration','campaign','pdays','previous']] = scaler.transform(test_data[['age','balance','duration','campaign','pdays','previous']])

4.切分训练集和验证集

通过model_selection模块的train_test_split()函数切分训练集和验证集,比例为4:1。

# 切分训练集和验证集
from sklearn.model_selection import train_test_split
use_col = list(set(train_data.columns) - set(['y']))
train_X, valid_X, train_y, valid_y = train_test_split(train_data[use_col], train_data['y'], test_size=0.2)

5.使用简单模型

(1)LogisticRegression

# Logistic Regression
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, roc_auc_score
LR = LogisticRegression(solver='liblinear')
LR.fit(train_X, train_y.values.ravel())  # 利用ravel()处理不平衡数据LR_pred = LR.predict(valid_X)
LR_pred_prob = LR.predict_proba(valid_X)[:, 1]
print("Accuracy:{:.4f}".format(accuracy_score(valid_y, LR_pred)))
print("AUC Score(Train data): {:.4f}".format(roc_auc_score(valid_y, LR_pred_prob)))LR_test_pred_prob = LR.predict_proba(test_data)[:, 1]
df_test = pd.read_csv('./test_set.csv')
df_test['pred'] = LR_test_pred_prob.tolist()
df_result = df_test.loc[:, ['ID', 'pred']]
df_result.to_csv('LR.csv', index=False)

在验证集上的准确率为0.8940,AUC得分为0.8726

(2)KNN

# kNN
from sklearn.neighbors import KNeighborsClassifier
KNN = KNeighborsClassifier()
KNN.fit(train_X, train_y.values.ravel())KNN_pred = KNN.predict(valid_X)
KNN_pred_prob = KNN.predict_proba(valid_X)[:, 1]
print("Accuracy:{:.4f}".format(accuracy_score(valid_y, KNN_pred)))
print("AUC Score(Train data): {:.4f}".format(roc_auc_score(valid_y, KNN_pred_prob)))KNN_test_pred_prob = KNN.predict_proba(test_data)[:, 1]
df_test = pd.read_csv('./test_set.csv')
df_test['pred'] = KNN_test_pred_prob.tolist()
df_result = df_test.loc[:, ['ID', 'pred']]
df_result.to_csv('KNN.csv', index=False)

在验证集上的准确率为0.8922,AUC得分为0.8119

(3)决策树

# Decision Tree
from sklearn.tree import DecisionTreeClassifier
DT = DecisionTreeClassifier(min_samples_split=40)
DT.fit(train_X, train_y.values.ravel())DT_pred = DT.predict(valid_X)
DT_pred_prob = DT.predict_proba(valid_X)[:, 1]
print("Accuracy:{:.4f}".format(accuracy_score(valid_y, DT_pred)))
print("AUC Score(Train data): {:.4f}".format(roc_auc_score(valid_y, DT_pred_prob)))DT_test_pred_prob = DT.predict_proba(test_data)[:, 1]
df_test = pd.read_csv('./test_set.csv')
df_test['pred'] = DT_test_pred_prob.tolist()
df_result = df_test.loc[:, ['ID', 'pred']]
df_result.to_csv('DT.csv', index=False)

在验证集上的准确率为0.8924,AUC得分为0.8588

(4)平均得分

# 平均得分
ave_pred = (LR_pred + KNN_pred + DT_pred) / 3
ave_pred_prob = (LR_pred_prob + KNN_pred_prob + DT_pred_prob) / 3
print("AUC Score(Train data): {:.4f}".format(roc_auc_score(valid_y, ave_pred_prob)))ave_test_pred_prob = (LR_test_pred_prob + KNN_test_pred_prob + DT_test_pred_prob) / 3
df_test = pd.read_csv('./test_set.csv')
df_test['pred'] = ave_test_pred_prob.tolist()
df_result = df_test.loc[:, ['ID', 'pred']]
df_result.to_csv('./average.csv', index=False)

AUC得分为0.9123

6.使用GradientBoosting

# Gradient Boosting
from sklearn.ensemble import GradientBoostingClassifier
GB = GradientBoostingClassifier()
GB.fit(train_X, train_y.values.ravel())GB_pred = GB.predict(valid_X)
GB_pred_prob = GB.predict_proba(valid_X)[:, 1]
print("Accuracy:{:.4f}".format(accuracy_score(valid_y, GB_pred)))
print("AUC Score(Train data): {:.4f}".format(roc_auc_score(valid_y, GB_pred_prob)))

在验证集上的准确率为0.9038,AUC得分为0.9221,明显比简单模型效果更好。

7.网格搜索最优参数

搜索最优参数时,使用整个训练集:

full_train_X = train_data.iloc[:, train_data.columns!='y']
full_train_y = train_data.iloc[:, train_data.columns=='y']

首先同时搜索学习率learning_rate和迭代次数n_estimators:

# 网格搜索最优参数
from sklearn.model_selection import GridSearchCV
# 搜索学习率learning_rate和迭代次数n_estimators
param_search1 = {'learning_rate': [0.01, 0.1, 1.],'n_estimators': list(range(10, 100, 10))+list(range(100,1001,100))}
grid1 = GridSearchCV(estimator=GradientBoostingClassifier(),param_grid=param_search1,scoring='roc_auc',iid=False,cv=3)
grid1.fit(full_train_X, full_train_y.values.ravel())
grid1.best_params_,grid1.best_score_

得到最优学习率和最优迭代次数,以及对应的AUC得分为:

({'learning_rate': 0.1, 'n_estimators': 500}, 0.9286749844960692)

然后同时搜索最大深度max_depth和最小样本数min_samples_split和叶子节点最小样本数min_samples_leaf,使用第一步得到的最优学习率和最优迭代次数:

# 搜索最大深度max_depth和最小样本数min_samples_split和叶子节点最小样本数min_samples_leaf
param_search2 = {'max_depth': list(range(3, 14, 2)),'min_samples_split': list(range(100, 1001, 200)),'min_samples_leaf': list(range(50, 101, 10))}
grid2 = GridSearchCV(estimator=GradientBoostingClassifier(learning_rate=grid1.best_params_['learning_rate'],n_estimators=grid1.best_params_['n_estimators']),param_grid=param_search2,scoring='roc_auc',iid=False,cv=3)
grid2.fit(full_train_X, full_train_y.values.ravel())
grid2.best_params_,grid2.best_score_

得到最优的最大深度,叶子节点最小样本数,最小样本数和对应的AUC得分为:

({'max_depth': 5, 'min_samples_leaf': 90, 'min_samples_split': 300},0.9302954874270872)

8.生成预测

使用网格搜索得到的五个参数,对整个训练集进行拟合之后,对测试集数据进行预测,得到预测结果的csv文件。

# 生成预测
from sklearn.ensemble import GradientBoostingClassifier
GB = GradientBoostingClassifier(learning_rate=0.1,n_estimators=500,max_depth=5,min_samples_leaf=90,min_samples_split=300)
GB.fit(full_train_X, full_train_y.values.ravel())
GB_pred = GB.predict(test_data)
GB_pred_prob = GB.predict_proba(valid_X)[:, 1]GB_test_pred_prob = GB.predict_proba(test_data)[:, 1]
df_test = pd.read_csv('./test_set.csv')
df_test['pred'] = GB_test_pred_prob.tolist()
df_result = df_test.loc[:, ['ID', 'pred']]
df_result.to_csv('./GB.csv', index=False)

9.查看得分

离前十0.9402差了一个百分点。

深度之眼-科赛网二分类大赛入门之路相关推荐

  1. [TensorFlow深度学习入门]实战九·用CNN做科赛网TibetanMNIST藏文手写数字数据集准确率98%+

    [TensorFlow深度学习入门]实战九·用CNN做科赛网TibetanMNIST藏文手写数字数据集准确率98.8%+ 我们在博文,使用CNN做Kaggle比赛手写数字识别准确率99%+,在此基础之 ...

  2. 全国大学生交通科技大赛交科赛交通运输科技大赛智能交通创新技术应用大赛国家三等奖论文文字作品资料经验分享

    点开视频后,再点视频下方<展开全文>直接看国奖文字等超全资料截图哦.(小白必看)全国大学生交通科技大赛交科赛交通运输科技大赛智能交通创新技术应用大赛国家三等奖论文文字作品资料经验分享 这个 ...

  3. 最简单深度学习Python实现(二分类问题)

    二分类问题指的是所有数据的标签就只有两种,正面或者负面. 一,准备数据 我们使用的数据是内置于Keras的IMDB数据集.它包含50000条两极分化的电影评论,正面评论和负面评论各占一半.其中2500 ...

  4. 深度学习初级课程 6.二分类

    深度学习初级课程 1.单一神经元 2.深度神经网络 3.随机梯度下降法 4.过拟合和欠拟合 5.剪枝.批量标准化 6.二分类问题 应用.用TPU探测希格斯玻色子 正文 介绍 到目前为止,在本课程中,我 ...

  5. Keras深度学习(2)-二分类问题之电影评论分类

    二分类问题可能是应用最广泛的机器学习问题.在这个例子中,你将学习根据电影评论的文字内容将其划分为正面或负面. 本节使用 IMDB 数据集,它包含来自互联网电影数据库(IMDB)的 50 000 条严重 ...

  6. 使用机器学习和深度学习对PE进行二分类和多分类

    文章目录 1. 前言 2. 安装库 2.1 安装lief 2.2 安装ember 3. 数据预处理 4. 训练模型 5. 预测新数据 5.1 二分类预测 5.2 多分类预测 6. 代码下载 1. 前言 ...

  7. 科赛网 魔镜杯“风控算法比赛”赛后总结

    1.问题描述 从平均400个数据维度来评估当前用户的信用状态,给每个借款人打出当前状态的信用分.在此基础上,再结合新发标的信息,打出对于每个标的6个月内逾期率的预测,为投资人提供了关键的决策依据,促进 ...

  8. 深度学习 神经网络(5)逻辑回归二分类-Pytorch实现乳腺癌预测

    深度学习 神经网络 逻辑回归二分类-乳腺癌预测 一.前言 二.代码实现 2.1 引入依赖库 2.2 加载并查看数据集 2.3 数据处理 2.4 数据分割 2.5 迭代训练 2.6 数据验证 一.前言 ...

  9. pytorch 猫狗二分类 resnet

    深度学习(猫狗二分类) 题目要求 数据获取与预处理 网络模型 模型原理 Resnet背景 Resnet原理 代码实现 模型构建 训练过程 批验证过程 单一验证APP 运行结果 训练结果 批验证结果 A ...

  10. 公告 | 科赛Kesci宣布正式更名为和鲸HeyWhale,致力于打造中国最好的数据科学协同创新平台

    2019年1月1日,数据科学平台科赛网(Kesci.com)正式更名为"和鲸科技". 和鲸旗下拥有聚集了超过50,000+数据智能人才的专业第三方数据科学社区kesci(科赛网). ...

最新文章

  1. python增删改查人名管理_python3字典列表的增删改查(名片管理系统函数版)
  2. Linux下安装配置virtualenv与virtualenvwrapper
  3. [codevs 1789] 最大获利(2006年NOI全国竞赛)
  4. SasSHRM中基于shiro的认证授权:环境搭建
  5. ubuntu安装python编译器_Ubuntu中安装VIM编辑器
  6. linux中启动不了服务,Linux系统xinetd服务启动不了
  7. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十九)ES6.2.2 安装Ik中文分词器
  8. electron sqlite3_Electron+React+Antd工程搭建
  9. codeforces 812B. Sagheer, the Hausmeister
  10. 快速开发微信小程序直播--微信直播--小程序直播开发
  11. 3D打印软件——Repetier-Host 简单的使用总结
  12. 管理信息系统案例分析_BIM案例分析—地下空间工程(二)
  13. python随机选人程序_python: 随机选择
  14. 软件测试工程师需要具备哪些能力?
  15. Simulink建模:Simulink PWM死区时间插入仿真
  16. 电子技术基础(三)__第2章放大电路原理__晶体三极管
  17. int、tinyint、bigint的区别/MySQL中
  18. Linux ARM 静态网络配置
  19. 他山之石 | 腾讯音乐知识图谱搜索实践
  20. Python细枝末节个人知识记录

热门文章

  1. Python爬上不得姐 并将段子写入数据库
  2. 对象间相互调用时互相控制的几种方法
  3. 2013 多校联合(1)个人总结
  4. .net 常识 impersonate user 模拟用户
  5. .NET简谈互操作(三:基础知识之DllImport特性)
  6. Python因数分解
  7. 《剑指offer》面试题23——从上往下打印二叉树
  8. sns.barplot/sns.countplot/sns.boxplot参数设置
  9. 使用maven给jar包生成对应的pom文件
  10. PHP推流地址获取图片