全文共字,预计学习时长12分钟
躲过双十一,还有,年年大促价,年年不够花。
现在的年轻人啊,过得实在太苦了。
租房压力大,工资不够花。
好不容易熬到年末,双11双12欠下的花呗要还的一大把。
这下年中再来个,口袋里那点可怜的积蓄就又开始按耐不住寂寞蠢蠢欲动了。
终于看透,这些商家就是抢钱的强盗,打着促销幌子的强盗。
图片来源:SOOGIF动图网站你有没有发现,每次一打开购物首页给你推送的宝贝恰好都是你想要的,你需要的,你非要不可的,你以为这是懂你?是命运使然?
Comeon,宝贝。AI+大数据的时代里,啥都是算好了的。
今天,我们就来好好看看,我们怎么就被大数据给算计了?这次,咱剁手也要剁得明明白白。
用户千千万,剁手买才是真王道。
图片来源:pexels假设你有一群经常一起吃饭喝酒聊人生谈理想的好盆友,他们分别是小A、小B、小C、小D、小F。
朋友小A是个妆容精致、衣着讲究的妹纸,知名外企officelady的她很喜欢买各种高级的化妆品和包包,一件风衣一万八她可以买的眼睛都不眨一下。
小B总是对小A的花钱大手大脚嗤之以鼻,她也是个大好年纪的姑娘,却总是常年穿着几百块一套的T恤牛仔裤。但小B是个十足的吃货,生平最爱就是走街窜巷探秘人间至味。
小C也喜欢买衣服和化妆品,但她非常喜欢买各种大牌的平价替代品,所以她虽然挣得不多,每次聚会衣服也从来都是不重样的。
小D是个高冷寡言的IT男,平时除了条纹衫就是格子衫,爱好除了工作就是睡觉,基本没什么开销,但实际上小D是你们几个中挣得最多的,年薪7位数。
小F呢,吃穿都不care,整个人就一佛系青年。但小F是个不折不扣的电子发烧友,最喜欢的就是尝试各款最新上市的电子产品,家里光beats就好几副。
你看,就你的这帮朋友消费习惯都各有不同,作为费尽心机要从我们的腰包里掏钱的商家们,又是如何准确预测用户的购买行为的?
图片来源:pexels这时候,机器学习就很能派上用场了。特别地,聚类是最重要的无监督学习问题,可以对一组数据中的相似个体进行分组。
这些类被称之为簇,一个簇就是一个数据集里的一组点,这些点相比于簇外的点,簇内的点要更相似些。基于距离的聚类将点分组为若干组簇群,簇群内的点距离要近一些,不同簇之间的距离要大一些。
聚类示例:簇是一组点,簇内的点相比于簇外的点,彼此间要更相似
这年头你的朋友们应该都有淘宝账户,还关联了支付宝。所以,淘宝后台其实知道你们每个人的账户ID、年龄、性别等信息,通过年账单你们的年收入和支出人家可能也差不多了如指掌(当然可能不够全面)。
比如淘宝要上新产品了,天猫精灵4.0,它需要知道哪些用户更有可能去购买这款产品。所以,对不同的用户进行分析并从中找到一些共同规律并归类,对于它们预测用户的购买行为非常重要。下面的内容我们将结合实例告诉你这些电商是如何利用大数据来对用户进行聚类分析的。
别慌,先来分析下数据。
我们将使用几个python库来完成整个过程。
所谓聚类,其实就是根据相似性原则,将数据集中具有较高相似度的数据点划分到同一簇群。聚类与分类的最大区别在于,聚类是无监督的,事先没有任何标签,也没有任何先验知识,你需要通过算法来对数据进行归类,找出数据的相似或差异性,这是个“求同存异”的过程。对簇内数据最大化“求同”,对簇外数据最大化“存异”。
聚类算法有很多,比如均值偏移聚类、DBSCAN聚类、EM聚类、层次聚类等等,本文中我们选用最常见的K-means聚类算法。
我们先从Kaggle上下载一包含顾客ID、性别、年龄、年收入以及消费分数的数据库,我们使用pandas的DataFrame导入数据。
customers=pd.read_csv(customers.csv)
customers.head()
数据集内部分数据一览在正式工作开始之前,我们一般需要探索数据的质量和变量分布情况,从数据显示中我们可以分析是否缺少必要值。对于K-means算法来说,它不太擅长处理有缺失值的情况,除非缺少的是观察值,而且缺的量很少。
如果数据大量缺失,有以下几个操作可选。
其中一个可选操作是输入这些值,当然输入的方式必须慎重考虑,K-means聚类是基于距离的聚类算法。
print(fMissingvaluesineachvariable:\n{customers.isnull().sum()})
查看我们的数据集是否存在数据缺失幸运的是,我们的数据集没有数据缺失的情况。
另一方面,我们还需要检查数据中存在的变量类型,分类变量无法直接处理。转换这些变量的方式取决于分类变量的类型。
print(fVariable:Type:\n{customers.dtypes})
本数据集中的变量类型正如我们看到的那样,性别(Gender)变量是分类变量。它是一个基本变量,出现没有任何固定的顺序,我们将它转换为一个二进制变量:男性(Male)取值0或1,女性(Female)取值0或1。
更进一步,我们可以绘制一些分布图来观察这些数据的统计特征。
我们将定义两个函数,一个函数返回一些统计数据,比如均值、标准差、中位数、方差;另一个函数描绘了每个变量的分布情况。
数值变量的描述性统计数值变量的分布情况我们将使用pairplot的seaborn功能来分析数值变量间的相关性。
此外,我们想看看性别间是否存在差异,因此我们设置hue参数来获得男女性用户的不同颜色的点。
Pairplot显示了数值变量之间的相关性。同时,我们用浅绿色表示男性用户,而女性用户用蓝色表示加以区分。
为啥我们在使用K-means算法的时候,要花这么大把的时间先来分析下数据?
因为我们必须满足K-means算法的以下几点假设:
·簇的形状:变量分布需要满足球形分布,这意味着簇应该是球状的。为了让这点成立,所有变量都应该是正态分布的,并且应该具有相同的方差。
·簇的大小:所有的簇应该具有相同数量的观察值。
·变量间相关性:变量之间几乎不存在相关性。
此外,通过查看数据分布情况和描述性统计,我们可以确定是否需要执行特征缩放。
K-means的过程K-means算法中为每个维度分配相等的权重。如果一个变量的范围与其他变量有显著差异,那么该变量在模型中就会更加受重视,其数据变化也会更明显。
在我们的数据集中,我们的变量是正态分布的。除了年龄的方差较低以外,其它变量之间统计特性相差不大。
我们可以用对数或者Box-Cox变换来解决这个问题。
Box-Cox是一系列变化,它通过为所提供的特定数据选择最佳的转换方式来纠正非正态分布变量或不等变量,调整参数用λ表示。
现在,我们将使用主成分分析法(PCA)来提取数据集隐藏结构的信息。
PCA是一种非监督学习算法,实际上它是一种降维算法,用来观察哪一维度能使数据集中的特征方差最大化。此外,它也能被用来做可视化、特征提取等。
PCA-主成分分析法那么,“降维”究竟意味着什么呢?
事实上,我们通过二维或者三维空间查看事物是很容易的,但是n维空间不说解释了,光想象就很难。你能想象一个5维空间长什么样子么?
因此,假设我们能够以某种方式在二维空间中绘制这些变量的图形,我们就不难找到这些变量间的相关性。
这正是PCA切入的地方。在PCA中,将N维特征映射到K维上,这K维就被称之为主成分,是在原N维特征基础上重新构造出来的新的K维正交特征。PCA的工作就是从原始数据空间中顺序地找出一组相互正交的坐标轴,第一个坐标轴是原始数据中方差最大的方向,第二个坐标轴也是与第一个坐标轴正交的平面中方差最大的,第三个坐标轴是与第1、2个轴正交的平面中方差最大的,并依此类推。
事实上,通过计算数据矩阵的协方差矩阵,得到协方差矩阵的特征值特征向量,从中选择特征值最大(即方差最大)的K个特征所对应的特征向量组成矩阵。这样就可以将N维数据矩阵转换到新的K维空间当中,实现数据特征的降维。
我们有五个变量(年龄、年收入、支出、男性、女性),如果想把这些变量绘制在一起,我们需要5个维度,但5维也是个不小的维度。
因此,我们将从sklearn模块中应用PCA功能实现数据降维。此后,我们将模型拟合到我们最终的数据集中,并进行数据转换。
#ApplyPCAandfitthefeaturesselected
pca=PCA(n_