【sklearn】数据预处理之独热编码(含两种实现方式+代码理解)

最近学习机器学习,接触到独热编码相关内容,参考了一些资料,加上自己的思考,做出了如下总结:

一、什么是独热编码

独热编码,即One-Hot编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。

说起来这么复杂,举个例子就很容易理解了:

比如爱吃的水果有3种:苹果、葡萄和橙子,转换成独热编码分别表示为(此时上述描述中的N=3):001, 010, 100。(当然转换成100, 010, 001也可以,只要有确定的一一对应关系即可)。

那么提出一个问题,苹果、葡萄和橙子分别转换成1, 2, 3行不行?

一般不这样处理,这样处理也不叫独热编码了,只能说是文本转换成数字,具体原因可以往下看。

二、为什么要进行独热编码

在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的。而常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。

使用独热编码(One-Hot Encoding),将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用独热编码(One-Hot Encoding),会让特征之间的距离计算更加合理。

接下来举例说明:

我们选取离散型特征,共有五个取值,不使用独热编码(One-Hot Encoding),其表示分别是:

演员 =0;厨师 =1;公务员 =2;工程师 =3;律师 =4

两个工作之间的距离是:

d(演员,厨师) = 1
d(厨师,公务员) = 1
d(公务员,工程师) = 1
d(工程师,律师) = 1
d(演员,公务员) = 2
d(演员,工程师) = 3

显然这样的表示,计算出来的特征的距离是不合理。那如果使用独热编码(One-Hot Encoding),则得到d(演员,厨师) = 1与d(演员,公务员)都是1。那么,两个工作之间的距离就都是sqrt(2)。即每两个工作之间的距离是一样的,显得更合理。

此处参考文章为:

https://www.jianshu.com/p/42e93acacc52

三、如何用Python实现独热编码

方法1:get_dummies

将类别变量转换成虚拟变量/指示变量,也叫哑变量。

我们看一下它的定义:

pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, 
                   sparse=False, drop_first=False, dtype=None)

各参数的含义:

data: array-like, Series, or DataFrame

prefix: string, list of strings, or dict of strings, default None

prefix_sep: str, default ‘_’ (转换后列名的前缀)

dummy_na: bool, default False(增加一列表示空缺值,如果False就忽略空缺值)

columns: list-like, default None (指定需要实现类别转换的列名)

sparse: bool, default False

drop_first: bool, default False (获得k中的k-1个类别值,去除第一个)

dtype: dtype, default np.uint8

举例说明一下:

import numpy as np
import pandas as pd
s=pd.Series(list('abcd'))
s_=pd.get_dummies(s)
print(s_)

我们看一下结果:

   a  b  c  d
0  1  0  0  0
1  0  1  0  0
2  0  0  1  0
3  0  0  0  1

我们换一种表示方法:

import numpy as np
import pandas as pd
s=pd.Series(list('abcd'))
s_=pd.get_dummies(s,drop_first=True)
print(s_)
   b  c  d
0  0  0  0
1  1  0  0
2  0  1  0
3  0  0  1

再来看一个例子:

import numpy as np
import pandas as pd
df=pd.DataFrame({'city':['hang zhou','shang hai','bei jing'],'population':[20,32,51],'class':['A','A+','A+']})
print(df)
df_=pd.get_dummies(df)
print(df_)

首先看一下df的输出结果:

        city  population class
0  hang zhou          20     A
1  shang hai          32    A+
2   bei jing          51    A+

看一下df_的输出结果:

   population  city_bei jing  city_hang zhou  city_shang hai  class_A  class_A+
0          20              0               1               0        1         0
1          32              0               0               1        0         1
2          51              1               0               0        0         1

方法2:sklearn

Sklearn提供了一个编码器OneHotEncoder,用于将整数分类值转换成独热向量。

我们举一个例子:

from scipy.io import loadmat
from sklearn.preprocessing import OneHotEncoder

dataset=loadmat('neural_network_dataset.mat')
print('数据集展示为:\n',dataset)

展示一下数据集的样子:

数据集展示为:
 {'__header__': b'MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Sun Oct 16 13:09:09 2011', '__version__': '1.0', '__globals__': [], 'X': array([[0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       ...,
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.]]), 'y': array([[10],
       [10],
       [10],
       ...,
       [ 9],
       [ 9],
       [ 9]], dtype=uint8)}

接下来我们把标签向量转换为独热向量:

X=dataset['X']
y=dataset['y']
encoder=OneHotEncoder(sparse=False)
y_onehot=encoder.fit_transform(y)
print(y[0])
print(y_onehot[0,:])

我们看一下输出结果:

[10]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
### 关于分类问题的数据预处理方法 在解决分类问题时,数据预处理是一个至关重要的环节。这一步骤能够显著影响模型性能和最终预测效果。下面介绍几种常见的用于分类问题的数据预处理技术,并通过具体的例子展示如何利用Jupyter Notebook来实现。 #### 缺失值处理 缺失值的存在可能会干扰机器学习算法的学习过程。可以采用删除有缺失值的样本、填充均值/中位数或其他统计量等方式来进行填补[^2]。 ```python import pandas as pd from sklearn.impute import SimpleImputer # 假设df是我们要操作的数据框 imputer = SimpleImputer(strategy='mean') df_imputed = imputer.fit_transform(df) ``` #### 类别型特征编码 对于类别型变量(如颜色、性别),通常需要将其转换成数值形式以便后续建模使用。一种常见做法是应用独热编码(one-hot encoding),它会为每一个类目创建一个新的二元列。 ```python pd.get_dummies(data=df, columns=['category_column']) ``` #### 特征缩放 不同尺度上的输入可能导致某些距离度量敏感性的增加;因此,在训练之前调整所有特征到相似范围是有益处的。标准化(Standardization) 和 归一化(Normalization)两种广泛使用的手段。 ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaled_features = scaler.fit_transform(features) ``` #### 训练集与测试集划分 为了评估所构建模型的效果,应该把原始数据分为两部分——一部分用来拟合参数即训练集(training set), 另外一部分则留作验证泛化能力之用也就是测试集(testing set). ```python from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` 上述代码片段展示了几个典型的数据预处理步骤以及它们是如何被集成在一个完整的流程里的。值得注意的是,实际项目里可能还需要考虑更多细节方面的工作比如异常检测等。而这一切都可以方便地在像Jupyter这样的交互式开发环境中完成,因为其支持即时反馈并能轻松分享成果给他人查看。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

旅途中的宽~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值