1.问题分析
此次实战赛是通过分析给出的用户全集和商品子集来对样本集中的用户购买行为进行预测,基于大数据预测出用户最有可能购买的商品,并以此预测结果制表,作为评估标准。
特征决定了学习器的学习上限,而算法和模型是为了逼近这个上限。因此我们要对出题方给出的数据集进行处理,提取选择特征,构建新的特征。为接下来的模型构建做好特征方面的准备,保证学习器预测的精确。
2.数据处理
下载下数据集后,我使用了Excel,wps多种方式试图打开数据集,但因为数据集过大,超过了这两个软件的工作长度,所以只好使用Python进行数据的预处理。处理如下:
首先下载相应的库numpy和pandas进行导入数据,标记列名便于分析
import pandas
import numpy
from pandas import read_csv;
from pandas import to_datetime;
from pandas import Series
df=read_csv('D:\\user.csv',low_memory=False,names=['用户标识','商品标识','用户行为','用户地理标识','商品分类','时间']);
item=read_csv('D:\\item.csv',low_memory=False,names=['商品标识','商品地理标识','商品分类1']);
观察数据集后发现,在用户集和商品集中用户空间标识上缺失值较多,同时地理位置经过脱敏处理,进行过加密,所以我将商品空间数据和用户空间标识删除。
#删除地理标识
del df['用户地理标识']
del item['商品地理标识']
在题目中提到,最终预测的用户购买的商品是从商品子集P中进行预测的,所以在不在商品子集中的而在用户全集中存在的商品对预测的意义不大。
利用Python求用户集和商品集中商品标识数目:
#比较商品种类数目
l=df['商品标识'].drop_duplicates()
goods_count1=len(l)
print('用户集中商品标识数目:',goods_count1)
l=item['商品标识'].drop_duplicates()
goods_count2=len(l)
print('商品集中商品标识数目:',goods_count2)
运行的结果为:
用户集中商品标识数目: 4758485
商品集中商品标识数目: 422859
可见两个数据集中的商品标识数目相差甚远。
所以我决定将用户集和商品集进行字段匹配,从而去除多余的商品标识。
#合并两个数据集
df=pandas.merge(df,item,left_on='商品标识',right_on='商品标识')
merge函数在合并两个数据集的同时,自动删除了匹配不成功的数据行
因为我们需要预测的是12.19日整天的用户行为,所以小时对预测没有意义,所以首先要对数据进行拆分,从而去除小时。
#拆分日期
df['时间']=df['时间'].str.split(' ',1,True)
在csv文件中,时间的保存方式为字符串形式,不便于我们进行分析,所以拆分后我们需要进行数据的转换,将其转换为时间数据格式。
#日期数据形式的转化
df['时间']=pandas.to_datetime(df.时间,format='%Y/%m/%d', errors = 'coerce')
df['月']=df['时间'].dt.month
df['日']=df['时间'].dt.day
del df['时间']
在Excel中观察到的部分数据中,我们发现,12月12日因其为购物狂欢节,当天的用户行为数远超平常,甚至对前几日的用户浏览数,收藏数,购物车数都有很大的影响,而这对19日的预测有很大的扰动,可以认为是异常点,所以决定我将12月12日的数据删除:
#删除12月12日
i=0
j=1
d=len(df['用户标识'])
a=Series([])
while i<d:
if df['月'][i]==df['日'][i]:
a[j]=i
j=j+1
i=i+1
df=df.drop(index=a,axis=0)
同时,为了便于统计,我索性将影响较小,距离12.19日较远的11.18删除,以便于用1到30直接表示日期:
#删除11月18日
i=0
j=1
d=len(df['用户标识'])
a=Series([])
while i<d:
if int(df['月'][i])==11 and int(df['日'][i])==18:
a[j]=i
j=j+1
i=i+1
df=df.drop(index=a,axis=0)
数据的预处理已经完成,接下来我做了一些简单的统计
#计数
l=df['用户标识'].drop_duplicates()
id_count=len(l)
l=df['商品分类'].drop_duplicates()
cat_count=len(l)
l=df['商品标识'].drop_duplicates()
goods_count=len(l)
#计浏览,收藏,加入购物车,购买数目
browse_count=0
cart_count=0
collection_count=0
buy_count=0
i=0
while i<len(df['用户行为']):
if int(df['用户行为'][i])==1:
browse_count=browse_count+1
elif int(df['用户行为'][i])==2:
collection_count=collection_count+1
elif int(df['用户行为'][i])==3:
cart_count=cart_count+1
else :
buy_count=buy_count+1
i=i+1
Sum=browse_count+cart_count+collection_count+buy_count
print("更新后用户全集")
print(df)
print(df.describe())
print ('用户标识数目:',id_count)
print ('商品分类数目:',cat_count)
print ('商品标识数目:',goods_count)
print ('浏览总次数:',browse_count)
print ('收藏总次数:',collection_count)
print ('购物车总次数:',cart_count)
print ('购买总次数:',buy_count)
print ('购买所占比例:',buy_count/Sum)
运行结果:
用户标识数目: 19863
商品分类数目: 1043
商品标识数目: 413394
浏览总次数: 1913969
收藏总次数: 32799
购物车总次数: 56057
购买总次数: 23138
购买所占比例: 0.01142074164236958
3.心得
- 特征工程方面,设想了一些的构建特征,后来又增增减减很多的设想特征,有些实现难度大暂时还没有去实现,一些简单的构造特征仍在实现中。
- 对Python的不熟练,导致经常出现bug,在学习使用的过程中耗费了大量的时间。
- 收获也颇丰,对数据分析有了更深入的了解,对Python用于数据分析也基本熟练。