机器学习

数据预处理:标称型特征的编码和缺失值处理

2019-09-20  本文已影响0人  叫我老村长

数据预处理:标称型特征的编码和缺失值处理

标称型特征编码(Encoding categorical feature)

有些情况下,某些特征的取值不是连续的数值,而是离散的标称变量(categorical)。

比如一个人的特征描述可能是下面的或几种:

features ['male', 'female'], ['from Europe', 'from US', 'from Asia'], ['use Firefox', 'use Chorme', 'use Safari', 'Use IE']。

这样的特征可以被有效的编码为整型特征值(interger number)。

['male', 'US', 'use IE']  -->>  [0,1,3]
['femel', 'Asia', 'use Chrome']  -->> [1,2,1]

但是这些整数型的特征向量是无法直接被sklearn的学习器使用的,因为学习器希望输入的是连续变化的量或者可以比较大小的量,但是上述特征里面的数字大小的比较是没有意义的。

一种变换标称型特征(categorical features)的方法是使用one-of-K或者叫one-hot encoding,在类OneHotEncoder里面就已经实现了。这个编码器将每一个标称型特征编码成一个m维二值特征,其中每一个样本特征向量就只有一个位置是1,其余位置全是0。

enc = preprocessing.OneHotEncoder()
enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])
image
enc.transform([[0,1,3]]).toarray()
image

第一列的取值有两个,使用两个数字编码;第二列取值有单个,使用三个数字编码;第三列取值有4个,使用四个数字编码。一共使用九个数字进行编码。

默认情况下,每个特征分量需要多少个值是从数据集中自动推断出来的。我们还可以通过参数n_values进行显式的指定。上面的数据集中,有两个性别,三个可能的地方以及四个浏览器。然后fit之后在对每一个样本进行变换。结果显示,前两个值编码了性别,接下来的三个值编码了地方,最后的四个值编码了浏览器。

注意:如果训练数据中某个标称型特征分量的取值没有完全覆盖其所有可能的情况,则必须给OneHotEncoder指定每一个标称型特征分量的取值个数,设置参数:n_values。

enc = preprocessing.OneHotEncoder(n_values=[2,3,4])
enc.fit([[1,2,3],[0,2,0]])
image
enc.transform([[1,0,0]]).toarray()
image

缺失值处理(Imputation of missing values)

由于各种各样的原因,很多真实世界中的数据集包含有缺失值,通常使用blanks,NaNs or other placeholders来代替。这样的数据集是无法直接被sklearn的学习器模型处理的。

一个解决的办法是将包含缺失值得整行或者整列直接丢弃。然而这样可能会丢失很多有价值的数据。

一个更好的办法是补全缺失值,也就是从已知的部分数据推断出未知的数据。

Imputer类提供了补全缺失值得基本策略: 使用一行或者一列的均值,中值,出现次数最多的值来补全,该类也允许不同缺失值得编码。

from sklearn.preprocessing import Imputer

imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit([[1,2], [np.nan,3], [7,6]])
image
X = [[np.nan,2], [6, np.nan], [7,6]]
imp.transform(X)
image

使用训练得数据来进行补全。

Imputer类支持稀疏矩阵:

import scipy.sparse as sp
X = sp.csc_matrix([[1,2], [0,3], [7,6]])
imp = Imputer(missing_values=0, strategy='mean', axis=0)
imp.fit(X)

X_test = sp.csc_matrix([[0,2], [6,0], [7,6]])
imp.transform(X_test)
image

多项式特征(Generating polynominal features)

为输入数据添加非线性特征可以增加模型的复杂度,实现这一点的常用的简单方法是使用多项式特征(polynominal features),他可以引入特征的高阶项和互乘积项。

sklearn的PolynominalFeatures类可以用来在出入数据的基础上构造多项式特征。

from sklearn.preprocessing import PolynomialFeatures

X = np.arange(6).reshape(3,2)
poly = PolynomialFeatures(2)   # 二阶
poly.fit_transform(X)
image image

有些情况下,我们只想要原始输入特征分量之间的互乘积项,这时可以设置参数:interaction_only=True,这时将不会出现次方项。

自定义转换器(Custom transformers)

有时候,你需要把一个已经有的Python函数变为一个变换器transformer来进行数据的清理和预处理。

借助于FunctionTransformer类,你可以从任意的Python函数实现一个transformer。比如,构造一个transformer实现对数变换。

from sklearn.preprocessing import FunctionTransformer

transformer = FunctionTransformer(np.log1p)
X = np.array([[0,1], [2,3]])
transformer.transform(X
image

分类: Scikit-learn

pandas 中对特征进行硬编码和onehot编码

2018年12月05日 16:31:41 很吵请安青争 阅读数:129

<article class="baidu_pl" style="box-sizing: inherit; outline: 0px; margin: 0px; padding: 16px 0px 0px; display: block; position: relative; color: rgba(0, 0, 0, 0.75); font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: common-ligatures; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dpengwang/article/details/84838688

首先介绍两种编码方式硬编码和onehot编码,在模型训练所需要数据中,特征要么为连续,要么为离散特征,对于那些值为非数字的离散特征,我们要么对他们进行硬编码,要么进行onehot编码,转化为模型可以用于训练的特征
初始化一个DataFrame

import pandas as pd
df = pd.DataFrame([
    ['green', 'M', 20, 'class1'],
    ['red', 'L', 21, 'class2'],
    ['blue', 'XL',30, 'class3']])
df.columns = ['color', 'size', 'weight', 'class label']

在这里插入图片描述

硬编码:

将feature的值从0(或者1)开始进行连续编码,比如color进行硬编码,color的值有三个,分别为编码为1,2,3
可以用如下操作,对color字段下的值进行硬编码

colorMap = {elem:index+1 for index,elem in enumerate(set(df["color"]))}
df['color'] = df['color'].map(colorMap)

这样可以进行硬编码了,之前我的写法是,先生成map,然后对每一行进行apply,显然没有上述代码简便

onehot编码:

将某个字段下所有值横向展开,对于每条数据,其在对应展开的值上的值就是1,听起来比较绕口,看下面的例子就知道了,python中,pandas 用get_dummies()方法即可

data1 = pd.get_dummies(df[["color"]])

在这里插入图片描述

如果要对多个feature 进行onehot,这样即可df[[fea1,fea2..]]
对于onehot以后的数据,如果需要原有的数据合并,直接拿原来的join onehot的数据即可

res  = df.join(data1)

在这里插入图片描述

join操作默认是根据index来进行join的,而get_dummies()不会改变index

上一篇下一篇

猜你喜欢

热点阅读