數據挖掘中有些算法,特別是分類算法,只能在離散型數據上進行分析,然而大部分數據集常常是連續值和離散值並存的。因此,爲了使這類算法發揮作用,需要對數據集中連續型屬性進行離散化操作。
那麼,如何對連續型屬性離散化呢?常見的有等寬分箱法,等頻分箱法:
等寬分箱法的思想是,將數據均勻劃分成n等份,每份的間距相等。
等頻分箱法的思想是,將觀察點均勻分成n等份,每份的觀察點數相同。
在對數據離散化前,需要先處理異常點敏感問題,即我們需要首先設定一個閾值將異常數據移除。有兩種思路:
1.設定閾值爲90%,將數據從小到大排序,移除全部數據最小的5%和最大的5%數據
2. 設定閾值爲90%,將數據從小到大排序,然後對所有數據求和,並計算每個數據佔總和的比例,移除佔比10%的數據
在這裏,我們實現的方法是等寬分箱法,針對連續型數據集,代碼比較簡單基礎,在此拋磚引玉,大家可以在代碼的基礎上增添自己需要的功能。
def dataDiscretize(dataSet):
m,n = shape(dataSet) #獲取數據集行列(樣本數和特徵數)
disMat = tile([0],shape(dataSet)) #初始化離散化數據集
for i in range(n-1): #由於最後一列爲類別,因此遍歷前n-1列,即遍歷特徵列
x = [l[i] for l in dataSet] #獲取第i+1特徵向量
y = pd.cut(x,10,labels=[0,1,2,3,4,5,6,7,8,9]) #調用cut函數,將特徵離散化爲10類,可根據自己需求更改離散化種類
for k in range(n): #將離散化值傳入離散化數據集
disMat[k][i] = y[k]
return disMat