机器学习笔记——哑变量处理

简介:

在机器学习的特征处理环节,免不了需要用到类别型特征,这类特征进入模型的方式与一般数值型变量有所不同。

通常根据模型的需要,类别型特征需要进行哑变量处理,即按照特征类别进行编码,一般一个类别为k的特征需要编码为一组k-1【避免引起多重共线性】个衍生哑变量,这样就可以表示特征内部所有的类别(将其中基准比较类设为0,当k-1个哑变量都为0时,即为基准类)。

这种哑变量的编码过程在R和Python中的有成熟的方案,而无需我们手动进行编码,使用成熟的编码方案可以提升特征处理的过程。

R语言哑变量处理:

data(iris)
d14fe6036cb46cea5905f4220cfcdec3a603e27e

这里仍以iris数据集为例,假设这里的Species变量是要进入模型的其中一个自变量,在建模前需要对齐进行哑变量处理。

方法一——dummy包:


library("dummy")
dumy <- dummy(x=iris)

dummy函数会自动检查你输入数据集对象中的字符型/因子型变量,并全量输出字符型/因子型变量的哑变量编码结果。注意这里编码结果是全量输出,即类别型特征的每一个类别都有一个编码后的特征。为了编码引起多重共线性,我们需要舍弃一个(代表比较基准类的特征),这里Species类别变量一共有三个类别:setosa、versicolor 、virginica,各自都有一个对应编码变量,当原始类别变量取对应类别时,则对应类别哑变量位置取值为1,否则为0.

假设这里我们想要对比的基准类是setosa,只需要保留versicolor、virginica对应的编码后变量。那么当versicolor、virginica都取值为0时,则代表取值为setosa。

最终我们要将保留的哑变量与原始数据集合并,以备之后其他特征处理环节需要。

iris_data <- cbind(iris,dumy[,-1])
054a766f7d2a7a0564181a4058510104cab5b595

此时就可以完美的用Species_versicolor、Species_virginica这两个新生成的哑变量来代表原始分类变量Species了。

方法二——model.matrix函数:
R语言内置包stat中有一个model.matrix函数(无需单独加载既可用),它可以处理分类变量的哑变量处理过程,语法非常简单。


dumy <- model.matrix( ~ Species -1, data = iris)
iris_data <- cbind(iris,dumy[,-1])
74286a9c2186fd3c09958109a44c2c7e95c68c79

这里需要在表达式中设定消除截距【公式中减一,否则输出的哑变量带有截距项】,选择的时候同上,只取比较基准类之外的所有哑变量。

方法三——caret包中的dummyVars函数:


library("caret")
dumy <- dummyVars(~gender,data=customers)
trfs <- predict(dumy,newdata=customers)
iris_data <- iris %>% dummyVars(~Species,.) %>% predict(iris) %>% .[,-1] %>% cbind(iris,.)

选择规则同上。

Python中的哑变量处理工具:


from sklearn.preprocessing import Imputer,LabelEncoder,OneHotEncoder
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
import pandas as pd
import numpy as np

方案一——:sk-learn中的OneHotEncoder方法:


iris = load_iris()
data = iris['data']
iris_data = pd.DataFrame(
data = data,
columns = ['sepal_length','sepal_width','petal_length','petal_width']
)
iris_data["Species"] = iris[ 'target']
iris_data["Species"] = iris_data["Species"].map({0:"setosa",1:"versicolor",2:"virginica"})
labelencoder_X = LabelEncoder()
iris_data["Species_code"] = labelencoder_X.fit_transform(iris_data.iloc[:,4])
onehotencoder = OneHotEncoder(categorical_features = [0])
X = onehotencoder.fit_transform(iris_data[["Species_code"]]).toarray()
iris_data = pd.DataFrame(
data = np.hstack((iris_data.values,X[:,0:2])),
columns = iris_data.columns.tolist() + ['Species_versicolor','Species_virginica']
)
28cbc58144d15a01c0f6eae6d3a72cdb2d870f60

方案二——pandas中的get_dummies方法:

可以看到sk-learn中的OneHotEncoder方法必须保证处理的输入值是array,而且只能处理数值型(也就是数字编码之后的类别变量),无法直接处理仔字符型变量。

其实如果能够直接在数据框中处理完这一切就方便很多。


dummy = pd.get_dummies(iris_data.iloc[:,4],prefix = "Species")
iris_data = pd.concat([iris_data,dummy.iloc[:,0:2]], axis= 1)
50316645786f3364be4970e715fc7d0130b492ce

pandas中的get_dummies方法提供了非常简单高效的哑变量处理方案,只有短短的一句代码即可。

回顾一下今天分享的哑变量处理知识点:

R语言:

 ●  方案一——:dummy包的dummy函数

 ●  方法二——:model.matrix函数

 ●  方法三——:caret包中的dummyVars函数

Python:

 ●  方法一——:caret包中的dummyVars函数

 ●  方案二——:pandas中的get_dummies方法


原文发布时间为:2018-10-1
本文作者:杜雨
本文来自云栖社区合作伙伴“ 数据小魔方”,了解相关信息可以关注“ 数据小魔方”。
相关文章
|
8天前
|
索引 机器学习/深度学习 Python
fast.ai 机器学习笔记(二)(3)
fast.ai 机器学习笔记(二)
20 0
fast.ai 机器学习笔记(二)(3)
|
8天前
|
机器学习/深度学习 算法框架/工具 PyTorch
fast.ai 机器学习笔记(三)(2)
fast.ai 机器学习笔记(三)
36 0
fast.ai 机器学习笔记(三)(2)
|
机器学习/深度学习 算法 计算机视觉
fast.ai 机器学习笔记(四)(4)
fast.ai 机器学习笔记(四)
16 0
fast.ai 机器学习笔记(四)(4)
|
8天前
|
机器学习/深度学习 索引 Python
fast.ai 机器学习笔记(四)(2)
fast.ai 机器学习笔记(四)
94 0
fast.ai 机器学习笔记(四)(2)
|
8天前
|
机器学习/深度学习 数据挖掘 Python
fast.ai 机器学习笔记(一)(4)
fast.ai 机器学习笔记(一)
73 1
fast.ai 机器学习笔记(一)(4)
|
8天前
|
机器学习/深度学习 Python 索引
fast.ai 机器学习笔记(一)(1)
fast.ai 机器学习笔记(一)
35 0
fast.ai 机器学习笔记(一)(1)
|
1月前
|
机器学习/深度学习 人工智能 算法
机器学习的魔法(一)从零开始理解吴恩达的精炼笔记
机器学习的魔法(一)从零开始理解吴恩达的精炼笔记
|
3月前
|
机器学习/深度学习 数据可视化 算法
【学习打卡04】可解释机器学习笔记之Grad-CAM
【学习打卡04】可解释机器学习笔记之Grad-CAM
|
3月前
|
机器学习/深度学习 人工智能 文字识别
【学习打卡03】可解释机器学习笔记之CAM类激活热力图
【学习打卡03】可解释机器学习笔记之CAM类激活热力图
|
3月前
|
机器学习/深度学习 存储 数据可视化
【学习打卡02】可解释机器学习笔记之ZFNet
【学习打卡02】可解释机器学习笔记之ZFNet

热门文章

最新文章