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

Posted

技术标签:

【中文标题】Python:加载 kmeans 训练数据集并使用它来预测新数据集【英文标题】:Python: loading a kmeans training dataset and using it to predict a new dataset 【发布时间】:2017-08-20 07:54:45 【问题描述】:

我有大量数据,我想对其进行 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)

使用模型颜色编码的两个模型参数图如下所示:

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

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

结果:

这些数据显然没有聚类。我错过了什么?我需要以某种方式修复模型参数吗?

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

## 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()

训练数据:

测试数据:

【问题讨论】:

您好,您找到解决方案了吗?我也面临和你一样的问题!我尝试以不同的方式使用 joblib 和 pickle 保存我的 k-means 模型,但仍然是同样的问题。当我用很少的数据进行预测时,我总是得到与输出相同的集群。 【参考方案1】:

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

这意味着,一旦您找到了一组聚类中心,预测步骤中就不会出错。您显示的输出表明 predict 根本没有按应有的方式工作。

您是否在不保存/加载模型对象的情况下尝试相同的操作?您是否确保缩减集和完整集中的数据具有完全相同的格式?

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

【讨论】:

是的,我已经尝试过相同的方法,但没有保存/加载模型对象。在那里它工作得很好。预测数据完全相同,但我没有加载数据的全长(以节省时间)。有问题吗? 预测数据长度相同时。我得到了正确的结果,但这对我来说还不够好。我需要能够拥有可变长度的数组。看来我必须为每个数据块创建一个新模型。 我仍然认为您组织数据的方式存在问题。您是否尝试过给predict() 一个接一个送样? 是的,肯定有问题!我不确定您逐个样本进行预测是什么意思。如何查看是否正确?【参考方案2】:

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

【讨论】:

【参考方案3】:

使用X_test = X_test[X_train.columns] 解决问题。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于Python:加载 kmeans 训练数据集并使用它来预测新数据集的主要内容,如果未能解决你的问题,请参考以下文章

Python训练Kmeans算法预测图像的主色

R语言图形用户界面数据挖掘包Rattle:加载UCI糖尿病数据集并启动Rattle图形用户界面数据集变量重命名,为数据集结果变量添加标签数据划分(训练集测试集验证集)随机数设置

如何绘制kmeans?

R语言使用caret包中的createDataPartition函数进行机器学习数据集划分划分训练集和测试集并指定训练测试比例

R语言使用caret包中的createDataPartition函数进行机器学习数据集划分划分训练集和测试集并指定训练测试比例

如何加载保存的 KMeans 模型(在 ML Pipeline 中)?