数据离散化、数据特征选择(线性相关法/相关因子SRCF算法/最小描述长度MDL算法)

数据离散化分为无监督离散、有监督离散。、
无监督离散常用: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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值