第一次参加天池新人赛,主要目的还是想考察下自己对机器学习上的成果,以及系统化的实现一下所学的东西。看看自己的掌握度如何,能否顺利的完成一个分析工作。为之后的学习奠定基础。

  这次成绩并不好,只是把整个机器学习的流程熟悉了下。我本人总结如下:

  步骤一:读懂题目含义,分析赛题的数据

  步骤二:特征工程的设计,这部分非常重要,好的特征工程能大大提高模型的准确率

  步骤三:训练算法。区分训练集、测试集等。

  步骤四:测试模型,看效果如何。

  赛题可以去天池的官网查看,里面有赛题说明,赛题数据等等

  https://tianchi.aliyun.com/getStart/introduction.htm?spm=5176.11165418.333.1.3c2e613cd1CCDk&raceId=231593

  以下是代码部分:

  

 import numpy as np
import pandas as pd #导入数据
train_online = pd.read_csv('ccf_online_stage1_train.csv')
train_offline = pd.read_csv('ccf_offline_stage1_train.csv')
test = pd.read_csv('ccf_offline_stage1_test_revised.csv')
 #将数据合并,以便统一对数据进行处理。都是线下数据
all_offline = pd.concat([train_offline,test])
 #查看每一列的异常值
f = lambda x:sum(x.isnull())
all_offline.apply(f)

  

 #Data的空值 赋值为null,统一空值的格式
all_offline['Date'] = all_offline['Date'].fillna('null') #将online与offline的数据合并
pd.merge(all_offline,train_online,on=['Merchant_id','User_id']) #通过合并数据,发现两者并无交集,题目要求只用线下预测,故排除线上online数据,
#只用offline数据 #根据赛题的要求,把正负样本标注出来
def is_used(column):
if column['Date']!='null' and column['Coupon_id']!='null':
return 1
elif column['Date']=='null' and column['Coupon_id']!='null':
return -1
else:
return 0 all_offline['is_used'] = all_offline.apply(is_used,axis=1)
 #Coupon_id 优惠券ID的具体数值意义不大,因此我们把他转换成:是否有优惠券
def has_coup(x):
if x['Coupon_id'] != 'null':
return 1
else:
return 0 all_offline['has_coup']=all_offline.apply(has_coup,axis=1)
 #由于Discount_rate优惠率的特殊格式:"150:20",很难使用算法来计算使用
#根据实际情况,优惠力度是能够影响优惠券的使用频率的。因此需要对Discount_rate进行转化
#根据Discount_rate标识出折扣率
import re
regex=re.compile('^\d+:\d+$') def discount_percent(y):
if y['Discount_rate'] == 'null' and y['Date_received'] == 'null':
return 'null'
elif re.match(regex,y['Discount_rate']):
num_min,num_max=y['Discount_rate'].split(':')
return float(num_max)/float(num_min)
else:
return y['Discount_rate'] all_offline['discount_percent'] = all_offline.apply(discount_percent,axis=1)
 #在进一步想,优惠力度会影响优惠券使用的概率,x:y这种满减的类型,x具体是多少,势必也会影响优惠券使用率
#讲满x元的标出x元
def discount_limit(y):
if y['Discount_rate'] == 'null' and y['Date_received'] == 'null':
return 'null'
elif re.match(regex,y['Discount_rate']):
num_min,num_max=y['Discount_rate'].split(':')
return num_min
else:
return 0 all_offline['discount_limit'] = all_offline.apply(discount_limit,axis=1)
all_offline.head(10)

  

 #由于赛题需要的是,优惠券领取后15天的使用概率
#因此,我们在is_used的基础上,在对领券时间 Date_received 和使用时间Date,进行比较,判断是否在15天内使用
#时间比较
import datetime
#标注15天内使用优惠券的情况
def used_in_15days(z):
if z['is_used'] == 1 and z['Date'] != 'null' and z['Date_received'] != 'null':
days= (datetime.datetime.strptime(z['Date'],"%Y%m%d")-datetime.datetime.strptime(z['Date_received'],"%Y%m%d"))
if days.days < 15:
return 1
else:
return 0
else:
return 0 all_offline['used_in_15days']=all_offline.apply(used_in_15days,axis=1)
 #再来观察discount_percent,discount_limit这2个特征,看数据的分布情况。
all_offline['discount_percent'].value_counts()

  

 all_offline['discount_limit'].value_counts()

  

