我有大量数据,我想对其运行 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()
最佳答案
kmeans 的作用是最小化样本点与其对应的聚类中心之间的所有距离之和。样本点与聚类的关联仅基于其到聚类中心的距离。
这意味着一旦找到一组聚类中心,预测步骤就不会出错。您显示的输出表明预测根本没有按应有的方式工作。
您是否尝试过相同的操作而不在中间保存/加载模型对象?您是否确保缩减数据集和完整数据集中的数据格式完全相同?
我认为您在减少样本集上学习聚类中心的想法的唯一缺点是样本集必须代表整个数据。在最坏的情况下,您将有更大的样本点区域未包含在训练集中,因此全部分配给关闭的最近的聚类中心。它肯定不会像您的示例中那样看起来是随机的。
关于Python:加载 kmeans 训练数据集并使用它来预测新数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43049270/