使用机器学习对数据集进行聚类
Clustering of dataset using machine learning
我有一个重复的字符串数据集如下。
[Building Repairs & Maintenance,Books-CDs-Audio-Video,Stationery,Other
Services,Building Repairs & Maintenance]
我想使用上述数据集将相同的值聚类到一个聚类中。
输出应该是
[Building Repairs & Maintenance,Building Repairs &
Maintenance,...][Other Services,Other Services,...]
不确定您到底想要什么以及它与机器学习有何关系。但是您可以在 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:
你是说在列表中找到相似的文本吗?
[Books-Audio-CD、音频、教材、建筑维修保养、维修保养、维修]
给出以下输出
[Books-Audio-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
基于 public 数据集的简单移动平均线实现。为此,我将值保存在临时文件名 so.csv.
中
首先,查看您的数据,我认为您根本不需要对类别使用聚类技术,因为所有特定类别都完全相同。您可以轻松地过滤掉或使用分组来获取同一类别的行。
其次,由于我们不再关心聚类,因此不需要对不同字符串进行加权平均。
尽管此方法给出了每个类别的预测值。我认为像 arima 这样更强大的方法更适合你的情况,因为你的大部分数据清楚地反映了趋势和季节性的强烈暗示
所有这些建议完全基于您提供的 public 数据集。
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()
我有一个重复的字符串数据集如下。
[Building Repairs & Maintenance,Books-CDs-Audio-Video,Stationery,Other Services,Building Repairs & Maintenance]
我想使用上述数据集将相同的值聚类到一个聚类中。 输出应该是
[Building Repairs & Maintenance,Building Repairs & Maintenance,...][Other Services,Other Services,...]
不确定您到底想要什么以及它与机器学习有何关系。但是您可以在 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:
你是说在列表中找到相似的文本吗? [Books-Audio-CD、音频、教材、建筑维修保养、维修保养、维修]
给出以下输出
[Books-Audio-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
基于 public 数据集的简单移动平均线实现。为此,我将值保存在临时文件名 so.csv.
中首先,查看您的数据,我认为您根本不需要对类别使用聚类技术,因为所有特定类别都完全相同。您可以轻松地过滤掉或使用分组来获取同一类别的行。
其次,由于我们不再关心聚类,因此不需要对不同字符串进行加权平均。
尽管此方法给出了每个类别的预测值。我认为像 arima 这样更强大的方法更适合你的情况,因为你的大部分数据清楚地反映了趋势和季节性的强烈暗示
所有这些建议完全基于您提供的 public 数据集。
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()