小编典典

如何在熊猫中将变量指定为序数/分类?

json

我正在尝试使用scikit-learn在数据集上运行一些机器学习算法。我的数据集具有一些类似于类别的特征。就像一个功能一样A,它具有1,2,3指定事物质量的值。1:Upper, 2: Second, 3: Third class。因此,这是一个序数变量。

同样地,我再编码的可变City,具有三个值('London', Zurich', 'New York'成1,2,3,但没有具体的偏好值。所以现在这是一个名义上的分类变量。

如何指定算法以将它们视为大熊猫中的分类和有序等?与R中一样,类别变量由指定factor(a),因此不被视为连续值。在pandas / python中有类似的东西吗?


阅读 346

收藏
2020-07-27

共1个答案

小编典典

..几年后(并且因为我认为不仅要对这个问题进行充分的解释,而且还需要在以后提醒自己)

序数与标称通常,将类别变量转换为伪变量(或许多其他方法),因为它们是名义上的,例如它们没有意义a > b > c。在OPs最初提出的问题中,只能在伦敦,苏黎世,纽约等城市中执行。

虚拟变量的名义
对于此类问题,请pandas使用-提供迄今为止最简单的转换pandas.get_dummies。所以:

# create a sample of OPs unique values
series = pandas.Series(
           numpy.random.randint(low=0, high=3, size=100))
mapper = {0: 'New York', 1: 'London', 2: 'Zurich'}
nomvar = series.replace(mapper)

# now let's use pandas.get_dummies
print(
    pandas.get_dummies(series.replace(mpr))

Out[57]:
    London  New York  Zurich
0        0         0       1
1        0         1       0
2        0         1       0
3        1         0       0

分类变量的序数编码
但是,对于序数变量,用户在使用时必须谨慎pandas.factorize。原因是工程师想保留映射中的关系,使a > b > c

因此,如果我想在where中获取一组分类变量large > medium > small并保留该变量,则需要确保pandas.factorize保留该关系。

# leveraging the variables already created above
mapper = {0: 'small', 1: 'medium', 2: 'large'}
ordvar = series.replace(mapper)

print(pandas.factorize(ordvar))

Out[58]:
(array([0, 1, 1, 2, 1,...  0, 0]),
Index(['large', 'small', 'medium'], dtype='object'))

实际上,使用来丢失为了维护序数概念而需要保留的关系pandas.factorize。在这样的实例中,我使用自己的映射来确保保留序数属性。

preserved_mapper = {'large':2 , 'medium': 1, 'small': 0}
ordvar.replace(preserved_mapper)
print(ordvar.replace(preserved_mapper))

Out[78]:
0     2
1     0
...
99    2
dtype: int64

实际上,通过创建自己dict的值进行映射不仅可以保留所需的序数关系,还可以用作“保持预测算法的内容和映射有序”的方法,从而确保您不仅不会丢失任何序数信息,但还存储了每个变量的每个映射是什么的记录。

int入 sklearn最后,OP谈到将信息传递到scikit-lean分类器中,这意味着ints是必需的。在这种情况下,如果您的数据中包含s,请确保您了解此处详细说明的astype(int)陷阱。NaN

2020-07-27