使用python sklearn下的k_means聚類分析演算法時遇到的問題
阿新 • • 發佈:2019-01-10
#-*- coding: utf-8 -*-
#使用K-Means演算法聚類消費行為特徵資料
import pandas as pd
#引數初始化
inputfile = '../data/consumption_data.xls' #銷量及其他屬性資料
outputfile = '../tmp/data_type.xls' #儲存結果的檔名
k = 3 #聚類的類別
iteration = 500 #聚類最大迴圈次數
data = pd.read_excel(inputfile, index_col = 'Id') #讀取資料
data_zs = 1.0*(data - data.mean())/data.std() #資料標準化
from sklearn.cluster import KMeans
model = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration) #分為k類,併發數4
model.fit(data_zs) #開始聚類
#簡單列印結果
r1 = pd.Series(model.labels_).value_counts() #統計各個類別的數目
r2 = pd.DataFrame(model.cluster_centers_) #找出聚類中心
r = pd.concat([r2, r1], axis = 1) #橫向連線(0是縱向),得到聚類中心對應的類別下的數目
r.columns = list(data.columns) + [u'類別數目'] #重命名錶頭
print(r)
#詳細輸出原始資料及其類別
r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1) #詳細輸出每個樣本對應的類別
r.columns = list(data.columns) + [u'聚類類別'] #重命名錶頭
r.to_excel(outputfile) #儲存結果
def density_plot(data): #自定義作圖函式
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號
p = data.plot(kind='kde', linewidth = 2, subplots = True, sharex = False)
[p[i].set_ylabel(u'密度') for i in range(k)]
plt.legend()
return plt
pic_output = '../tmp/pd_' #概率密度圖檔名字首
for i in range(k):
density_plot(data[r[u'聚類類別']==i]).savefig(u'%s%s.png' %(pic_output, i))
這是一個很常見的案列的程式碼,但是我在跑的時候瘋狂報錯,錯誤資訊如下
ImportError: [joblib] Attempting to do parallel computing without protecting your import on a system that does not support forking. To use parallel-computing in a script, you must protect your main loop using "if __name__ == '__main__'". Please see the joblib documentation on Parallel for more information
大概就是一個平行計算的錯誤,因為案例裡建立模型時,定義了n_jobs=4,所以報錯,但是為什麼會產生這個錯誤我不太清楚,可能是在python3.6版本里原先的庫有的地方不相容吧。
解決方案:
將n_jobs=4刪掉就好