編程環(huán)境:
anaconda + Spyder
Win10 + python3.6
完整代碼及數(shù)據(jù)已經(jīng)更新至GitHub,歡迎fork~GitHub鏈接
聲明:創(chuàng)作不易,未經(jīng)授權(quán)不得復(fù)制轉(zhuǎn)載
statement:No reprinting without authorization
內(nèi)容概述:
- 測(cè)試sklearn中以下聚類(lèi)算法在tweets數(shù)據(jù)集上的聚類(lèi)效果
- 使用NMI(Normalized Mutual Information)作為評(píng)價(jià)指標(biāo)
- sklearn聚類(lèi)資料鏈接
一、sklearn提供的各種聚類(lèi)方法簡(jiǎn)介:

image.png
其中各種方法的原理實(shí)現(xiàn)可以查看Sklearn的官方文檔,不再贅訴。鏈接如下:
https://scikit-learn.org/stable/modules/clustering.html#
二、對(duì)tweet數(shù)據(jù)集的簡(jiǎn)單處理:
根據(jù)每條推特都有很整齊的格式,可以簡(jiǎn)單處理出需要的tweet內(nèi)容文字和true_label,具體實(shí)現(xiàn)函數(shù)如下:
處理后得到
- ground_truth #每條推特的正確聚類(lèi)標(biāo)簽[37,5,8,58......]
- tweets_list #處理過(guò)的推特內(nèi)容列表[推特內(nèi)容1,內(nèi)容2,......]。
def token(line):
index = line.index(",")
Text = line[10:index-1]
cluNumber = line[index+12:-2]
return (Text,cluNumber)
def tweets_process():
global ground_truth,tweets_list
print("tweets processing...")
f = open(r"C:\Users\93568\Documents\GitHub\DataMining\work5Clustering with sklearn\data\Homework5Tweets.txt")
lines = f.readlines()#讀取全部?jī)?nèi)容
for line in lines:
(text,cluNumber) = token(line)
number = int(cluNumber)
tweets_list.append(text)
ground_truth.append(number)
三、將tweet表示為tfidf的矩陣:
利用python提供的特征提取的工具包:
from sklearn.feature_extraction.text import TfidfVectorizer
def get_tfidf_matrix():
global tfidf_matrix,tweets_list
tfidf_vectorizer = TfidfVectorizer(tokenizer=token_split, lowercase=True)
'''
tokenizer: 指定分詞函數(shù)
lowercase: 在分詞之前將所有的文本轉(zhuǎn)換成小寫(xiě),因?yàn)樯婕暗街形奈谋咎幚恚? 所以最好是False,本tweet數(shù)據(jù)集已經(jīng)全是小寫(xiě)可設(shè)為T(mén)rue
'''
#tfidf_matrix = tfidf_vectorizer.fit_transform(tweets_list)
#上面一行代碼等價(jià)于下面兩行代碼
tfidf_vectorizer.fit(tweets_list)
tfidf_matrix = tfidf_vectorizer.transform(tweets_list)
# joblib.dump(tfidf_matrix, 'tfidf_matrix.pkl')
# tfidf_matrix = joblib.load('tfidf_matrix.pkl')
四、運(yùn)行結(jié)果及一些問(wèn)題:
(1)KMeans:
max_iter=200, n_init=20, init='k-means++':

#####
(2) AffinityPropagation:

image.png
(3) MeanShift:
開(kāi)始輸入相同的tfidf矩陣時(shí)出現(xiàn)
TypeError: A sparse matrix was passed, but dense data is required. Use X.toarray() to convert to a dense numpy array.(使用toarray()/todense()后結(jié)果如下:)

image.png
可能是密度質(zhì)心的方法對(duì)于高維數(shù)據(jù)結(jié)果很差,輸出的標(biāo)簽結(jié)果都是0:

image.png
(4)DBSCN:
沒(méi)有進(jìn)行調(diào)參,默認(rèn)參數(shù)運(yùn)行結(jié)果如下:

image.png
(5)SpectralClustering、ward hierarchical clustering、AgglomerativeClustering、Birch:

image.png