您如何使KMeans预测更准确?

时间:2019-03-04 11:23:29

标签: machine-learning cluster-analysis k-means

我正在学习有关集群和KMeans等的知识,所以我的知识非常基础。我下面的内容是关于它如何工作的一些自我研究。基本上,如果在任何列中都显示“ a”,则“ Binary”将等于1。本质上,我正在尝试教它一种模式。我从使用Titanic数据集的教程中学到了以下内容,但我已经适应了自己的数据。

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

我的构造数据

dataset = [
    [0,'x','f','g'],[1,'a','c','b'],[1,'d','k','a'],[0,'y','v','w'],
    [0,'q','w','e'],[1,'c','a','l'],[0,'t','x','j'],[1,'w','o','a'],
    [0,'z','m','n'],[1,'z','x','a'],[0,'f','g','h'],[1,'h','a','c'],
    [1,'a','r','e'],[0,'g','c','c']     
]

df = pd.DataFrame(dataset, columns=['Binary','Col1','Col2','Col3'])
df.head()

df:

Binary  Col1  Col2  Col3
------------------------
  1       a    b     c
  0       x    t     v
  0       s    q     w
  1       n    m     a
  1       u    a     r

将非二进制编码为二进制:

labelEncoder = LabelEncoder()
labelEncoder.fit(df['Col1'])
df['Col1'] = labelEncoder.transform(df['Col1'])

labelEncoder.fit(df['Col2'])
df['Col2'] = labelEncoder.transform(df['Col2'])

labelEncoder.fit(df['Col3'])
df['Col3'] = labelEncoder.transform(df['Col3'])

将群集设置为两个,因为群集是1还是0?

X = np.array(df.drop(['Binary'], 1).astype(float))
y = np.array(df['Binary'])
kmeans = KMeans(n_clusters=2)
kmeans.fit(X)

测试:

correct = 0
for i in range(len(X)):
    predict_me = np.array(X[i].astype(float))
    predict_me = predict_me.reshape(-1, len(predict_me))
    prediction = kmeans.predict(predict_me)
    if prediction[0] == y[i]:
        correct += 1

结果:

print(f'{round(correct/len(X) * 100)}% Accuracy')
>>> 71%

如何使它更精确到99.99%知道'a'表示二进制列为1的程度?更多数据?

1 个答案:

答案 0 :(得分:1)

K均值甚至没有尝试来预测该值。因为这是一种无监督的方法。因为它不是一种预测算法;这是一个结构发现任务。不要将聚类误认为是分类。

集群编号没有任何意义。它们是0和1,因为它们是前两个整数。 K-均值是随机的。运行几次,有时您也只会得分29%。

此外,k-means是为连续输入而设计的。您可以将其应用于二进制编码的数据,但是结果会很差。