【问题标题】:How to scatter plot for Kmeans and print the outliers如何为 Kmeans 散点图并打印异常值
【发布时间】:2020-09-23 06:45:31
【问题描述】:

我正在使用 Scikit-Learn KMeans 模型。

这是我实现的代码,我在其中创建了 3 个集群(0、1、2):

df = pd.read_csv(r'1.csv',index_col=None)
dummies = pd.get_dummies(data = df)
km = KMeans(n_clusters=3).fit(dummies)
dummies['cluster_id'] = km.labels_
def distance_to_centroid(row, centroid):
    row = row[['id', 'product', 'store', 'revenue','store_capacity', 'state_AL', 'state_CA', 'state_CH',
       'state_WD', 'country_India', 'country_Japan', 'country_USA']]
    return euclidean(row, centroid)
dummies['distance_to_center0'] = dummies.apply(lambda r: distance_to_centroid(r,
    km.cluster_centers_[0]),1)

dummies['distance_to_center1'] = dummies.apply(lambda r: distance_to_centroid(r,
    km.cluster_centers_[1]),1)

dummies['distance_to_center2'] = dummies.apply(lambda r: distance_to_centroid(r,
    km.cluster_centers_[2]),1)

dummies.head()

这是我正在使用的数据集的示例:

   id,product,store,revenue,store_capacity,state
    1,Ball,AB,222,1000,CA
    1,Pen,AB,234,1452,WD
    2,Books,CD,543,888,MA
    2,Ink,EF,123,9865,NY
  • 如何为集群创建散点图?
  • 如何获取和打印异常值(远离集群的点)?

【问题讨论】:

  • 不清楚您在寻找什么。聚类数与图中的轴数(即维度)无关!
  • 如何获取和打印异常值(远离集群的点)?
  • 一般有很多方法可以得到异常值,你有直方图,箱线图(每个维度),或者你可以使用许多不同的算法来找到多维度的异常值,例如@987654321 @ 或this very popular Pythonic toolkit 中的许多其他示例,然后以 2D 或 3D 绘制结果(在使用适当的流形之后),然后更改它们的颜色。然而,由于您指定了集群的数量,因此无法保证一定会有异常值。
  • 此外,聚类和查找异常值是一回事,绘制结果是另一回事。您似乎对这两件事感到困惑。绘图严格采用 2D 或 3D,因此如果您有 D>3 的数据集,那么在应用您想要查找异常值的任何方法之后,您可以选择所需的维度(即特征)并绘制它们(或使用流形方法或 PCA 为您选择它们​​),最后您根据从应用的方法获得的索引更改点的颜色。

标签: python machine-learning scikit-learn k-means outliers


【解决方案1】:

要为集群创建散点图,您只需按集群为每个点着色。以如下代码为例:

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.cluster import KMeans
import seaborn as sns

df = pd.DataFrame(np.random.rand(10,2), columns=["A", "B"])
km = KMeans(n_clusters=3).fit(df)
df['cluster_id'] = km.labels_
dic = {0:"Blue", 1:"Red", 2:"Green"}
sns.scatterplot(x="A", y="B", data=df, hue="cluster_id", palette = dic)

输出:(记住它涉及随机)

hue 将点除以它们的“cluster_id”值——在我们的例子中,是不同的集群。 palette 只是为了控制颜色(之前在dic 中定义了一行)

您的数据包含两个以上的标签。如您所知,我们无法绘制 6 维散点图。 您可以执行以下操作之一:

  1. 仅选择 2 个特征并显示它们(特征选择)
  2. 使用 PCA/TSNE/其他算法降低维度,并使用新的特征进行分散(特征提取)

至于您的第二个问题,这取决于您如何定义“异常值”。没有单一的定义,这取决于具体情况。运行 KMeans 后,每个点都分配给一个集群。 KMeans 不会给你“好吧,我不确定这一点。它可能是一个异常值”。 一旦您决定了异常值的定义(例如“距中心的距离 > 3”),您只需检查一个点是否为异常值,然后打印出来。

如果我误解了任何问题,请澄清。最好更准确地说明您正在尝试做什么,以便社区为您提供帮助。

【讨论】:

  • 如果有 3 个值 [A, B,C] 我们要做什么?
  • 您可以在 3D 空间中显示,如下例所示:matplotlib.org/3.1.1/gallery/mplot3d/scatter3d.htmlstackoverflow.com/questions/52285104/…。就我个人而言,我认为以 3D 形式展示这一点没有帮助,但上面的链接会告诉你如何做到这一点
  • 我们可以在 sns 的帮助下绘制 A,B,C 列吗?A='red', B='Blue', C='Green'
  • 我不明白。列是我们图中的轴,颜色是一个聚类。如果你想让 A、B、C 成为颜色,那么图中的轴是什么?
猜你喜欢
  • 1970-01-01
  • 2021-12-20
  • 2019-03-14
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 2023-04-07
  • 2017-03-12
相关资源
最近更新 更多