#将discount_percent分段
def discount_percent_layer(columns):
if columns['discount_percent']=='null':
return 'null' columns['discount_percent']=float(columns['discount_percent'])
if columns['discount_percent'] <= 0.1:
return 0.1
elif columns['discount_percent'] <= 0.2:
return 0.2
elif columns['discount_percent'] <= 0.3:
return 0.3
elif columns['discount_percent'] <= 0.4:
return 0.4
else:
return 0.5 all_offline['discount_percent_layer']=all_offline.apply(discount_percent_layer,axis=1)
all_offline['discount_percent_layer'].value_counts()

·  

 #将discount_limit分段
def discount_limit_layer(columns):
if columns =='null':
return 'null' columns=int(columns)
if columns <= 10:
return 10
elif columns <= 20:
return 20
elif columns <= 30:
return 30
elif columns <= 50:
return 50
elif columns <= 100:
return 100
elif columns <= 200:
return 200
else:
return 300 all_offline['discount_limit_layer']=all_offline['discount_limit'].apply(discount_limit_layer)
all_offline['discount_limit_layer'].value_counts()

  

总结:
  此时 Coupon_id 被处理成 has_coup(1代表领取优惠券,0代表没有领取优惠券)
  Date,Date_received 被处理成 used_in_15days。表示是否在15天内使用过优惠券
  Discount_rate 被处理成 discount_percent(折扣率),discount_limit(满多少)
  Merchant_id,User_id 是unicode值,不需要进行处理

 #剩下Distance,看下Distance的分布情况
all_offline['Distance'].value_counts()

  

 #保存数据,以便后期使用起来方便
train_finall,test_finall = all_offline[:train_offline.shape[0]],all_offline[train_offline.shape[0]:]
all_offline.to_csv(r'output\all_offline.csv')
train_finall.to_csv(r'output\train_finall.csv')
test_finall.to_csv(r'output\test_finall.csv')
 #one_hot处理
all_offline_new=all_offline.drop(
['Coupon_id','Date','Date_received','Discount_rate','Merchant_id',
'User_id','discount_percent','discount_limit'],axis=1)
all_offline_new=pd.get_dummies(all_offline_new)
 #把测试集跟验证集分开
train01,test01=all_offline_new[:len(train_offline)],all_offline_new[len(train_offline):] #把没有领券的去掉
train02=train01[train01['has_coup']==1] #由于特征集 都是领券的人,故把 has_coup 字段删掉
train02=train02.drop(['has_coup'],axis=1)
test01=test01.drop(['has_coup'],axis=1) x_train=train02.drop(['used_in_15days'],axis=1)
y_train=pd.DataFrame({"used_in_15days":train02['used_in_15days']})
x_text=test01.drop(['used_in_15days'],axis=1)
 #建模
from sklearn.linear_model import LinearRegression clf=LinearRegression()
clf.fit(x_train,y_train) #用模型进行预测
predict=clf.predict(x_text) result=pd.read_csv('ccf_offline_stage1_test_revised.csv')
result['probability']=predict result=result.drop(['Merchant_id','Discount_rate','Distance'],axis=1) #发现最终预测有负值,直接归为0
result['probability']=result['probability'].apply(lambda x: 0 if x<0 else x) result.to_csv(r'output/sample_submission.csv',index=False)

