数据预处理

数据预处理,第1张

数据预处理 1.非数值型数据处理

机器学习建模的时候处理的数据都是数值类型,然而实际生活中我们通常获取的数据往往会包含非数值型的数据,最常见的就是文本类型的数据。例如:“男和女”,处理时可以用查找、替换的思路,将文本转换为数值1和0。但是如果类别很多,不止有2个怎么办呢?有两个方法————Get_dummies 哑变量处理和 LabelEncoding 编号处理。

1.1Get_dummies哑变量处理

哑变量又叫虚拟变量,通常取值0和1。

# 例子:
import pandas as pd
df = pd.DataFrame({'客户编号':[1, 2, 3],
                  '性别':['男','女','男']})
# 将性别列变为哑变量
df = pd.get_dummies(df,columns=['性别'])
df


“性别"已经变为"性别_女”,“性别_男”,数字1表示符合列名,数字0表示不符合列名。例如,第二行的客户为女性,所以在"性别_女"列中的数字是1,在"性别_男"列中的数字是0。

虽然现在已经将文本类型的数据转化为数字,但是"性别_女"和"性别_男"这两列存在多重共线性,也就是当你知道其中一列的内容,另一列的内容也就知道了,用公式来表示就是:“性别_女”=1-“性别_男”;多重共线性会带来很多问题,所以我们要删去其中一列。

# 删去一列
df = df.drop(columns='性别_女')
# 重命名
df = df.rename(columns={'性别_男':'性别'})
df


复杂点的例子:

# 复杂点的例子:
import pandas as pd
df = pd.DataFrame({'房子编号':[1, 2, 3, 4, 5],
                  '朝向':['东', '南', '西', '北', '南']})
df = pd.get_dummies(df, columns=['朝向'])
df

上面数据也存在多重共线性,即知道3个朝向的数字就能判断第4个朝向的数字是0还是1,所以可以删去1个哑变量,假设删去"朝向_西"

df = df.drop(columns=['朝向_西'])
df


构造了哑变量容易产生高维数据,所以通常和 PCA(主成分分析)一起使用,也就是先构造哑变量产生高维数据然后采用PCA进行降维。

1.2LabelEncoding编号处理

除了使用 get_dummies()函数进行非数值类型数据处理外,还可以使用 LabelEncoding 进行编号处理,也就是使用 LabelEncoding()函数将文本类型的数据转换为数字。

# 例子:
df = pd.DataFrame({'编号':[1, 2, 3, 4, 5],
                  '城市':['北京', '上海', '广州', '深圳', '北京']})
df

# 将"城市"列文本转化为不同的数字
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
label = le.fit_transform(df['城市'])
label

# 可以看到 北京 变为 1, 上海 变为 0, 广州 变为 2,深圳 变为 3
df['城市'] = label
df


上面使用 LabelEncoding处理后产生了一个奇怪的现象,就是上海和广州的平均值是北京,然而这个是没有啥现实意义的,这也是LabelEncoding的一个缺点,可能产生一些没有意义的关系。不过对于 树模型(如决策树、随机森林、XGBoost等集成算法)能很好处理这种转换,所以对于树模型来说这并不会影响结果。

LabelEncoding()函数生成的数字是随机的,如果想按照特定的内容进行替换,可以使用replace()函数,这两种处理方式对于建模来说并不会有太大影响。

# 例子:
df = pd.DataFrame({'编号':[1, 2, 3, 4, 5],
                  '城市':['北京', '上海', '广州', '深圳', '北京']})
df

# 先看看各个值出现的次数
df['城市'].value_counts()

# 用replace()进行替换
df['城市'] = df['城市'].replace({'北京': 0, '上海': 1, '广州': 2, '深圳': 3})
df


LabelEncoding()函数是对文本内容随机编号,而replace()函数可以将文本内容替换成自己定义的值,不过当分类较多时,还需要用 value_counts()函数获取各类的名称,而且步骤稍微繁琐。

总的来说,Get_dummies的优点是它的值只有0和1,缺点是类别的数量很多时,特征维度会很高,需要进行降维。如果数量不多,可以优先考虑使用Get_dummies,其次考虑使用LabelEncoding或者replace函数;但是如果是基于树模型的机器学习模型,用LabelEncoding也没有太大关系。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/715092.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存