2017-03-27 44 views
0

我有大量的数据,我想运行kmean分类。数据集非常大,我无法将文件加载到内存中。Python:加载kmeans训练数据集并使用它来预测新的数据集

我的想法是像训练数据集一样在数据集的某些部分上运行分类,然后逐个部分地将数据集应用到数据集的其余部分。

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

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

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

回答

0

没有什么是k均值减少采样点和它们对应的集群之间的所有距离的总和中心。样本点与聚类的关联仅基于其与聚类中心的距离。

这意味着只要找到一组聚类中心,在预测步骤中就不会出现太多错误。你所显示的输出表明预测并不按照它应该的方式工作。

您是否尝试过在未保存/加载模型对象的情况下执行相同操作?你确定减少的和全套的数据有完全相同的格式吗?

我在你的关于在缩减样本集上学习聚类中心的想法中看到的唯一缺点是样本集必须代表整个数据。在最糟糕的情况下,您将有更大面积的样本点未被覆盖在训练集中,因此全部被分配到最近的集群中心。在你的例子中它肯定不会看起来是随机的。

+0

是的我没有保存/加载模型对象,我已经尝试过。它运行良好。预测数据完全相同,但我不加载全部数据(以节省时间)。那是问题吗? – user1643523

+0

当预测数据具有相同的长度时。我得到了正确的结果,但这对我来说还不够好。我需要能够拥有可变长度的数组。似乎我必须为每个数据块创建一个新模型。 – user1643523

+0

我仍然认为在组织数据的方式上存在一个问题。你是否尝试喂食样品来“预测()”一个接一个? – ypnos

相关问题