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

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

[Building Repairs & Maintenance,Books-CDs-Audio-Video,Stationery,Other Services,Building Repairs & Maintenance]

我想使用上述数据集将相同的值聚集到一个簇中。输出应为

[Building Repairs & Maintenance,Building Repairs & Maintenance,…][Other Services,Other Services,…]


回答:

我不确定您确切想要什么,以及这与机器学习有什么关系。但您可以在不使用机器学习或kmeans聚类的情况下,通过Python轻松实现上述结果。

以下是实现此目的的示例代码:

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]*duplicate_count[key]

如果您能进一步详细说明您的问题以及它与机器学习的关系,那就太好了。

编辑 #1:

您是在说要在列表中查找相似的文本吗,例如[Books-Audio-CD, Audio, Textbook, Building Repair and Maintenance, Repair and Maintenance, Repairing]

给出以下输出

[Books-Audio-CD, Audio, Textbook][Building Repair and Maintenance, Apartment Services, Repairing]

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

编辑 #2:

对于词袋方法,您可以参考以下代码。然而,这只是我刚刚完成的一个基本实现,需要进行修改以添加必要的功能,如词干提取、停用词删除以及使用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)
#假设聚类数为2的K-means的简单初始化。
km = KMeans(n_clusters=2, init='random', n_init=1)
km.fit(train_fit)
print km.labels_

编辑 #3

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

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

其次,由于我们不再关注聚类,因此没有必要为不同的字符串使用加权平均值。

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

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

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,"\t\n下一个预测金额(移动平均值 [过去三个月]) :",ma,"\n"
    # 要绘制值,您可以取消注释下面的代码。
    # y = list(filtered['Amount'])
    # y.extend([ma])
    # x = np.array(range(len(y)))
    # plt.plot(x, y)
    # plt.show()

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注