机器学习Day4——K-means算法
没有目标值——就是无监督学习一家广告平台需要根据相似的人口学特征和购买习惯将美国人口分成不同的小组,以便广告客户可以通过有关联的广告接触到他们的目标客户。Airbnb需要将自己的房屋清单分组成不同的社区,以便用户能更轻松地查阅这些清单。一个数据科学团队需要降低一个大型数据集的维度的数量,以便简化建模和降低文件大小。特点分析:采用迭代式算法,直观易懂并且非常实用缺点:容易收敛到局部最优解(可多次聚类
·
本栏目为本人自学B站各位好心的博主所录视频过程中记录下来的笔记,出处基本来自于B站视频博主以及csdn中各位大佬的解释,我只起到了转载的作用。因来源过于复杂,因此无法标注来源。
目录
1.无监督学习-K-means算法
1.1 什么是无监督学习
没有目标值——就是无监督学习
比如说:
- 一家广告平台需要根据相似的人口学特征和购买习惯将美国人口分成不同的小组,以便广告客户可以通过有关联的广告接触到他们的目标客户。
- Airbnb需要将自己的房屋清单分组成不同的社区,以便用户能更轻松地查阅这些清单。
- 一个数据科学团队需要降低一个大型数据集的维度的数量,以便简化建模和降低文件大小。
1.2 无监督学习算法
- 聚类
- K-means(K均值聚类)
- 降维
- PCA(主成分分析)
1.3 K-means原理
先看看K-means的聚类效果图:
K-means聚类步骤:
- 随机设置K个特征空间内的点作为初始的聚类中心
- 对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
- 接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
- 如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程
1.4 K-means聚类算法的API
- sklearn.cluster.KMeans(n_clusters=8, init=‘k-means++’)
- k-means聚类
- n_clusters:开始的聚类中心数量
- init:初始化方法,默认为’k-means++’
- labels_:默认标记的类型,可以和真实值比较(不是值比较)
1.5 K-means聚类算法对Instacart Market用户聚类
流程分析:
- 获取数据
- 合并表
- 用交叉表找到user_id与aisle的关系
- 特征降维
- K-means算法预估器
- 分组结果
- 性能评估(轮廓系数)
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import pandas as pd
# 1、获取数据
order_products = pd.read_csv("./data/instacart/order_products__prior.csv")
aisles = pd.read_csv("./data/instacart/aisles.csv")
orders = pd.read_csv("./data/instacart/orders.csv")
products = pd.read_csv("./data/instacart/products.csv")
# 2、合并表
## order_products__prior.csv:订单与商品信息
## 字段:order_id, product_id, add_to_cart_order, reordered
## products.csv:商品信息
## 字段:product_id, product_name, aisle_id, department_id
## orders.csv:用户的订单信息
## 字段:order_id,user_id,eval_set,order_number,….
## aisles.csv:商品所属具体物品类别
## 字段: aisle_id, aisle
## 合并aisles和products aisle_id
tab1 = pd.merge(aisles,products,on = ["aisle_id","aisle_id"])
## 合并tab1和order_products product_id
tab2 = pd.merge(tab1,order_products,on = ["product_id","product_id"])
## 合并tab2和orders order_id
tab3 = pd.merge(tab2,orders,on = ["order_id","order_id"])
# 3、找到user_id和aisle之间的关系
table = pd.crosstab(tab3["user_id"],tab3["aisle"])
data = table[:40000]
# 4、特征降维
transfer = PCA(n_components=0.95)
data = transfer.fit_transform(data)
# 5、K-means算法预估器
estimator = KMeans(n_clusters=3)
estimator.fit(data)
# 6、分组结果
y_prediction = estimator.predict(data)
# 7、性能评估:轮廓系数
score = silhouette_score(data,y_prediction)
print(score)
1.6 K-means性能评估指标
- 轮廓系数
注:对于每个点i为已聚类数据中的样本,b_i为i到其它族群的所有样本的距离最小值,a_i为i到本身簇的距离平均值。最终计算出所有的样本点的轮廓系数平均值
- 轮廓系数值分析
- 分析过程(以一个蓝1点为例)
- 1、计算出蓝1离本身族群所有点的距离的平均值a_i
- 2、蓝1到其它两个族群的距离计算出平均值红平均,绿平均,取最小的那个距离作为b_i
- 3、根据公式:极端值考虑:如果b_i>>a_i:那么公式结果趋近于1;如果a_i>>b_i:那么公式结果趋近于-1
-
结论
如果b_i>>a_i:趋近于1效果越好, b_i<<a_i:趋近于-1,效果不好。轮廓系数的值是介于[-1,1],越趋近于1代表内聚度和分离度都相对较优。 -
轮廓系数API
sklearn.metrics.silhouette_score(X, labels)- 计算所有样本的平均轮廓系数
- X:特征值
- labels:被聚类标记的目标值
1.7 K-means总结
- 特点分析:采用迭代式算法,直观易懂并且非常实用
- 缺点:容易收敛到局部最优解(可多次聚类解决)
注意:聚类一般做在分类之前
2.总结
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献3条内容
所有评论(0)