

Python实现类别变量的独热编码(One-hot Encoding) - 疯狂学习GIS
source link: https://www.cnblogs.com/fkxxgis/p/17122059.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文介绍基于Python下OneHotEncoder
与pd.get_dummies
两种方法,实现机器学习中最优的编码方法——独热编码的方法。
在数据处理与分析领域,对数值型与字符型类别变量加以编码是不可或缺的预处理操作;这里介绍两种不同的方法。
1 OneHotEncoder
首先导入必要的模块。
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
其中,OneHotEncoder
是我们实现独热编码的关键模块。
接下来,导入并显示数据前五行。
test_data_1=pd.read_csv('G:/CropYield/03_DL/00_Data/onehot_test.csv',names=['EVI0610','EVI0626','SoilType'],header=0)
test_data_1.head(5)
关于这里导入数据代码的解释,大家可以查看多变量两两相互关系联合分布图的Python绘制与Python TensorFlow深度学习回归代码:DNNRegressor这两篇文章,这里就不再赘述啦~
数据前五行展示如下图。其中,前两列'EVI0610'
与'EVI0626'
为数值型连续变量,而'SoilType'
为数值型类别变量。我们要做的,也就是将第三列'SoilType'
进行独热编码。

接下来,进行独热编码的配置。
ohe=OneHotEncoder(handle_unknown='ignore')
ohe.fit(test_data_1)
在这里,第一行是对独热编码的配置,第二行则是对我们刚刚导入的数据进行独热编码处理。得到一个独热编码配置的输出结果。
接下来,看看独热编码处理后,将我们的数据分成了哪些类别。
ohe.categories_
得到结果如下图。

可以发现,一共有三个array
,为什么呢?仔细看可以发现,独热编码是将我们导入的三列数据全部都当作类别变量来处理了。之所以会这样,是因为我们在一开始没有表明哪一列是类别变量,需要进行独热编码;而哪一列不是类别变量,从而不需要进行独热编码。
那么,我们如何实现上述需求,告诉程序我们要对哪一行进行独热编码呢?在老版本的sklearn
中,我们可以借助categorical_features=[x]
参数来实现这一功能,但是新版本sklearn
取消了这一参数。那么此时,一方面,我们可以借助ColumnTransformer
来实现这一过程,另一方面,我们可以直接对需要进行转换的列加以处理。后者相对较为容易理解,因此本文对后者进行讲解。
我们将test_data_1
中的'SoilType'
列作为索引,从而仅仅对该列数据加以独热编码。
ohe_column=pd.DataFrame(ohe.fit_transform(test_data_1[['SoilType']]).toarray())
ohe_column.head(5)
其中,[['SoilType']]
表示仅仅对这一列进行处理。得到结果如下图。

可以看到,原来的'SoilType'
列现在成为了63
列的编码列,那么这样的话,说明我们原先的'SoilType'
应该一共是有63
个不同的数值。是不是这个样子呢?我们来检查一下。
count=pd.DataFrame(test_data_1['SoilType'].value_counts())
print(count)
得到结果如下。

好的,没有问题:可以看到此结果共有63
行,也就是'SoilType'
列原本是有63
个不同的值的,证明我们的独热编码没有出错。
此时看一下我们的test_data_1
数据目前长什么样子。
test_data_1.head(5)

是的,我们仅仅对'SoilType'
列做了处理,没有影响到整个初始数据。那么先将原本的'SoilType'
列剔除掉。
test_data_1=test_data_1.drop(['SoilType'],axis=1)
test_data_1.head(5)

再将经过独热编码处理后的63
列加上。
test_data_1.join(ohe_column)

大功告成!
但是这里还有一个问题,我们经过独热编码所得的列名称是以数字来命名的,非常不方便。因此,有没有什么办法可以在独热编码进行的同时,自动对新生成的列加以重命名呢?
2 pd.get_dummies
pd.get_dummies
是一个最好的办法!其具体用法与上述OneHotEncoder
类似,因此具体过程就不再赘述啦,大家看代码就可以明白。
首先还是导入与上述内容中一致的初始数据。
test_data_2=pd.read_csv('G:/CropYield/03_DL/00_Data/onehot_test.csv',names=['EVI0610','EVI0626','SoilType'],header=0)
test_data_2.head(5)

进行独热编码并看看结果。
test_data_2_ohe=pd.get_dummies(test_data_2,columns=['SoilType'])
test_data_2_ohe.head(5)

最终结果中,列名称可以说是非常醒目,同时,共有65
列数据,自动删除了原本的'SoilType'
列,实现了“独热编码”“新列重命名”与“原始列删除”,可谓一举三得,简直是太方便啦~
Recommend
-
73
(点击上方公众号,可快速关注) 变量直接硬编码啦… ↓↓↓ ...
-
35
-
30
数据结构实现 相信大家对 redis 的数据结构都比较熟悉: string :字符串(可以表示字符串、整数、位图) list :列表(可以表示线性表、栈、双端队列、阻...
-
11
点击上方“3D视觉工坊”,选择“星标”干货第一时间送达01...
-
10
五行代码实现千万类别分类网络,飞桨大规模分类库揭秘 - 飞桨PaddlePaddle的个人空间 - OSCHINA - 中文开源技术交流社区 “桃花一簇无开主,可爱深红爱浅红。 黄四娘家花满蹊,千朵万朵压枝低。 留连戏蝶时时舞,自在娇莺恰恰啼。”...
-
27
用python爬取豆瓣电影信息,输入类别和爬取页数,想怎么爬就怎么爬,哎就是玩! 代码操作展示:
-
10
自动检测字符编码函数mb_detect_encoding -- PHP -- IT技术博客大学习 -- 共学习 共进步! 您现在的位置:首页 -->
-
5
PyTorch之对类别张量进行one-hot编码本文已授权极市平台, 并首发于极市平台公众号. 未经允许不得二次转载.one-hot 形式的编码在深度学习任务中非常常见,但是却并不是一种很自然的数据存储方式。所以大多数情况下都需...
-
12
使用scikit-learn实现多类别及多标签分类算法 多标签分类格式 对于多标签分类问题而言,一个样本可能同时属于多个类别。如一个新闻属于多个话题。这种情况下,因变量yy需要使用一个矩阵表达出来。 而多类别分类指的是y的可能取值大...
-
7
HTTP/2不支持 HTTP 1.1 的分块传输编码机制Transfer-Encoding:chunked 2...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK