当前,我的数据框同时包含数值和分类值(混合数据类型)。我的数据框看起来像-
id age txn_duration Statename amount gender religion
1 27 275 bihar 110 m hindu
2 33 163 maharashtra 50 f muslim
3 53 63 delhi 50 f muslim
4 47 100 up 50 m hindu
5 39 263 punjab 100 m punjabi
6 41 303 delhi 50 m punjabi
有20个州(州名)和7个宗教。我已经为Statename和rekigion做过get_dummies,但是噪音很大。还检测离群值。我的问题是- 1.如何为混合数据类型找到最佳聚类数。 2.在这种情况下,我使用的是k-均值算法。我可以使用k-modes或任何其他有助于结果的方法吗?因为使用k均值无法获得良好的结果 3.如何解释我的聚类结果。我已经使用
print (cluster_data[clmns].groupby(['clusters']).mean())
我能以其他方式查看或绘图吗?请提供代码给我
我的代码是-
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
import numpy as np
#Importing libraries
import os
import matplotlib.pyplot as plt#visualization
from PIL import Image
%matplotlib inline
import seaborn as sns#visualization
import itertools
import warnings
warnings.filterwarnings("ignore")
import io
from scipy import stats
from sklearn.cluster import KMeans
from kmodes.kprototypes import KPrototypes
cluster_data = pd.read_csv("cluster.csv")
cluster_data = pd.get_dummies(cluster_data, columns=['StateName'])
cluster_data = pd.get_dummies(cluster_data, columns=['gender'])
cluster_data = pd.get_dummies(cluster_data, columns=['religion'])
clmns = ['mobile', 'age', 'txn_duration', 'amount', 'StateName_Bihar',
'StateName_Delhi', 'StateName_Gujarat', 'StateName_Karnataka',
'StateName_Maharashtra', 'StateName_Punjab', 'StateName_Rajasthan',
'StateName_Telangana', 'StateName_Uttar Pradesh',
'StateName_West Bengal', 'gender_female',
'gender_male', 'religion_buddhist',
'religion_christian', 'religion_hindu',
'religion_jain', 'religion_muslim',
'religion_other', 'religion_sikh']
df_tr_std = stats.zscore(cluster_data[clmns])
#Cluster the data
kmeans = KMeans(n_clusters=3, random_state=0).fit(df_tr_std)
labels = kmeans.labels_
#Glue back to originaal data
cluster_data['clusters'] = labels
clmns.extend(['clusters'])
#Lets analyze the clusters
print (cluster_data[clmns].groupby(['clusters']).mean())
答案 0 :(得分:0)
您可以运行类似以下代码的内容: 看一下所附的图像,在该图中您可以看到具有3个以上的聚类(对于运行该数据集的聚类)不会显着减少失真。因此,在这种情况下,最佳簇数将为3(简单的合成数据)。对于嘈杂的数据,决定可能会更困难。
参考:A. Mueller's scipy notes on sklearn
import matplotlib.pyplot as plt
distortions = []
for i in range(1, 11):
km = KMeans(n_clusters=i,
random_state=0)
km.fit(X)
distortions.append(km.inertia_)
plt.plot(range(1, 11), distortions, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Distortion')
plt.show()
编辑ValueError : 对于ValueError:您只需要数字,因此您可以这样做:
df_numerics = df.drop(['Statename', 'gender', 'religion], axis=1)
您还可以删除不希望包含在聚类分析中的其他列。
使用df_numerics,尝试使用弯头方法,并尝试找到一个好的簇号。
然后,假设您发现3个群集很好,则可以运行:
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=42)
labels = kmeans.fit_predict(X)
标签包含数据帧中每一行的集群编号(三集群为0,1,2)。您也可以将其另存为datafame中的一列:
df['cluster_labels'] = labels
然后将其可视化,您可以选择2列(这比可视化要困难得多)。假设您选择了“ txn_duration”和“ amount”,您可以绘制这些列,并以如下颜色添加聚类标签:
import matplotlib.pyplot as plt
plt.scatter(df['txn_duration'],df['amount'], c=df['cluster_labels'])