- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这可能是一个初学者的问题,但是我已经看到很多人使用LabelEncoder()用常规替换类别变量。很多人一次通过传递多列来使用此功能,但是我对某些功能中的错误序数及其对模型的影响会产生疑问。这是一个例子:
输入
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
a = pd.DataFrame(['High','Low','Low','Medium'])
le = LabelEncoder()
le.fit_transform(a)
array([0, 1, 1, 2], dtype=int64)
最佳答案
TL; DR :使用 LabelEncoder
对任何类型的特征进行序数编码是一个坏主意!
实际上,这在文档中有明确说明,其中提到,顾名思义,该编码方法旨在对标签进行编码:
This transformer should be used to encode target values, i.e.
y
, and not the inputX
.
LabelEncoder
编码序数特征,则可能会导致某个特征说
1
表示温暖,
2
可能转换为热,而
0
表示沸腾。在这种情况下,结果最终将是一棵不必要的大量拆分树,因此,对于更简单的建模而言,其复杂性将大大提高。
OrdinalEncoder
,并为序数特征定义适当的映射方案。或在具有分类功能的情况下,我们应该查看
OneHotEncoder
或
Category Encoders中可用的各种编码器。
pd.Categorical
:
df = pd.DataFrame(
{'Hours of dedication': pd.Categorical(
values = ['25-30', '20-25', '5-10', '5-10', '40-45',
'0-5', '15-20', '20-25', '30-35', '5-10',
'10-15', '45-50', '20-25'],
categories=['0-5', '5-10', '10-15', '15-20',
'20-25', '25-30','30-35','40-45', '45-50']),
'Assignments avg grade': pd.Categorical(
values = ['B', 'C', 'F', 'C', 'B',
'D', 'C', 'A', 'B', 'B',
'B', 'A', 'D'],
categories=['F', 'D', 'C', 'B','A']),
'Result': pd.Categorical(
values = ['Pass', 'Pass', 'Fail', 'Fail', 'Pass',
'Fail', 'Fail','Pass','Pass', 'Fail',
'Fail', 'Pass', 'Pass'],
categories=['Fail', 'Pass'])
}
)
如前所述,将类别列定义为 Pandas 的类别的好处是我们可以在其类别之间建立顺序。这允许基于已建立的顺序而不是词法排序更快地进行排序。它也可以用作一种简单的方法来根据其顺序获取不同类别的代码。
print(df.head())
Hours_of_dedication Assignments_avg_grade Result
0 20-25 B Pass
1 20-25 C Pass
2 5-10 F Fail
3 5-10 C Fail
4 40-45 B Pass
5 0-5 D Fail
6 15-20 C Fail
7 20-25 A Pass
8 30-35 B Pass
9 5-10 B Fail
可以通过以下方式获得相应的类别代码:
X = df.apply(lambda x: x.cat.codes)
X.head()
Hours_of_dedication Assignments_avg_grade Result
0 4 3 1
1 4 2 1
2 1 0 0
3 1 2 0
4 7 3 1
5 0 1 0
6 3 2 0
7 4 4 1
8 6 3 1
9 1 3 0
现在,让我们拟合
DecisionTreeClassifier
,看看树如何定义拆分:
from sklearn import tree
dt = tree.DecisionTreeClassifier()
y = X.pop('Result')
dt.fit(X, y)
我们可以使用
plot_tree
可视化树结构:
t = tree.plot_tree(dt,
feature_names = X.columns,
class_names=["Fail", "Pass"],
filled = True,
label='all',
rounded=True)
LabelEncoder
获得的编码方案直接编码所有特征来进行相同操作,因此不考虑特征的实际顺序,而只是随机分配一个值:
df_wrong = df.copy()
df_wrong['Hours_of_dedication'].cat.set_categories(
['0-5','40-45', '25-30', '10-15', '5-10', '45-50','15-20',
'20-25','30-35'], inplace=True)
df_wrong['Assignments_avg_grade'].cat.set_categories(
['A', 'C', 'F', 'D', 'B'], inplace=True)
rcParams['figure.figsize'] = 14,18
X_wrong = df_wrong.drop(['Result'],1).apply(lambda x: x.cat.codes)
y = df_wrong.Result
dt_wrong = tree.DecisionTreeClassifier()
dt_wrong.fit(X_wrong, y)
t = tree.plot_tree(dt_wrong,
feature_names = X_wrong.columns,
class_names=["Fail", "Pass"],
filled = True,
label='all',
rounded=True)
4
深度为止。
关于python - 用于分类功能的LabelEncoder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61217713/
我使用 LabelEncoder() 将分类数据转换为数值数据。我有一个数据集,如下所示: ['x','s','n','t','p','f','c','n','k','e','e','s','s','
您可以在下面找到我在互联网上找到的用于构建简单神经网络的代码。一切正常。我对 y 标签进行了编码,这些是我得到的预测: 2 0 1 2 1 2 2 0 2 1 0 0 0 1 1 1 1 1 1 1
LabelEncoder 不会“记住”参数。当我用它拟合和转换数据然后询问参数时,我得到的只是{}。这使得不可能在新数据上重新使用编码器。 例子: from sklearn.preprocessing
摘要:Sklearn 的 LabelEncoder 将不同的值编码为相同的值。 encoder.fit(data) 和 data_encoded =encoder.transform(data) 可以
我正在做一个预测项目(为了好玩),基本上我从 nltk 中提取了男性和女性的名字,将名字标记为“男性”或“女性”,然后获取每个名字的最后一个字母,最后使用不同的机器学习算法根据最后一个字母训练和预测性
我编写了这个函数来使用 LabelEncoder 转换分类特征 #convert columns to dummies with LabelEncoder cols = ['ToolType', 'T
嘿, 我的数据集中的“城市”列中有不同的城市名称。我很想使用 LabelEncoder() 对其进行编码。然而,我得到了非常令人沮丧的负值结果 df['city_enc'] = LabelEncode
嘿, 我的数据集中的“城市”列中有不同的城市名称。我很想使用 LabelEncoder() 对其进行编码。然而,我得到了非常令人沮丧的负值结果 df['city_enc'] = LabelEncode
我遇到有关 LabelEncoder 的问题。我将其应用到数据集,如下所示: data_set1 = data_set.apply(LabelEncoder().fit_transform) ...并
我正在尝试建立一个推理管道。它由两部分组成。使用前几年的一些表格订单元数据进行每月 ML 模型训练,并使用当天的新订单进行每日推理预测。我想在我的模型中包含几个字符串分类列,我使用 labelenco
Closed. This question is off-topic。它当前不接受答案。
Image of ull error 我正在尝试在对象类型的所有列上运行LabelEncoder。这是我编写的代码,但它引发了此错误: TypeError: '<' not supported bet
尝试执行以下代码时出现以下错误。 class LabelOneHotEncoder(): def __init__(self): self.ohe = OneHotEncode
我正在编写一个脚本,该脚本使用“局部异常值因子”算法进行“新颖性检测”。在这种情况下,我们需要在进行预测之前“拟合”“干净/训练”数据框。为了使算法正常工作,我们需要对数据帧中的值进行编码,例如将“v
我在数据帧上应用了 LabelEncoder(),它返回以下内容: order/new_cart 有不同的标签编码数字,如 70、64、71 等 这是标签不一致,还是我哪里做错了什么? 最佳答案 La
我有一个很大的 csv,每行有两个字符串,格式如下: g,k a,h c,i j,e d,i i,h b,b d,d i,a d,h 我阅读了前两列并将字符串重新编码为整数,如下所示: import
如果 sklearn.LabelEncoder已在训练集上拟合,如果在测试集上使用时遇到新值,它可能会中断。 对此我能想出的唯一解决方案是将测试集中的所有新内容(即不属于任何现有类)映射到 "" ,然
我想使用 sklearn.preprocessing.LabelEncoder 对元组列表进行标签编码, 如: [(4,5), (6, 7), (1, 1), (6, 7), ... ] 这样每个元组
我正在尝试将分类字符串列转换为几个虚拟变量二进制列,但出现值错误。 代码如下: import sys, os import numpy as np import matplotlib.pyplot a
如果我有一个数据框,请说 df,如果 df["levels"] = pd.Series(["low", "low", "med", "low", "med", "high"]) 有没有办法将其更改为:
我是一名优秀的程序员,十分优秀!