数据离散化分为无监督离散、有监督离散。、
无监督离散常用:pandas的cut、qcut
有监督离散常用:信息增益、MDL、卡方()
# ### 特征离散化
# 决策树ID3算法一般是基于离散特征的,本例中存在很多连续的数值特征,例如队伍金币。直接应用该算法每个值当作一个该特征的一个取值可能造成严重的过拟合,因此需要对特征进行离散化,即将一定范围内的值映射成一个值,例如对用户年龄特征,将0-10映射到0,11-18映射到1,19-25映射到2,25-30映射到3,等等类似,然后在决策树构建时使用映射后的值计算信息增益。
#
# ***本小节要求实现特征离散化,请补全相关代码***
# In[25]:
import pandas as pd
import numpy as np
from collections import Counter, defaultdict
from sklearn.preprocessing import KBinsDiscretizer #数据离散化
import entropy_based_binning as ebb #数据离散化
from mdlp.discretization import MDLP
discrete_df = df.copy()
def discrete_fea(df, discrete_df, dis_thre, method):
'''
离散化每一列特征,即discrete_df[c] = ...
dis_thre是对于有些特征本身取值就很少,可以跳过的阈值
method是使用等区间(cut)或等密度(qcut)划分
'''
#global df, discrete_df
for c in df.columns[1:]:#除去y值的lable的那一列,剩下的x列(feature列)
# 些特征本身取值就很少,可以跳过
if len(set(discrete_df[c])) <= dis_thre:
continue
elif method=='cut':
# 注释部分是通过划分两侧最大/小值进行分割,效果类似
# division=[min(df[df['blueWins'] > 0][c])-0.5, max(df[df['blueWins'] > 0][c]+0.5),\
# min(df[df['blueWins'] < 1][c])-0.5, max(df[df['blueWins'] < 1][c])+0.5]
# division = sorted(division)
# division.append((division[2]-division[1])//3+division[1])
# division.append(division[2]-(division[2]-division[1])//3)
# discrete_df[c] = pd.cut(df[c], sorted(division))
discrete_df[c] = pd.cut(df[c], dis_thre, labels=[i for i in range(dis_thre)])
elif method=='qcut':
discrete_df[c] = pd.qcut(df[c], dis_thre, precision=0, labels=False, duplicates='drop')
elif method=='kmeans':
est = KBinsDiscretizer(n_bins=dis_thre, encode='ordinal', strategy='kmeans')
discrete_df[c] = est.fit_transform(np.array(df[c]).reshape(1, -1)).reshape(-1)
#有监督离散化
elif method=='entropy':#按信息增益,决策树会使得之后计算信息增益为0
discrete_df[c] = ebb.bin_sequence(df[c], nbins=dis_thre)
elif method=='MDLP':#选择具有最大信息增益的阈值离散连续属性的二分法是:最小描述长度法(MDL)
transform =MDLP()
discrete_df[c] = transform.fit(np.array(df[c]).reshape(1, -1), np.array(df.iloc[1,1]).reshape(-1))
return df, discrete_df
df, discrete_df=discrete_fea(df, discrete_df, dis_thre=10, method = 'qcut')
参考:https://zhuanlan.zhihu.com/p/543479865
有关文章:
https://blog.csdn.net/qq_17320163/article/details/106136203