原文鏈接:https://zhuanlan.zhihu.com/p/63990922
一、概念
某些分類算法,要求我們對連續性的屬性進行分類處理,離散化的過程主要包括確定分類的個數,並將數據集映射到這些分類中,這里涉及三種分類方法:
1)等寬法
類似於制作頻數分布圖,將屬性分布值分為幾個等分的分布區間;
2)等頻法
將相同數量的記錄放入每個區間;
3)基於聚類的分析方法
將屬性按照K-means算法進行聚類,然后根據聚類的分類,將同一聚類的記錄合並到同一組內。
下面針對:肝氣郁結證型系數數據集進行三種離散化的python實現,數據集下載地址:
https://github.com/zakkitao/database/blob/master/discretization_data.xls
二、代碼實現
1)導入數據集以及各種需要的庫
import pandas as pd import matplotlib.pyplot as plt data = 'chapter4/demo/data/discretization_data.xls' data = pd.read_excel(data) import numpy as np
2)等寬離散法
data = data[u'肝氣郁結證型系數'].copy() #將數據集轉化為集合 k = 4 #k值為組數 d1 = pd.cut(data,k,labels=range(k)) #將集合分組
3)等頻離散法
w = [i/k for i in range(k+1)] #計算百分比 w = data.describe(percentiles=w)[4:9] #計算各個百分位數 d2 = pd.cut(data,w,labels=range(k)) #將集合分組
4)k-means分組
from sklearn.cluster import KMeans #導入kmeans kmodel = KMeans(n_clusters = k) #確定族數 kmodel.fit(data.values.reshape(len(data),1)) #訓練數據集 c = pd.DataFrame(np.sort(kmodel.cluster_centers_)) #確定中心並排序 w = c.rolling(2).mean().iloc[1:] #取移動平均值 w = [0]+list(w[0])+[data.max()] #加上最大最小值作為邊界值 w = list(np.sort(w)) #再次排序 d3 = pd.cut(data,w,labels = range(k))
5)定義畫圖函數並生成圖像
def classified_plot(d): plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.figure(figsize=(7,5)) for j in range(0, k): plt.plot(data[d==j], [i for i in d[d==j]], 'o') classified_plot(d1) classified_plot(d2) classified_plot(d3)
如圖:按照順序排列的三圖