面对无法投入模型训练的object类型数据在头疼,快来使用我的丝滑小连招

面对无法投入模型训练的object类型数据在头疼,快来使用我的丝滑小连招

 前言

丝滑小连招

tip1- get_dummies完美one-hot(str->int)

tip2 - rename_dims解决重名问题!

 tip3 - insert且drop!​​​​​​​


 前言

        我们先来看一个DataFrame的数据结构,我们可以看到他是由以下几个属性组成的:

● ‘marital’ —— 婚姻状态(类别:结婚、离异、单身)

● ‘‘educatiom——受教育等级(类别:未知、初等、中等、高等)

● ‘‘housing’——有没有房贷(类别:有,无)

● ‘loan’——有没有个人贷款(类别:有,无)

● ‘ ‘y’——有没有同意签署定期存款(类别:有,无)

接下来我将打印他们的信息:

 从Dtype这一栏可以看到他们全部都是object类型,这其实就是说着几个属性下的值都是str字符串类型的。

众所周知,但我们训练模型的时候,我们是不能将字符串类型的数据喂入模型fit的,但遇到数据是字符串类型的情况又不可避免,这个时候我就要介绍我百般摸索下总结出的一套连招啦:get_dummies + rename_dims + drop + insert。这套连招为什么神奇呢?请君往下看:

丝滑小连招

tip1- get_dummies完美one-hot(str->int)

        这个get_dummies有什么用呢?他在我们的丝滑小连招之下又扮演者什么样的角色呢?让我们来揭开他的面纱吧!

以表敬意,我们以education这个属性为例子,毕竟教育教育,教育最重要嘛,先输入以下一行代码:

In [unknow]:

pd.get_dummies(df['education'])

 Out [unkonw]:

 是不是超级神奇,还记得这个属性原来的数据嘛。

没错,如您所想:本来只有一列的属性因为她的值有4个所有分成了4列!然后,例如序号为0 的这个数据的值是teritary, 那么在名为teritary的这一列和序号为0的这一行填上数字1!其余为数字0!这样就实现了one-hot编码,且可以投入模型进行fit训练拟合。

tip2 - rename_dims解决重名问题!

但我们会发现一个问题,很大的问题:

例如这样的数据,都是yes,no那么岂不是重名啦?那我们该怎么办呢?简单!只需要dim_name+'_'+dim_value就ok啦!举个栗子:housing的yes变为housing_yes,而loan的yes变为loan_yes,这不就妥妥搞定嘛!用代码这样子做:

Input [unkonw2]

# Step1、得到one-hot编码后的数据(dataframe类型)
        new_dim = pd.get_dummies(df[key])
        # Step2、使用rename函数重命名
        new_columns = list(new_dim.columns)
        rename_columns = {}
        for col in new_columns:
            rename_columns[col] = key + '_' + col
        new_dim.rename(columns=rename_columns, inplace=True)

Output [unkow2]

 tip3 - insert且drop!

我们可以看到事情已经发展到这一步了,已经没什么可说的了!

我们只需要抛弃掉旧情郎,迎接新美男就好了!

这样做:

 # Step3、merge new dim to DataSet and drop the old dim
        df = df.drop(columns=key)
        for dim in new_dim:
            df[dim] = new_dim[dim].tolist()

但实际上其实并没有这么简单 ,比如有一个很大的问题就是,大多数时候我们的数据是这样的:

没错,数据类型混杂,所以我们不可能简单的遍历整个DataFrame因为非object类型的属性数据是不用one-hot的,那么我们怎么办呢?其实都不用担心我已经全部解决了:DataFrame有一个函数select_dtypes里面有一个include参数可以选择只要数据类型为object的属性,我们使用它,并且使用columns的函数就可以获取所有object类型的属性名了,然后只遍历这些个属性名,再进行丝滑小连招那么我们就打工搞成了!

 最后,我把所有的步骤和这个意外情况的解决办法全部写入一个函数,大家只需要简单的传入一个DataFrame类型的数据,他将帮你自动完成数据的处理,最后还给你一个理想中的数据! 

def one_hot_and_merge_objectDim(df):
    # 只处理object类型的数据
    object_type_dims = list(df.select_dtypes(include='object').columns)
    print(object_type_dims)
    for key in object_type_dims:
        print(key + ' is done.')
        # Step1、get new dim(DataFrame)
        new_dim = pd.get_dummies(df[key])
        # Step2、rename new dim 
        new_columns = list(new_dim.columns)
        rename_columns = {}
        for col in new_columns:
            rename_columns[col] = key + '_' + col
        new_dim.rename(columns=rename_columns, inplace=True)
        # Step3、merge new dim to DataSet and drop the old dim
        df = df.drop(columns=key)
        for dim in new_dim:
            df[dim] = new_dim[dim].tolist()
        print(df.columns)
    return df

完毕,是不是超级轻松呢? 

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大气层煮月亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值