连续数据离散化方法
分位数法 使用四分位、五分位、十分位等进行离散。 ✅ 自动适应 ⚠️ 对极端值敏感
距离区间法 等距区间或自定义区间进行离散。 ✅ 灵活,保持原有数据分布
频率区间法 按频率分布排序后离散,数据变为均匀分布。 ✅ 均匀化 ⚠️ 会改变原有数据结构
聚类法 使用 K-Means 将样本进行离散处理。 ✅ 自然分组 ⚠️ 需预设 K 值
卡方法 基于卡方检验找出最佳临近区间并合并。 ✅ 统计最优 ⚠️ 计算开销大
二值化 与阈值比较,大于阈值→固定值(如 1),小于→另一值(如 0),得到只有两个值域的数据集。
时间序列离散 1 2 3 4 5 6 7 8 9 10 11 import pandas as pdfrom sklearn.cluster import KMeansfrom sklearn import preprocessingdate = pd.date_range('03/17/2018' ,'03/17/2023' ) df_t = pd.DataFrame(date, columns=['date' ]) df_t['week' ] = df_t['date' ].apply(lambda x:x.weekday()) df_t.head()
等距离散 1 2 3 4 5 6 7 8 9 10 df = pd.read_csv('https://raw.githubusercontent.com/ffzs/dataset/master/Mall_Customers.csv' , usecols=['Age' , 'Annual Income (k$)' , 'Spending Score (1-100)' ]) df.columns = ['Age' , 'Income' , 'Spend' ] df['Age_discretized' ] = pd.cut(df.Age, 4 , labels=range (4 )) df.groupby('Age_discretized' ).count()
聚类离散 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 data = df['Income' ] data_re = data.reshape((data.index.size, 1 )) km_model = KMeans(n_clusters=4 , random_state=2018 ) result = km_model.fit_predict(data_re) df['Income_discretized' ] = result df.groupby('Income_discretized' ).count()
4分位数离散化 1 2 3 4 df['Spend_discretized' ] = pd.qcut(df.Spend, 4 , labels=['C' , 'B' , 'A' , 'S' ]) df.groupby('Spend_discretized' ).count()
等频率离散 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 将相同数量的记录放在每个区间,保证每个区间的数量基本一致 k =4 data = df.Age w = [1.0 *i/k for i in range (k+1 )] w = data.describe(percentiles = w)[4 :4 +k+1 ] w[0 ] = w[0 ]*(1 -1e-10 ) df['Age2' ] = pd.cut(data, w, labels = range (k)) df.groupby('Age2' ).count()
二值化 1 2 3 4 5 6 7 8 9 10 11 12 data = df['Income' ] binarizer_scaler = preprocessing.Binarizer(threshold=data.mean()) result = binarizer_scaler.fit_transform(data.reshape(-1 , 1 )) df['Income2' ] = result df.groupby('Income2' ).count()