Kaggle:Elo顾客忠诚度预测问题_紫砂痕的博客-程序员秘密

技术标签: 机器学习  python 基础  Kaggle  

1. 问题分析

Elo是巴西最大的支付品牌之一,与商家建立了合作伙伴关系,以便为持卡人提供促销或折扣。但这些促销活动是否适用于消费者或商家?客户是否喜欢他们的体验?在此次竞赛中,将通过揭示客户忠诚度中的信号,开发算法来识别并为消费者提供最相关的促销或折扣机会。

1.1 提供的数据文件:

我们先来看一下提供的数据文件:

import os
print(os.listdir("../input"))

在这里插入图片描述
data_Dictionary.xlsx :各文件内各列数据的描述文件,有助于我们更好的理解数据信息。
historical_transactions: 每个card_id的消费历史,最多3个月的历史交易,共有2千9百多万条。
new_merchant_transactions:测评期的消费数据,每个card_id在新商店的消费,近2百万条
merchants:商户的信息数据
train:训练集
test: 验证集
sample_submission:提交数据样本

1.2 具体任务:

根据历史数据,侧重特征工程处理,预测每个card_id的忠诚度分数

2. 数据预处理与分析

2.1 train 和 test文件

train_data=pd.read_csv('../input/train.csv', sep=',',header=0)
test_data=pd.read_csv('../input/test.csv', sep=',',header=0)
train_data.info()
test_data.info()


从上图可以看出 train set 含有201917个数据样本,test set 含有123623个数据样本。test set 与train set 的区别在于没有target这也此次任务需要预测。
针对每个card_id 有 first_active_month,feature_1, feature_2, feature_3 这类特征,target是每个card_id 的忠诚度分数。
在这里插入图片描述

2.2 historical_transactions 和 new_transactions文件

先将historical_transactions 和 new_transactions文件 导入:

history_data=pd.read_csv('../input/historical_transactions.csv', sep=',',header=0)
new_data = pd.read_csv('../input/new_merchant_transactions.csv',sep=',',header=0)
history_data.info()
new_data.info()

在这里插入图片描述
从上图可以看出historical_transactions 和 new_transactions文件中各有14维信息,与train和test集的关联点在card_id。
在这里插入图片描述

3. 特征工程构建

3.1 train 和test集

3.1.1 Convert time as features

针对train 和test集上的 first_active_month 这一信息,将时间特征提取出来:‘year’,‘month’,‘elapsed_time’,‘quarter’,‘weekofyear’,‘dayofyear’,‘weekend’。

# In[] 先将train 中target这一列提出来
train_target=np.array(train_data['target'])

# In[]
# Convert time as features
for data in [train_data,test_data]:
    data.fillna(0)
    data['first_active_month'] = pd.to_datetime(data['first_active_month'])
    data['year'] = data['first_active_month'].dt.year
    data['month'] = data['first_active_month'].dt.month
    #first_active_month_max=data['first_active_month'].dt.date.max()
    data['elapsed_time'] = (datetime.date(2018, 2, 1) - data['first_active_month'].dt.date).dt.days
    data['dayofweek'] = data['first_active_month'].dt.dayofweek
    data['weekofyear'] = data['first_active_month'].dt.weekofyear
    data['dayofyear'] = data['first_active_month'].dt.dayofyear
    data['quarter'] = data['first_active_month'].dt.quarter
    #data['is_month_start'] = data['first_active_month'].dt.is_month_start   
    data['weekend'] = (data.first_active_month.dt.weekday >=5).astype(int)
train_data.info()
test_data.info()

在这里插入图片描述

3.2 historical_transactions 和 new_transactions文件

3.2.1 处理缺省值,并one-hot表达

针对 historical_transactions 和 new_transactions文件,

  1. 处理’category_2’,'category_3’中的缺省值,并将其以one-hot形式表达,
    ** data = pd.get_dummies(data, columns=[‘cat2’, ‘cat3’]) **

  2. 将’authorized_flag’, 'category_1’中的特征字符Y/N表示,转为0/1表示:
    ** data[sub_cate] = data[sub_cate].apply(lambda x: 1 if x == ‘Y’ else 0)**