天池新人赛-天池新人实战赛o2o优惠券使用预测(一)的更多相关文章

  1. 数据挖掘实战 - 天池新人赛o2o优惠券使用预测

    数据挖掘实战 - o2o优惠券使用预测 一.前言 大家好,家人们.今天是2021/12/14号.上次更新是2021/08/29.上篇文章中说到要开两个专题,果不其然我鸽了,这一鸽就是三个多月.今天,我 ...

  2. 2016天池-O2O优惠券使用预测竞赛总结

    第一次参加数据预测竞赛,发现还是挺有意思的.本文中的部分内容参考第一名“诗人都藏在水底”的解决方案. 从数据划分.特征提取.模型设计.模型融合/优化,整个业务流程得到了训练.作为新手在数据划分和模型训 ...

  3. o2o优惠券使用预测

    前沿: 这是天池的一个新人实战塞题目,原址 https://tianchi.aliyun.com/getStart/information.htm?spm=5176.100067.5678.2.e13 ...

  4. 《阿里云天池大赛赛题解析》——O2O优惠卷预测

    赛事链接:https://tianchi.aliyun.com/competition/entrance/231593/introduction?spm=5176.12281925.0.0.7e157 ...

  5. 天池新闻推荐比赛1:赛题理解+baseline

    天池新闻推荐比赛1:赛题理解+baseline 一.比赛信息 比赛链接: ​ https://tianchi.aliyun.com/competition/entrance/531842/inform ...

  6. 52-2018 蓝桥杯省赛 B 组模拟赛(一)java

    最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增.比如 212212 就是一个U型数字,但是 333333, 9898, 567567, 313133131 ...

  7. 2014年亚洲区域赛北京赛区现场赛A,D,H,I,K题解(hdu5112,5115,5119,5220,5122)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 下午在HDU上打了一下今年北京区域赛的重现,过了5题,看来单挑只能拿拿铜牌,呜呜. ...

  8. 第十三届北航程序设计竞赛决赛网络同步赛 B题 校赛签到(建树 + 打标记)

    题目链接  校赛签到 对每个操作之间建立关系. 比较正常的是前$3$种操作,若第$i$个操作属于前$3$种,那么就从操作$i-1$向$i$连一条有向边. 比较特殊的是第$4$种操作,若第$i$个操作属 ...

  9. 串门赛: NOIP2016模拟赛——By Marvolo 丢脸记

    前几天liu_runda来机房颓废,顺便扔给我们一个网址,说这上面有模拟赛,让我们感兴趣的去打一打.一开始还是没打算去看一下的,但是听std说好多人都打,想了一下,还是打一打吧,打着玩,然后就丢脸了. ...

随机推荐

  1. Mobility Model and Routing Model about the ONE

    ONE主要的功能是节点的移动,节点间的相遇情况,路由情况以及消息的处理机制.下面简要介绍下目前ONE自带的六种移动模型和六种路由模型. Mobility Model: 从大的方面,可以分为三种,1)随 ...

  2. LeetCode--No.012 Integer to Roman

    12. Integer to Roman Total Accepted: 71315 Total Submissions: 176625 Difficulty: Medium Given an int ...

  3. 卡尔曼滤波+单目标追踪+python-opencv

    很好的入门资料 向面试官一句话解释卡尔曼滤波: 用上一次的最优状态估计和最优估计误差去计算这一次的先验状态估计和先验误差估计: 用1得到的本次先验误差估计和测量噪声,得到卡尔曼增益: 用1,2步骤得到 ...

  4. CSS实现table固定宽度,超过单元格部分内容省略

    <table>单元格的宽度是根据内容的大小自适应的,没有内容的地方就挤到了一起.需要固定表格宽度和每一列的宽度. table-layout:fixed 在固定表格布局中,水平布局仅取决于表 ...

  5. python中selenium操作下拉滚动条方法汇总

    UI自动化中经常会遇到元素识别不到,找不到的问题,原因有很多,比如不在iframe里,xpath或id写错了等等:但有一种是在当前显示的页面元素不可见,拖动下拉条后元素就出来了. 比如下面这样一个网页 ...

  6. 高德地图添加marker及反地理编码获取POI

    项目中集成百度.高德.腾讯地图已是司空见惯的事情,今天我总结了一下项目中用到的高德地图常用的功能: 1.展示高德地图并定位显示定位图标: 2.添加实时大头针: 3.反地理编码获取周围兴趣点 效果如下: ...

  7. 谈谈对JVM的理解

            JVM可谓是学习JAVA基础中的基础了,但仍有不少同学对JVM概念还是比较模糊,甚至没有听说过,对java的理解也只是在基础语法 层面,本文就将对JVM进行初步介绍,因篇幅所限,只能介 ...

  8. redis linux(centos) 安装

    前言 redis 大家都使用过, 可以安装在windows下, 也可以安装在linux下, 一般还是linux下安装比较多. 这里来介绍一下redis在linux下的安装 一. 下载 https:// ...

  9. Xdebug调试环境配置

    首先我们需要下载Xdebug 务必根据安装的PHP版本,选择合适的Xdebug版本,由于我是在Windows环境下安装PHP的,选择下载Windows版本的PHP 5.3 VC9 TS (32 bit ...

  10. [转]ui-grid User can't select the row by clicking the select checkbox available in the respective row when enableFullRowSelection : true"

    本文转自:https://github.com/angular-ui/ui-grid/issues/5239 Try this style to enable checkbox selection: ...