Data initialization

连续数据离散化方法

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()