def category_convert(data):
   #data.fillna(0)
    data['category_2']=data['category_2'].fillna(data['category_2'].mode()[0])
    data['category_3']=data['category_3'].fillna(data['category_3'].mode()[0])
    data['merchant_id']=data['merchant_id'].fillna("None")
    print("There are ",data.isnull().sum().sum(), 'missing data remains in df.')   
    data['cat2'] = data['category_2']
    data['cat3'] = data['category_3']
    data = pd.get_dummies(data, columns=['cat2', 'cat3'])   #one hot 的形式
    for sub_cate in ['authorized_flag', 'category_1']:
        data[sub_cate] = data[sub_cate].apply(lambda x: 1 if x == 'Y' else 0)
    return data

history_data=category_convert(history_data)
new_data=category_convert(new_data)
# In[]
history_data.info()
new_data.info()

在这里插入图片描述
从上图可以看出,数据多了8 columns,‘category_2’ 的值有五类(1,2,3,4,5),将其one-hot 后 产生了5 columns。‘category_3’ 的值有三类(A,B,C),将其one-hot 后 产生了3 columns。此外, 将’authorized_flag’, 'category_1’中的特征字符Y/N表示,转为0/1表示,数据类型由object 变成了int64。

3.2.2 从’purchase_date’提取时间信息, 以及

# Code from: Chau Ngoc Huynh - "My first kernel (3.699)" & Mitsuru Fujiwara - "Simple LightGBM without blending
def Feature_Engineering(data):
    # devide time
    data['purchase_date'] = pd.to_datetime(data['purchase_date'])
    data['month_diff'] = ((datetime.datetime.today() - data['purchase_date']).dt.days)//30  
    data['month_diff'] += data['month_lag']
    data['purchase_year'] = data['purchase_date'].dt.year
    data['purchase_month'] = data['purchase_date'].dt.month
    data['weekofyear'] = data['purchase_date'].dt.weekofyear
    data['dayofyear'] = data['purchase_date'].dt.dayofyear
    data['dayofweek'] = data['purchase_date'].dt.dayofweek
    data['weekend'] = (data.purchase_date.dt.weekday >=5).astype(int)
    #data['hour'] = data['purchase_date'].dt.hour
    #data['day']=data['purchase_date'].dt.day   
    data['quarter'] = data['purchase_date'].dt.quarter
    data['purchase_amount_new'] = np.round(data['purchase_amount'] / 0.00150265118 + 497.06,8)  
    #data['duration'] = data['purchase_amount']*data['month_diff']
    #data['amount_month_ratio'] = data['purchase_amount']/data['month_diff']
    #data['price']=data['purchase_amount']/data['installments']   
    data['Christmas_Day_2017']=(pd.to_datetime('2017-12-25')-data['purchase_date']).dt.days.apply(lambda x: x if x > 0 and x < 100 else 0)
    #Mothers Day: May 14 2017
    data['Mothers_Day_2017']=(pd.to_datetime('2017-06-04')-data['purchase_date']).dt.days.apply(lambda x: x if x > 0 and x < 100 else 0)
    data['fathers_day_2017']=(pd.to_datetime('2017-08-13')-data['purchase_date']).dt.days.apply(lambda x: x if x > 0 and x < 100 else 0)
    data['Children_day_2017']=(pd.to_datetime('2017-10-12')-data['purchase_date']).dt.days.apply(lambda x: x if x > 0 and x < 100 else 0)
    data['Valentine_Day_2017']=(pd.to_datetime('2017-06-12')-data['purchase_date']).dt.days.apply(lambda x: x if x > 0 and x < 100 else 0)
    data['Black_Friday_2017']=(pd.to_datetime('2017-11-24') - data['purchase_date']).dt.days.apply(lambda x: x if x > 0 and x < 100 else 0)
    data['Mothers_Day_2018']=(pd.to_datetime('2018-05-13')-data['purchase_date']).dt.days.apply(lambda x: x if x > 0 and x < 100 else 0)
    return data

history_data = Feature_Engineering(history_data)
new_data = Feature_Engineering(new_data)
history_data.info()
new_data.info()

4. 训练模型

参考链接:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36047533/article/details/88323925

智能推荐

Unsupervised Abstractive Meeting Summarization...论文笔记_codebrid的博客-程序员秘密

1. 论文信息Unsupervised Abstractive Meeting Summarization with Multi-Sentence Compression and Budgeted Submodular MaximizationACL 20182. 相关工作(本文使用到了以下工作内容)•Multi-Sentence CompressionGraph (MSCG) ...

AndroidStudio 3.6(4.xx)之后如何配置SVN/git的忽略文件_android stuido 3.6如何配置忽略文件_ltym2014的博客-程序员秘密

Android项目提交代码时一般忽略的文件:1、.idea文件夹2、所有的build文件夹3、所有的.iml文件4、local.properties文件。版本3.6之前版本3.6之后发现上图的Ignored Files找不到了,那么如何配置呢?请看下图这种方式添加忽略文件不需要考虑关联SVN或者Git前还是后,都可以立即生效...

mysql开发认证 cmdev_学无止境:了解主流的DBA认证考试_weixin_39610956的博客-程序员秘密

目前在数据库领域,比较主流的认证考试包括了Oracle的OCA、OCP和OCM;微软的MCTS和MCITP;另外改用开源的MYSQL认证CMA、CMDEV和CMDBA。DBA在工作中用到的数据库大都来自Oracle、微软、Sybase等几个主流厂商,因此认证考试也都是围绕这几家厂商的技术和产品,这主要取决你目前工作中所使用的数据库平台。那么本文我们就将来看下主流的数据库认证。1.OracleOra...

C# DataTable去重,根据列名去重保留其他列_weixin_30595035的博客-程序员秘密

//去掉重复行DataView dv = table.DefaultView;table = dv.ToTable(true, new string[] { "name", "code" });此时table 就只有name、code无重复的两行了,如果还需要id值则table = dv.ToTable(true, new string[] { "id","name",...

近10年好的计算机图书_wyyy520的博客-程序员秘密

美国著名图书频道Book Pool集结最权威的62位作者评选出了最近10年计算机专业图书中的50强光这62位作者阵营就非常强大,我们熟悉的就有:Francesco Balena(Microsoft.NET框架程序设计,Visual Basic.NET语言描述作者) Bert Bates(Head First Design Patterns作者) Joshua Bloch(Effective Jav

解决Tomcat8“At least one JAR was scanned for TLDs yet contained no TLDs”问题_旖旎520的博客-程序员秘密

【Tomcat版本】7.0.42【问题描述】Tomcat启动后,访问动态页面后提示“At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs we

随便推点

国企程序员是一种怎样的体验?_mingongge的博客-程序员秘密

点击上方“民工哥技术之路”选择“星标”每天10点为你分享不一样的干货读者福利!多达 2048G 各种资源免费赠送作者:peiyu1988来源:https://www.c...

Android的JNI【实战教程】️--Java调用C代码_先知丨先觉的博客-程序员秘密

Java调用C代码执行加法操作java代码: /** * 通过JNI简单进行整形加法操作 * @param a * @param b * @return */ public static native int addInt(int a, int b);.h代码:/* * Class: com_libin_factory_ndk

linux无法安装应用_weixin_30830327的博客-程序员秘密

需安装flex 和bison一般需要更新软件源 root权限 下  apt-get update  apt-get upgrade如果出现以下问题,先查看网络是否畅通;ping 192.168.0.1 如果能ping通,再ping www.baidu.com;如果ping不通,可以查看DNS配置添加如下图所示,保存退出;service network rest...

1.4 搭建springboot后端问题记录_LetsStudy的博客-程序员秘密

1、mysql版本报错修改mysql版本为8.0.12修改时区set global time_zone='+8:00';//修改全局时区flush privileges;//立即生效2、tomcat依赖问题将这两个依赖给注释掉,问题得以解决3、驱动废弃问题更新application.properties,将spring.datasource.driver-class-name=com.mysql.jbdc.Driver修改spring.datasource

docker container的attach和detach模式_docker detach_y_dd的博客-程序员秘密

docker container 容器运行的attach和detach模式attach模式docker run nginx类似运行于前台的进程,会占据本地的STDIN和STDOUTdetach模式docker run -d nginx可以用docker container attach id改为attach模式类似于后台运行与容器的交互注意,必须容器状态是running才可以交互docker run -it id(container id) command 当command运行结束之后

乌鸦搜索算法和粒子集群算法_乌鸦和乌鸦_cunbei2644的博客-程序员秘密

乌鸦搜索算法和粒子集群算法Currently enjoying two new albums by two older bands: 目前正在欣赏两个老乐队的两张新专辑: The Black Crowes - Warpaint 黑乌鸦- 战漆 Counting Crows - Saturday Nights &amp; Sunday Mornings 乌鸦计数- 周六晚和周日上午 Cool...

推荐文章

热门文章

相关标签