使用机器学习对数据集进行聚类

时间:2018-02-19 05:32:55

标签: machine-learning k-means

我有一个重复的字符串数据集如下。

  

[建筑维修&维护,书籍,光盘,音像,文具,其他   服务,建筑维修&维护]

我想使用上面的数据集在一个集群中聚集相同的值。 输出应为

  

[建筑维修&维护,建筑维修&   维护,......] [其他服务,其他服务,......]

1 个答案:

答案 0 :(得分:-1)

不确定您想要什么,以及它与机器学习有什么关系。但是你可以在python中轻松实现上述结果,而无需使用机器学习或kmeans集群。

以下是示例代码:

import collections
data = ["Building Repairs & Maintenance","Books-CDs-Audio-Video","Stationery","Other Services","Building Repairs & Maintenance"]
duplicate_count = collections.Counter(data)
for key in duplicate_count:
    print [key]*count[key]

如果你能更详细地阐述你的问题以及它与机器学习有何关系,那就太棒了。

编辑#1:

您是在谈论在列表中查找类似的文本,例如 [书籍 - 音频 - CD,音频,教科书,建筑维修和维护,维修和保养,维修]

给出以下输出

[书籍 - 音频 - CD,音频,教科书] [建筑维修和保养,公寓服务,维修]

这是更适合使用机器学习和聚类的地方,因为在这种情况下字符串不是完全匹配,而是在上下文和含义上彼此相关。

编辑#2:

对于Bag of words方法,您可以从此代码中获取指南。然而,这只是我刚才所做的基本实现,需要进行修改以添加必要的功能,例如词干,停止删除单词和tfidf代替简单的单词表示,以使其更准确。

from sklearn.feature_extraction.text import CountVectorizer as _Vect
from sklearn.cluster import KMeans

simple_vectorizer = _Vect(min_df=1)
train_fit = vectorizer.fit_transform(data)

#Sample Initialization of K-means. Assuming number of clusters to be 2.
km = KMeans(n_clusters=2, init='random', n_init=1)
km.fit(train_fit)
print km.labels_

编辑#3

基于公共数据集的简单移动平均线实施。为此,我将值保存在临时文件名so.csv。

首先,在查看您的数据时,我认为您根本不需要对类别使用聚类技术,因为所有特定类别都完全相同。您可以轻松地过滤掉或使用分组来获取相同类别的行。

其次,由于我们不再关注聚类,因此不需要对不同的字符串进行加权平均。

虽然此方法为每个类别提供预测值。我认为像arima这样更强大的方法会更适合您的情况,因为您的数据显然反映了强烈的趋势和季节性暗示

所有这些建议完全基于您提供的公共数据集。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

so = pd.read_csv('so.csv',parse_dates = ['Date'])

for category in list(set(so['Category'])):
    filtered = so.loc[so['Category'] == category].sort_values(by='Date').set_index('Date')
    ma = filtered.tail(3)['Amount'].mean()
    print "Category:",category,"\t\nNext Predicted Amount(Moving Average Value [Past 3 Months]) :",ma,"\n"


    # To plot the values you can uncomment the below given code.
    # y = list(filtered['Amount'])
    # y.extend([ma])
    # x = np.array(range(len(y)))
    # plt.plot(x, y)
    # plt.show()