連續屬性離散化處理


原文鏈接:https://zhuanlan.zhihu.com/p/63990922

一、概念

某些分類算法,要求我們對連續性的屬性進行分類處理,離散化的過程主要包括確定分類的個數,並將數據集映射到這些分類中,這里涉及三種分類方法:

1)等寬法

類似於制作頻數分布圖,將屬性分布值分為幾個等分的分布區間;

2)等頻法

將相同數量的記錄放入每個區間;

3)基於聚類的分析方法

將屬性按照K-means算法進行聚類,然后根據聚類的分類,將同一聚類的記錄合並到同一組內。

下面針對:肝氣郁結證型系數數據集進行三種離散化的python實現,數據集下載地址:

https://github.com/zakkitao/database/blob/master/discretization_data.xls​github.com

二、代碼實現

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)

如圖:按照順序排列的三圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM