1、離散化方法——等寬法
將數據的值域分成具有相同寬度的區間,區間的個數由數據本身的特點決定或者用戶指定,與制作頻率分布表類似。
pandas 提供了 cut 函數,可以進行連續型數據的等寬離散化,其基礎語法格式如下。
pandas.cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False)
使用等寬法離散化的缺陷為:等寬法離散化對數據分布具有較高要求,若數據分布不均勻,那么各個類的數目也會變得非常不均勻,有些區間包含許多數據,而另外一些區間的數據極少,這會嚴重損壞所建立的模型。
離散化代碼實現:
1 # 2、將連續的小數數據---->區間數據(類別數據、離散數據) ---(離散化) 2 # 將連續的小數數據---拆分成不同的區間 3 # cut --拆分 4 # detail ---amounts單價數據 ---可以理解為連續的小數數據 5 # 將amounts進行拆分---離散化 6 # 加載detail數據 7 detail = pd.read_excel('./meal_order_detail.xlsx') 8 print('detail:\n', detail) 9 print('detail的列索引:\n', detail.columns) 10 11 # x : 需要離散化的數據 12 # bins : 分組的組數,分組節點 13 # include_lowest :默認為False ,如果讓系統默認拆分,包含最小值 14 # 如果自定義划分分組節點---不包含最小值,需要將include_lowest =True 15 # res = pd.cut(x=detail.loc[:, 'amounts'], 16 # bins=5, 17 # include_lowest=True) 18 # # 原來具體的數值---->各個區間來代替原來的具體的值 19 # print('res:\n', res) 20 # print('*' * 100) 21 # 22 # # 可以同values_counts來查看分組之后,各個區間內的數量 23 # print(pd.value_counts(res)) 24 25 26 # 自定義分組 27 # (1) 自己直接指定分組節點 28 # bins = [1, 40, 80, 120, 160, 180] 29 # res = pd.cut(x=detail.loc[:, 'amounts'], 30 # bins=bins, 31 # include_lowest=True) 32 # print('res:\n',res) 33 # print('*' * 100) 34 # # 可以同values_counts來查看分組之后,各個區間內的數量 35 # print(pd.value_counts(res)) 36 # # (2) 等寬分組 37 # # a、確定分組組數 38 # group_num = 5 39 # # b、確定間距 40 # # 確定最大值 41 # max_amounts = detail.loc[:, 'amounts'].max() 42 # # 確定最小值 43 # min_amounts = detail.loc[:, 'amounts'].min() 44 # # 確定間距 45 # width = int(np.ceil((max_amounts - min_amounts) / group_num)) 46 # # c、確定分組節點 47 # bins = np.arange(min_amounts, max_amounts + width, width) 48 # 49 # res = pd.cut(x=detail.loc[:, 'amounts'], 50 # bins=bins, 51 # include_lowest=True) 52 # print('res:\n', res) 53 # print('*' * 100) 54 # # 可以同values_counts來查看分組之后,各個區間內的數量 55 # print(pd.value_counts(res))
2、離散化方法——等頻法
cut 函數雖然不能夠直接實現等頻離散化,但是可以通過定義將相同數量的記錄放進每個區間。
等頻法離散化的方法相比較於等寬法離散化而言,避免了類分布不均勻的問題,但同時卻也有可能將數值非常接近的兩個值分到不同的區間以滿足每個區間中固定的數據個數。
以訂單詳情為例,將 amounts 特征離散到不同的區間。
離散化代碼實現:
1 # (3) 等頻分組 2 # 因為在分組的時候,使用等寬分組的時候,可能出現某個區間內無數據 3 # 使用等頻分組--->在各個區間內的數量基本一致 4 # 分位數計算---quantile 5 # a、確定分組組數 6 group_num = 5 7 # b、確定bins 8 bins = detail.loc[:, 'amounts'].quantile(q=np.arange(0, 1 + 1 / group_num, 1 / group_num)) 9 10 print('bins:\n', bins) 11 12 res = pd.cut(x=detail.loc[:, 'amounts'], 13 bins=bins, 14 include_lowest=True) 15 print('res:\n', res) 16 print('*' * 100) 17 # 可以同values_counts來查看分組之后,各個區間內的數量 18 print(pd.value_counts(res))
也可以使用 pandas.qcut 來進行等頻分組。
