机器学习入门研究(十七)— Instacart Market用户分类

目录

1.获取数据

2.合并数据

3.数据降维

4.使用K-means进行分类

分类

KMeans预估器返回参数

5.总结


Instacart Market Basket Analysis是一个经典的顾客行为预测案例。通过分析开源大量的订单数据来预测将用户进行分类

1.获取数据

我们从官网中下载到对应的数据,放到本地目录之后,读取到数据如下:

(1)order_products__prior.csv:订单与商品信息。对应的字段有:order_id, product_id, add_to_cart_order, reordered,我们通过

order_products = pd.read_csv("order_products__prior.csv")

获取到该表中的内容如下,只截取部分数据如图:

机器学习入门研究(十七)— Instacart Market用户分类_第1张图片

(2)products.csv:商品信息。对应的字段有:product_id, product_name, aisle_id, department_id,我们通过

products = pd.read_csv("products.csv")

获取到该表中的内容如下:只截取部分数据如图:

机器学习入门研究(十七)— Instacart Market用户分类_第2张图片

(3)orders.csv:用户的订单信息。对应的字段有:order_id,user_id,eval_set,order_number,….,我们通过

orders = pd.read_csv("orders.csv")

获取到该表中的内容如下:只截取部分数据如图:

机器学习入门研究(十七)— Instacart Market用户分类_第3张图片

(4)aisles.csv:商品所属具体物品类别。对应的字段有:aisle_id, aisle,我们通过

aisles = pd.read_csv("aisles.csv")

获取到该表中的内容如下:只截取部分数据如图:

机器学习入门研究(十七)— Instacart Market用户分类_第4张图片

从上面的几个表中,我们并不能进行预测用户的购物行为,我们能用来预测用户的购买物品的类别,那么就需要将用户的user_id和用户物品类别aisle之间的建立关系,但是我们发现用户信息user_id在orders中 ,商品类别aisle在aisles中,那么需要将user_id和aisle建立关系才可以进行预测。

所以我们的目标就是将user_id和aisle,并将user_id作为表的行索引,aisle作为列索引,那么我们就可以采用聚类算法来进行预测了。

2.合并数据

通过观察几个表发现,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"] )

得到的表如下:

机器学习入门研究(十七)— Instacart Market用户分类_第5张图片

经过上述操作这样我们就拿到了第一张表,此时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表结构如下:

机器学习入门研究(十七)— Instacart Market用户分类_第6张图片

这样我们获得的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。

机器学习入门研究(十七)— Instacart Market用户分类_第7张图片

(4)上面提到的tab3,并不是我们想要的行索引为 user_id,类索引为商品类别aisle,那我们还需要用到到交叉表,来找到这两者之间的频次的关系。那就需要使用交叉表对tab3进行转化成行为user_id,列为商品类别个数的表结构。如下:

table = pd.crosstab(tab3["user_id"],tab3["aisle"])

转化后的表结构如图所示: 

机器学习入门研究(十七)— Instacart Market用户分类_第8张图片

我们可以看到获取到的表结构一共有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全部,转化值为在单元格的数据在数据总和的占比

3.数据降维

我们看到上面最后得到的数据集中一共有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个特征了。

4.使用K-means进行分类

由于我们现在的数据集中无标签,所以需要通过无监督学习的方式来进行分类,我们使用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来表示这三类人:

机器学习入门研究(十七)— Instacart Market用户分类_第9张图片

(3)评价预估器

这个后面会单独在去总结,这里先不去总结了。等总结好了,在更新。

KMeans预估器返回参数

我们在看下这个KMeans预估器里面的一些返回参数:

(1)返回该所有样本对应的分类标签

estimator.labels_

可以看下输出的值为:可以看到就是一个一维数组,每个样本对应的分类的类别

机器学习入门研究(十七)— Instacart Market用户分类_第10张图片

(2)返回分类簇的中心点坐标

estimator.cluster_centers_

由于数据内容比较多,不再截图数组的内容,只展示数组的大小,是一个 

5.总结

关于聚类和降维里面的有些东西自己还是不太清楚,自己还需要在多去学习下。里面涉及到的代码已经上传。由于那个csv文件比较大,可以自行上官网进行下载。

你可能感兴趣的:(机器学习)