目录
1.获取数据
2.合并数据
3.数据降维
4.使用K-means进行分类
分类
KMeans预估器返回参数
5.总结
Instacart Market Basket Analysis是一个经典的顾客行为预测案例。通过分析开源大量的订单数据来预测将用户进行分类
我们从官网中下载到对应的数据,放到本地目录之后,读取到数据如下:
(1)order_products__prior.csv:订单与商品信息。对应的字段有:order_id, product_id, add_to_cart_order, reordered,我们通过
order_products = pd.read_csv("order_products__prior.csv")
获取到该表中的内容如下,只截取部分数据如图:
(2)products.csv:商品信息。对应的字段有:product_id, product_name, aisle_id, department_id,我们通过
products = pd.read_csv("products.csv")
获取到该表中的内容如下:只截取部分数据如图:
(3)orders.csv:用户的订单信息。对应的字段有:order_id,user_id,eval_set,order_number,….,我们通过
orders = pd.read_csv("orders.csv")
获取到该表中的内容如下:只截取部分数据如图:
(4)aisles.csv:商品所属具体物品类别。对应的字段有:aisle_id, aisle,我们通过
aisles = pd.read_csv("aisles.csv")
获取到该表中的内容如下:只截取部分数据如图:
从上面的几个表中,我们并不能进行预测用户的购物行为,我们能用来预测用户的购买物品的类别,那么就需要将用户的user_id和用户物品类别aisle之间的建立关系,但是我们发现用户信息user_id在orders中 ,商品类别aisle在aisles中,那么需要将user_id和aisle建立关系才可以进行预测。
所以我们的目标就是将user_id和aisle,并将user_id作为表的行索引,aisle作为列索引,那么我们就可以采用聚类算法来进行预测了。
通过观察几个表发现,aisle和user_id可以通过aisle_id、product_id、order_id进行关联到一起。
(1)我们发现在aisles.csv中有aisle_id,在products.csv也有aisle_id,所以需要先把这两个表进行合并,采用pandas中的merge来进行合并,两个表无先后顺序,并且merge默认的为内联接,我们只需要按照aisle_id进行合并即可。
#的是让aisle_id和product_id 在同一张表中
tab1=pd.merge(aisles,products, on =["aisle_id","aisle_id"] )
得到的表如下:
经过上述操作这样我们就拿到了第一张表,此时aisle_id和product_id 在同一张表中。
PS:pandas.merge作用:根据某个字段对表进行合并
pandas.merge(left,
right,
how="inner",
on=None,
left_on=None,
right_on=None,
left_index=False,
right_index=False,
sort=False,
suffixes=("_x", "_y"),
copy=True,
indicator=False,
validate=None
)
其中几个主要参数介绍如下:
参数 | 含义 |
left | 左表 |
right | 右表 |
how | 合并表方式,默认为inner,还可以支持outer:全连接 /left:左连接 /right :右连接 |
on | 根据某个字段进行合并,必须两个都存在,当两个表格中没有同时存在的话,可以使用left_on/right_on来设置 |
left_on | 左表需要连接字段 |
right_on | 右表需要连接的字段 |
left_index | 左表行索引作为连接间 |
right_index | 右表行索引作为连接间 |
suffixes | 对两个数据集中出现的重复列,新数据集中加上后缀_x,_y进行区别 |
indicator | 根据连接键对合并后的数据进行排列,默认为True |
(2)我们在看哪个表格中含有product_id,我们看到order_products中含有product_id,那么我们就需要将刚才获得的tab1和order_products进行合并
tab2=pd.merge(tab1,order_products,on=["product_id","product_id"])
得到的tab2表结构如下:
这样我们获得的tab2就含有了aisle_id和order_id
(3)我们在看哪个表中含有order_id,在orders中含有order_id,并且含有user_id,那么我们将orders和tab2合并后,生成的表中就即含有aisle_id,也含有 aisle_id和user_id了,这样就将aisle_id和user_id放到了同一张表中了,这个表格中就含有了user_id和aisle。
(4)上面提到的tab3,并不是我们想要的行索引为 user_id,类索引为商品类别aisle,那我们还需要用到到交叉表,来找到这两者之间的频次的关系。那就需要使用交叉表对tab3进行转化成行为user_id,列为商品类别个数的表结构。如下:
table = pd.crosstab(tab3["user_id"],tab3["aisle"])
转化后的表结构如图所示:
我们可以看到获取到的表结构一共有206209个样本,134个特征。
PS:pandas.crosstab作用:用于统计分组频率,是一种特殊的pivot_table()
pandas.crosstab(
index,
columns,
values=None,
rownames=None,
colnames=None,
aggfunc=None,
margins=False,
margins_name="All",
dropna=True,
normalize=False,
)
其中参数介绍如下:
参数 | 含义 |
index | 行分组的键值。支持数组,若是数组,则说明为行为多级级联索引 |
columns | 列分组的键值。支持数组,若是数组,则说明为列为多级级联索引 |
values | 根据因子聚合的列表,需制定聚合函数 |
rownames | 队列,如指定,必须与传递的队列列数匹配 |
colnames | 队列,如指定,必须与传递的队列数匹配 |
aggfunc | 配合values使用,该值传入的是计算函数例如aggfunc=np.average,那么就是对values标记的行或者列进行求平均值 |
margins | 增加一行/列“总计”,默认为False。与normalize配合使用。 在设置为True的前提下: 如果normalize=‘index’,则margins作为新的一行出现在底部,即在底部多一行margins_name为索引值的总计数目; 如果normalize=‘columns’,则在最右侧增加一列,即在最右侧增加一行为margins_name为索引值的总计数目; 如果normalize=True,则在行和列都增加以margins_name为索引值的总计数目,即分别统计行和列的个数 |
margins_name | 增加的行/列的名字,默认值All |
dropna | 默认为True,如果某列的数据全是Nan,则删除 |
normalize | 是否被转化成浮点型都被转化成浮点型 默认为False。 normalize为'index'或1,则normalize每一行,转化值在单元格数据在该行的总数据中的占比 normalize为'columns'或0,则normalize每一列,转化值为单元格的数据在该列的总数据中的占比 normalize为'All'或True,则normalize全部,转化值为在单元格的数据在数据总和的占比 |
我们看到上面最后得到的数据集中一共有134个特征,但是特征里面有大量的0,说明有大量的特征冗余,所以要用PCA进行降维。其步骤如下:基本上就是实例化转换器,然后调用转换器的fit_transform进行转化。
#1)实例化一个转换器,一般采用百分比
#2)调用fit_transform
transfer = PCA(n_components=0.95)
data_new = transfer.fit_transform(table)
转化后的data_new的数据如下:
现在经过PCA降维之后,就只剩下44个特征了。
由于我们现在的数据集中无标签,所以需要通过无监督学习的方式来进行分类,我们使用K-means进行将用户分类。假设我们现在把用户分成3类,那么此时sklearn中的KMeans中的n_clusters为3。
我们看下步骤,和之前我们提到的监督学习的步骤一样:
(1)实例化预估器
estimator = KMeans(n_clusters=3)
(2)用预估器进行预测,由于这里没有标签,所以直接只传入特征值即可
estimator.fit(data_new)
y_predict = estimator.predict(data_new)
我们打印下该分类结果的前300条数据,发现每一个样本现在都被归为一类,用0,1,2来表示这三类人:
(3)评价预估器
这个后面会单独在去总结,这里先不去总结了。等总结好了,在更新。
我们在看下这个KMeans预估器里面的一些返回参数:
(1)返回该所有样本对应的分类标签
estimator.labels_
可以看下输出的值为:可以看到就是一个一维数组,每个样本对应的分类的类别
(2)返回分类簇的中心点坐标
estimator.cluster_centers_
由于数据内容比较多,不再截图数组的内容,只展示数组的大小,是一个
关于聚类和降维里面的有些东西自己还是不太清楚,自己还需要在多去学习下。里面涉及到的代码已经上传。由于那个csv文件比较大,可以自行上官网进行下载。