K-средства не приводят к форме локтя - PullRequest
1 голос
/ 04 ноября 2019

Я пытаюсь использовать k-means в наборе данных, доступном по по этой ссылке , используя только переменные, относящиеся к клиенту. Проблема в том, что 7 из 8 переменных являются категориальными, поэтому я использовал один горячий кодер для них.

Чтобы использовать метод elbow для выбора идеального числа кластеров, я запустил KMeans для 2 до22 кластера и нанесены значения инерции_. Но форма не была похожа на локоть, она была больше похожа на прямую линию.

Я что-то не так делаю?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans 
from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler

bank = pd.read_csv('bank-additional-full.csv', sep=';') #available at https://archive.ics.uci.edu/ml/datasets/Bank+Marketing# 

# 1. selecting only informations about the client
cli_vars = ['age', 'job', 'marital', 'education', 'default', 'housing', 'loan']
bank_cli = bank[cli_vars].copy()

#2. applying one hot encoder to categorical variables
X = bank_cli[['job', 'marital', 'education', 'default', 'housing', 'loan']]
le = preprocessing.LabelEncoder()
X_2 = X.apply(le.fit_transform)
X_2.values
enc = preprocessing.OneHotEncoder()
enc.fit(X_2)

one_hot_labels = enc.transform(X_2).toarray()
one_hot_labels.shape #(41188, 33)

#3. concatenating numeric and categorical variables
X = np.concatenate((bank_cli.values[:,0].reshape((41188,1)),one_hot_labels), axis = 1)
X.shape

X = X.astype(float)
X_fit = StandardScaler().fit_transform(X)

X_fit

#4. function to calculate k-means for 2 to 22 clusters
def calcular_cotovelo(data):
    wcss = []
    for i in range(2, 23):
        kmeans = KMeans(init = 'k-means++', n_init= 12, n_clusters = i)
        kmeans.fit(data)
        wcss.append(kmeans.inertia_)
    return wcss

cotovelo = calcular_cotovelo(X_fit)

#5. plot to see the elbow to select the ideal number of clusters
plt.plot(cotovelo)
plt.show()

Это график инерции для выбора кластеров. Это не в форме локтя, и значения очень высоки.

enter image description here

1 Ответ

2 голосов
/ 04 ноября 2019

K-means не подходит для категориальных данных. Вместо этого вам следует обратиться к k-прототипам, которые сочетают в себе k-режимы и k-средства и способны кластеризовать смешанные числовые и категориальные данные.

В Python доступна реализация k-прототипов. .

Однако, если вы рассматриваете только числовую переменную, вы можете увидеть колено с критериями k-средних:

k-means on numerical data only

Для пониманияпочему вы не видите никакого колена (с помощью k-средних как для числовых, так и для категориальных данных), вы можете посмотреть на количество точек на кластеры. Вы можете заметить, что каждый раз, когда вы увеличиваете количество кластеров, формируется новый кластер с несколькими точками, которые были в большом кластере на предыдущем шаге, таким образом, критерий всего на несколько меньше, чем на предыдущем шаге.

...