如何散布Kmeans图并打印离群值

问题描述 投票:0回答:1

我正在使用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
  • 如何为群集创建散点图?
  • 如何获取并打印离群值(离聚类点远的点)?
python machine-learning scikit-learn k-means outliers
1个回答
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)

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

enter image description here

hue将点除以它们的“ cluster_id”值-在我们的示例中为不同的簇。 palette只是用来控制颜色(在dic的前一行中定义)

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

  1. 仅选择两个功能并显示它们(功能选择)
  2. 使用PCA / TSNE /其他算法减少尺寸并使用新功能进行散布(特征提取)

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

如果我误解了任何问题,请澄清。为了使社区能够为您提供帮助,最好对您要做的事情更加准确。

© www.soinside.com 2019 - 2024. All rights reserved.