面对无法投入模型训练的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。这套连招为什么神奇呢?请君往下看:
这个get_dummies有什么用呢?他在我们的丝滑小连招之下又扮演者什么样的角色呢?让我们来揭开他的面纱吧!
以表敬意,我们以education这个属性为例子,毕竟教育教育,教育最重要嘛,先输入以下一行代码:
In [unknow]:
pd.get_dummies(df['education'])
Out [unkonw]:
是不是超级神奇,还记得这个属性原来的数据嘛。
没错,如您所想:本来只有一列的属性因为她的值有4个所有分成了4列!然后,例如序号为0 的这个数据的值是teritary, 那么在名为teritary的这一列和序号为0的这一行填上数字1!其余为数字0!这样就实现了one-hot编码,且可以投入模型进行fit训练拟合。
但我们会发现一个问题,很大的问题:
例如这样的数据,都是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]
我们可以看到事情已经发展到这一步了,已经没什么可说的了!
我们只需要抛弃掉旧情郎,迎接新美男就好了!
这样做:
# 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
完毕,是不是超级轻松呢?