我尝试使用scikit-learn在一个数据集上运行一些机器学习算法。我的数据集有一些类似类别的特征。比如一个特征是A
,它的值1,2,3
指定了某个东西的质量。1:Upper, 2: Second, 3: Third class
。所以它是一个有序变量。
类似地,我将一个变量City
重新编码为1,2,3
,该变量有三个值('London', Zurich', 'New York'
,但对这些值没有特定的偏好,所以现在它是一个名义型分类变量。
我如何指定算法来将这些变量视为分类变量和有序变量等?.像在R中一样,分类变量由factor(a)
指定,因此不被视为连续值.在panda/python中有类似的操作吗?
3条答案
按热度按时间bt1cpqcv1#
......年后(而且因为我认为需要对这些问题进行很好的解释,不仅是为了这个问题,而且是为了帮助将来提醒自己)
顺序与标称
一般来说,我们会将分类变量转换为哑变量(或host of other methodologies),因为它们是名义变量,例如,它们没有
a > b > c
的意义。在OP的原始问题中,这只在城市中执行,如伦敦、苏黎世、纽约。标称值的虚拟变量
对于这种类型的问题,
pandas
提供了--到目前为止--使用pandas.get_dummies
最简单的转换。分类变量的序数编码
然而,对于有序变量,用户必须谨慎使用
pandas.factorize
,原因是工程师希望在Map中保留关系,使得a > b > c
。所以如果我想取一组分类变量,其中
large > medium > small
,并保持它,我需要确保pandas.factorize
保持这种关系。事实上,为了维护序数的概念而需要保留的关系在使用
pandas.factorize
时已经丢失,在这样的示例中,我使用自己的Map来确保序数属性得到保留。事实上,通过创建自己的
dict
来Map值,不仅可以保留您想要的顺序关系,还可以用来“保持预测算法的内容和Map的组织性”,确保您不仅不会在过程中丢失任何顺序信息,而且还可以存储每个变量的每个Map是什么的记录。int
s转换为sklearn
最后,OP谈到了将信息传递到
scikit-lean
分类器,这意味着需要int
。在这种情况下,如果您的数据中有任何NaN
,请确保您知道这里详细介绍的astype(int)
gotcha。wh6knrhe2#
您应该对分类变量使用OneHotEncoder转换器,而不修改序数变量:
l2osamch3#
请参见https://pandas.pydata.org/pandas-docs/stable/generated/pandas.factorize.html并查看此问题How to reformat categorical Pandas variables for Sci-kit Learn