【解决(几乎)任何机器学习问题】:处理分类变量篇(上篇)

这篇文章相当长,您可以添加至收藏夹,以便在后续有空时候悠闲地阅读。
本章因太长所以分为上下篇来上传,文章末尾有下篇链接
很多⼈在处理分类变量时都会遇到很多困难,因此这值得⽤整整⼀章的篇幅来讨论。在本章中,我将 讲述不同类型的分类数据,以及如何处理分类变量问题。
什么是分类变量?
分类变量/特征是指任何特征类型,可分为两⼤类: ⽆序 ,有序
⽆序变量 是指有两个或两个以上类别的变量,这些类别没有任何相关顺序。例如,如果将性别分为两 组,即男性和⼥性,则可将其视为名义变量。
有序变量 则有 "等级 "或类别,并有特定的顺序。例如,⼀个顺序分类变量可以是⼀个具有低、中、⾼ 三个不同等级的特征。顺序很重要。
就定义⽽⾔,我们也可以将分类变量分为 ⼆元变量 ,即只有两个类别的分类变量。有些⼈甚⾄把分类变量称为 " 循环 "变量。周期变量以 "周期 "的形式存在,例如⼀周中的天数: 周⽇、周⼀、周⼆、周三、周四、周五和周六。周六过后,⼜是周⽇。这就是⼀个循环。另⼀个例⼦是⼀天中的⼩时数,如果我们将它们视为类别的话。
分类变量有很多不同的定义,很多⼈也谈到要根据分类变量的类型来处理不同的分类变量。不过,我认为没有必要这样做。所有涉及分类变量的问题都可以⽤同样的⽅法处理。开始之前,我们需要⼀个数据集(⼀如既往)。要了解分类变量,最好的免费数据集之⼀是 Kaggle 分类特征编码挑战赛中的 cat-in-the-dat 。共有两个挑战,我们将使⽤第⼆个挑战的数据,因为它⽐前⼀个版本有更多变量,难度也更⼤。
让我们来看看数据。
数据集由各种分类变量组成: ⽆序, 有序, 循环, ⼆元
在图 1 中,我们只看到所有存在的变量和⽬标变量的⼦集。
这是⼀个⼆元分类问题。
⽬标变量对于我们学习分类变量来说并不⼗分重要,但最终我们将建⽴⼀个端到端模型,因此让我们看看图 2 中的⽬标变量分布。我们看到⽬标是 偏斜 的,因此对于这个⼆元分类问题来说,最好的指标是 ROC 曲线下⾯积(AUC)。我们也可以使⽤精确度和召回率,但 AUC 结合了这两个指标。因此,我们将使⽤ AUC 来评估我们在该数据集上建⽴的模型。

总体⽽⾔,有:
5个⼆元变量
10个⽆序变量
6个有序变量
2个循环变量
1个⽬标变量
让我们来看看数据集中的 ord_2 特征。它包括6个不同的类别:
冰冻
温暖
寒冷
较热
⾮常热
我们必须知道,计算机⽆法理解⽂本数据,因此我们需要将这些类别转换为数字。⼀个简单的⽅法是创建⼀个字典,将这些值映射为从 0到 N-1 的数字,其中 N 是给定特征中类别的总数。
mapping = {
"Freezing" : 0 ,
"Warm" : 1 ,
"Cold" : 2 ,
"Boiling Hot" : 3 ,
"Hot" : 4 ,
"Lava Hot" : 5
}

 现在,我们可以读取数据集,并轻松地将这些类别转换为数字。

import pandas as pd
df = pd.read_csv(" . /input/cat_train.csv")
df.loc[:, "*ord_2*"] = df.*ord_2*.map(mapping)

映射前的数值计数:

df . * ord_2 * . value_counts ()
Freezing 142726
Warm 124239
Cold 97822
Boiling Hot 84790
Hot 67508
Lava Hot 64840
Name : * ord_2 * , dtype : int64

 映射后的数值计数:

0.0 142726
1.0 124239
2.0 97822
3.0 84790
4.0 67508
5.0 64840
Name : * ord_2 * , dtype : int64
这种分类变量的编码⽅式被称为标签编码(Label Encoding)我们将每个类别编码为⼀个数字标签。我们也可以使⽤ scikit-learn 中的 LabelEncoder 进⾏编码。

import pandas as pd
from sklearn import preprocessing
df = pd.read_csv(" . /input/cat_train.csv")
df.loc[:, "*ord_2*"] = df.*ord_2*.fillna("NONE")
lbl_enc = preprocessing.LabelEncoder()
df.loc[:, "*ord_2*"] = lbl_enc.fit_transform(df.*ord_2*.values)
你会看到我使⽤了 pandas 的 fillna。原因是 scikit-learn 的 LabelEncoder ⽆法处理 NaN 值,⽽
ord_2 列中有 NaN 值。
我们可以在许多基于树的模型中直接使⽤它:
决策树
随机森林
提升树
或任何⼀种提升树模型
XGBoost
GBM
LightGBM
这种编码⽅式不能⽤于线性模型、⽀持向量机或神经⽹络,因为它们希望数据是标准化的。
对于这些类型的模型,我们可以对数据进⾏⼆值化(binarize)处理。

这只是将类别转换为数字,然后再转换为⼆值化表⽰。这样,我们就把⼀个特征分成了三个(在本例中)特征(或列)。如果我们有更多的类别,最终可能会分成更多的列。
如果我们⽤稀疏格式存储⼤量⼆值化变量,就可以轻松地存储这些变量。稀疏格式不过是⼀种在内存中存储数据的表⽰或⽅式,在这种格式中,你并不存储所有的值,⽽只存储重要的值。在上述⼆进制变量的情况中,最重要的就是有 1 的地⽅。
很难想象这样的格式,但举个例⼦就会明⽩。
假设上⾯的数据帧中只有⼀个特征:
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

X.AI666

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

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

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

打赏作者

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

抵扣说明:

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

余额充值