Python:加载kmeans训练数据集并使用它来预测新的数据集

时间:2017-03-27 14:32:48

标签: python scikit-learn k-means

我有大量的数据,我想对其进行kmean分类。数据集太大了,我无法将文件加载到内存中。

我的想法是在数据集的某些部分(如训练数据集)上运行分类,然后逐步将分类应用于数据集的其余部分。

import pandas as pd
import pickle
from sklearn.cluster import KMeans

frames = [pd.read_hdf(fin) for fin in ifiles]
data = pd.concat(frames, ignore_index=True, axis=0)
data.dropna(inplace=True)

k = 12
x  = pd.concat(data['A'], data['B'], data['C'], axis=1, keys=['A','B','C'])
model = KMeans(n_clusters=k, random_state=0, n_jobs = -2)
model.fit(x)

pickle.dump(model, open(filename, 'wb'))

x看起来像这样:

array([[-2.26732099,  0.24895614,  2.34840191],
   [-2.26732099,  0.22270912,  1.88942378],
   [-1.99246557,  0.04154312,  2.63458941],
   ..., 
   [-4.29596287,  1.97036309, -0.22767511],
   [-4.26055474,  1.72347591, -0.18185197],
   [-4.15980382,  1.73176239, -0.30781225]])

模型看起来像这样:

KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
n_clusters=12, n_init=10, n_jobs=-2, precompute_distances='auto',
random_state=0, tol=0.0001, verbose=0)

用模型颜色编码的两个模型参数的图如下所示: enter image description here

现在我想加载模型并将其用于预测。作为测试示例,我加载了相同的数据(此处未显示),并尝试预测新数据集。

modelnew = pickle.load(open('test.pkl', 'rb'))
modelnew.predict(x)

结果: enter image description here

这个数据显然没有集群。我错过了什么?我是否需要以某种方式修复模型参数?

我试图做一个测试和火车数据集的例子。这里也出错了。显然我缺少一些东西:

## Splitting data in a test and train data set
sample_train, sample_test = train_test_split(x, test_size=0.50)

k = 12 ## Setting number of clusters
model = KMeans(n_clusters=k, random_state=0, n_jobs = -2) ## Kmeans model
train = model.fit(sample_train) ## Fitting the training data
model.predict(sample_test) # Predicting the test data

centroids =  model.cluster_centers_
labels = model.labels_

## Figures
cmap_model = np.array(['red', 'lime', 'black', 'green', 'orange', 'blue', 'gray', 'magenta', 'cyan', 'purple', 'pink', 'lightblue', 'brown', 'yellow'])
plt.figure()
plt.scatter(sample_train[:,0], sample_train[:,1], c=cmap_model[train.labels_], s=10, edgecolors='none')
plt.scatter(centroids[:, 0], centroids[:, 1], c=cmap_model,  marker = "x", s=150, linewidths = 5, zorder = 10)

plt.figure()
plt.scatter(sample_test[:,0], sample_test[:,1], c=cmap_model[labels], s=10, edgecolors='none')
plt.scatter(centroids[:, 0], centroids[:, 1], c=cmap_model,  marker = "x", s=150, linewidths = 5, zorder = 10)
plt.show()

培训数据: Train result

测试数据: Test result

2 个答案:

答案 0 :(得分:0)

kmeans所做的是最小化采样点与其相应聚类中心之间所有距离的总和。样本点与群集的关联仅基于其与群集中心的距离。

这意味着一旦找到一组聚类中心,预测步骤中就不会出现太多问题。您显示的输出表明预测不会按照应有的方式运行。

您是否尝试过相同而不保存/加载模型对象?您是否确保简化和完整集中的数据具有完全相同的格式?

我认为在减少样本集中学习聚类中心的想法中唯一的缺点是样本集必须代表整个数据。在最坏的情况下,您将拥有更大的样本点区域,这些区域未在训练集中涵盖,因此全部分配给最近的离开的群集中心。它肯定不会像你的例子那样随机。

答案 1 :(得分:0)

您可能需要将 labels = model.labels _ 行更改为 labels = model.predict(sample_test)