我有一份列表,希望对其进行无监督学习,并利用所学知识来预测测试列表中每个项目的值
#格式 [real_runtime, processors, requested_time, score, more_to_be_added]#列表中的一些条目
训练数据集
Xsrc = [['354', '2048', '3600', '53.0521472395'], ['605', '2048', '600', '54.8768871369'], ['128', '2048', '600', '51.0'], ['136', '2048', '900', '51.0000000563'], ['19218', '480', '21600', '51.0'], ['15884', '2048', '18000', '51.0'], ['118', '2048', '1500', '51.0'], ['103', '2048', '2100', '51.0000002839'], ['18542', '480', '21600', '51.0000000001'], ['13272', '2048', '18000', '51.0000000001']]
测试数据集
利用这些聚类,我希望预测一份新列表的 real_runtime:Xtest= [[‘-1’, ‘2048’, ‘1500’, ‘51.0000000161’], [‘-1’, ‘2048’, ‘10800’, ‘51.0000000002’], [‘-1’, ‘512’, ‘21600’, ‘-1’], [‘-1’, ‘512’, ‘2700’, ‘51.0000000004’], [‘-1’, ‘1024’, ‘21600’, ‘51.1042617556’]]
代码:格式化列表并使用Python中的scikit进行聚类和绘制聚类图
from sklearn.feature_selection import VarianceThresholdimport numpy as npfrom sklearn.cluster import DBSCANfrom sklearn import metricsfrom sklearn.datasets.samples_generator import make_blobsfrom sklearn.preprocessing import StandardScalerimport matplotlib.pyplot as plt##训练数据集Xsrc = [['354', '2048', '3600', '53.0521472395'], ['605', '2048', '600', '54.8768871369'], ['128', '2048', '600', '51.0'], ['136', '2048', '900', '51.0000000563'], ['19218', '480', '21600', '51.0'], ['15884', '2048', '18000', '51.0'], ['118', '2048', '1500', '51.0'], ['103', '2048', '2100', '51.0000002839'], ['18542', '480', '21600', '51.0000000001'], ['13272', '2048', '18000', '51.0000000001']]print "Xsrc:", Xsrc##测试数据集Xtest= [['1224', '2048', '1500', '51.0000000161'], ['7867', '2048', '10800', '51.0000000002'], ['21594', '512', '21600', '-1'], ['1760', '512', '2700', '51.0000000004'], ['115', '1024', '21600', '51.1042617556']]##聚类 X = StandardScaler().fit_transform(Xsrc)db = DBSCAN(min_samples=2).fit(X) #没有聚类参数,使用默认的epscore_samples_mask = np.zeros_like(db.labels_, dtype=bool)core_samples_mask[db.core_sample_indices_] = Truelabels = db.labels_n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)clusters = [X[labels == i] for i in xrange(n_clusters_)]print('估计的聚类数量: %d' % n_clusters_)print("轮廓系数: %0.3f" % metrics.silhouette_score(X, labels))##绘制数据集unique_labels = set(labels)colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels)))for k, col in zip(unique_labels, colors): if k == -1: # 噪声使用黑色表示。 col = 'k' class_member_mask = (labels == k) xy = X[class_member_mask & core_samples_mask] plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col, markeredgecolor='k', markersize=20) xy = X[class_member_mask & ~core_samples_mask] plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col, markeredgecolor='k', markersize=10)plt.title('估计的聚类数量: %d' % n_clusters_)plt.show()
有什么方法可以利用这些聚类来预测值吗?
回答:
聚类不是预测
“预测”聚类标签几乎没有用处,因为聚类算法只是“随机”分配的标签。
更糟糕的是:大多数算法无法纳入新数据。
你真的应该使用聚类来探索你的数据,了解数据中有什么和没有的东西。不要依赖聚类是“好”的这一假设。
有时,人们通过将数据集量化为k个中心,并仅使用这个“压缩”数据集进行分类/预测(通常仅基于最近邻),取得了一些成功。我还看到过针对每个聚类训练一个回归模型用于预测,并通过最近邻选择应用哪个回归器的想法(即,如果数据很好地适合某个聚类,则使用该聚类的回归模型)。但我不记得有任何重大的成功案例…