在本文中,我们将了解如何使用特征工程技术 One Hot Encoding 处理多类别变量。
但在继续之前,让我们简要讨论一下特征工程和 One Hot Encoding。
特征工程
因此,特征工程是使用问题的领域知识从原始数据中提取特征的过程。这些功能可用于提高机器学习算法的性能,如果性能提高,那么它将提供最佳的准确性。我们也可以说特征工程与应用机器学习相同。特征工程是机器学习中最重要的艺术,它在好模型和坏模型之间产生了巨大的差异。这是任何数据科学项目生命周期的第三步。
机器学习模型的透明度概念是一件复杂的事情,因为不同的模型通常需要针对不同类型的数据采用不同的方法。例如:-
- 连续数据
- 分类特征
- 缺少价值观
- 正常化
- 日期和时间
但这里我们只讨论分类特征,分类特征是那些数据类型是对象类型的特征。任何分类特征中数据点的值都不是数字形式,而是对象形式。
有很多处理分类变量的技术,其中一些是:
- 标签编码或序数编码
- 一热编码
- 虚拟编码
- 效果编码
- 二进制编码
- 巴塞尔编码
- 哈希编码
- 目标编码
因此,这里我们通过 One Hot Encoding 来处理分类特征,因此首先我们将讨论 One Hot Encoding。
一种热编码
我们知道分类变量包含标签值而不是数值。可能值的数量通常限于固定的集合。分类变量通常称为名义变量。许多机器学习算法无法直接对标签数据进行操作。它们要求所有输入变量和输出变量都是数字。
这意味着分类数据必须转换为数字形式。如果分类变量是输出变量,您可能还希望将模型的预测转换回分类形式以呈现它们或在某些应用程序中使用它们。
例如 性别数据的形式为 '男性' 和 '女性'。
但是,如果我们使用 one-hot 编码,那么编码并允许模型假设类别之间的自然顺序可能会导致性能不佳或意外结果。
One-hot 编码可以应用于整数表示。这是删除整数编码变量并为每个唯一整数值添加新的二进制变量的地方。
例如,我们对颜色变量进行编码,
红色 | 蓝色 |
0 | 1 |
1 | 0 |
0 | 1 |
现在我们将开始我们的旅程。第一步,我们获取房价预测数据集。
数据集
这里我们将使用 house_price 数据集,该数据集用于根据面积大小预测房价。
如果您想下载房价预测数据集,请点击 点击此处.
导入模块
现在,我们必须从 python 导入用于 one-hot 编码的重要模块
# 导入 pandas import pandas as pd # 导入 numpy import numpy as np # 导入 OneHotEncoder from sklearn.preprocessing import OneHotEncoder()
在这里,我们使用 pandas 用于数据分析,NumPyused 用于 n 维数组,并且在 sklearn 中,我们将使用一个重要的类 One Hot Encoder 进行分类编码。
现在我们必须使用 Python 读取这些数据。
读取数据集
一般数据集都是CSV的形式,我们使用的数据集也是CSV的形式。为了读取 CSV 文件,我们将使用 pandas read_csv() 函数。见下文:
# 读取数据集 df = pd.read_csv('house_price.csv') df.head()
输出:-
但我们只能对一个热门编码器使用分类变量,并且为了便于理解,我们只会尝试用分类变量进行解释。
为了从数据中划分分类变量,我们必须检查有多少特征具有分类值。
检查分类值
为了检查值,我们使用 pandas select_dtypes 函数,该函数用于选择变量的数据类型。
# 检查特征 cat = df.select_dtypes(include='O').keys() # 显示变量 cat
输出:-
现在我们必须从数据集中删除这些数字列,我们将使用这个分类变量。我们仅使用数据集中的 3-4 个分类列来应用 one-hot 编码。
创建新的数据框
现在,为了使用分类变量,我们将创建所选分类列的新数据框。
# 创建新的 df # 设置我们使用的列 new_df = pd.read_csv('house_price.csv',usecols=['邻里','外部第一','外部第二']) new_df.head()
输出:-
现在我们必须找出每个分类列中存在多少个独特的类别。
寻找独特的价值
为了查找唯一值,我们将使用 pandas unique() 函数。
# 每列中的唯一值 for x in new_df.columns: #打印唯一值 print(x ,':', len(new_df[x].unique()))
输出:-
邻里 : 25 |
外部第一:1 |
外部第二:2 |
现在,我们将采用我们的技术对多类别变量应用 one-hot 编码。
多类别变量技术
该技术是我们将 one-hot 编码限制为变量的 10 个最常见的标签。这意味着我们只会为 10 个最常见标签中的每一个创建一个二元变量,这相当于将所有其他标签分组到一个新类别下,在本例中该类别将被删除。因此,10 个新的虚拟变量表明 10 个最常见的标签之一是否存在 1 或不那么 0 对于特定的观察。
最常见的变量
这里我们将选择 20 个最常见的变量。
假设我们采用一个分类变量 附近.
# 查找前 20 个类别 new_df.Neighborhood.value_counts().sort_values(ascending=False).head(20)
输出:
当您看到此输出图像时,您会注意到 名称 标签在 Neighborhood 列中重复了 225 次,并且我们可以看到这个数字正在减少。
因此,我们从顶部取出前 10 个结果,并将该前 10 个结果转换为 one-hot 编码,并将左侧标签变为 XNUMX。
输出:-
最常见的分类变量列表
# 列出前 10 个变量 top_10 = [x for x in new_df.Neighborhood.value_counts().sort_values(ascending=False).head(10).index] top_10
输出:-
[‘名字’,
'CollgCr',
'老镇',
‘爱德华兹’,
‘萨默斯特’,
‘吉尔伯特’,
‘NridgHt’,
‘索耶’,
‘NWA’,
‘索耶W’]
Neighborhood 列中有前 10 个分类标签。
制作二进制
现在,我们必须制作 top_10 标签的 10 个二进制变量:
# 制作标签的二进制文件
对于 top_10 中的标签:
新的_df = np.where(new_df[‘邻居’]==标签,1,0)
new_df[[‘邻居’]+top_10]
输出:-
名称 | 大学铬 | 老镇 | 爱德华兹 | 萨默斯特 | 吉尔伯特 | 尼日特 | 索耶 | 西北瓦姆斯 | 索耶W | ||
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 大学铬 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 维恩克 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 大学铬 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 克劳福 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
4 | 诺里奇 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
5 | 米切尔 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
6 | 萨默斯特 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
7 | 西北瓦姆斯 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
8 | 老镇 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
9 | 布克赛德 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
10 | 索耶 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
11 | 尼日特 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
您可以看到 top_10 标签现在如何转换为二进制格式。
举个例子,看看表中的位置 1 指数 维恩克 它不属于我们的 top_10 类别标签,因此它将导致 0 所有列。
现在我们将对上面选择的所有分类变量执行此操作。
OneHotEncoding 上的所有选定变量
# 对于我们选择的所有分类变量 def top_x(df2,variable,top_x_labels): for label in top_x_labels: df2[variable+'_'+label] = np.where(data[variable]==label,1,0) # 读取再次读取数据 data = pd.read_csv('D://xdatasets/train.csv',usecols = ['Neighborhood','Exterior1st','Exterior2nd']) #将 Neighborhood 编码为 10 个最常见的类别 top_x(data, 'Neighborhood',top_10) # 显示数据 data.head()
输出:-
现在,我们对所有多类别变量应用 one-hot 编码。
现在我们将了解 One Hot Encoding 对于多变量的优点和缺点。
优势
- 易于实施
- 不需要太多时间进行变量探索
- 不会大规模扩展特征空间。
缺点
- 不添加任何可能使变量更具预测性的信息
- 不保留被忽略变量的信息。
结束笔记
所以,总结就是我们学习如何处理多类别变量,如果你遇到这个问题那么这是一个非常困难的任务。感谢您阅读本文。
在 Linkedin 上与我联系: 本人简介
阅读我的其他文章: https://www.analyticsvidhya.com/blog/author/mayurbadole2407/
谢谢你😎
本文中显示的媒体不归 Analytics Vidhya 所有,由作者自行决定使用。