连续数据离散化方法 1.分位数法:使用四分位、五分位、十分位等进行离散 2.距离区间法:等距区间或自定义区间进行离散,有点是灵活,保持原有数据分布 3.频率区间法:根据数据的频率分布进行排序,然后按照频率进行离散,好处是数据变为均匀分布,但是会更改原有的数据结构 4.聚类法:使用k-means将样本进行离散处理 5.卡方:通过使用基于卡方的离散方法,找出数据的最佳临近区间并合并,形成较大的区间 6.二值化:数据跟阈值比较,大于阈值设置为某一固定值(例如1),小于设置为另一值(例如0),然后得到一个只拥有两个值域的二值化数据集。
时间序列离散 1 2 3 4 5 6 7 8 9 10 11 import pandas as pd from sklearn.cluster import KMeans from sklearn import preprocessing #######时间序列离散####### # 创造时间数据 date = 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)) # 创建k-means模型并指定聚类数量 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 #####使用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)] # 使用describe获取频率区域的分界点 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()