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

Bak*_*war 10 python pandas scikit-learn

我正在尝试使用scikit-learn在数据集上运行一些机器学习算法.我的数据集有一些类似于类别的功能.就像一个特征是A,其值1,2,3指定了某些东西的质量.1:Upper, 2: Second, 3: Third class.所以它就像一个序数变量.

同样地,我已经重新编码的变量城市,有三个值('London', Zurich', 'New York'1,2,3,但与价值没有具体的偏好.所以现在这是一个名义上的分类变量.

如何在pandas中指定算法将其视为分类和序数等?与R一样,分类变量由因子(a)指定,因此不被视为连续值.在pandas/python中有类似的东西吗?

解决这个问题的最佳方法是什么?

谢谢

ben*_*oss 26

......多年后(因为我认为这个问题的一个很好的解释不仅需要这个问题,还需要在将来提醒自己)

序数与名义

通常,人们会将分类变量转换为虚拟变量(或许多其他方法),因为它们是名义上的,例如它们没有意义a > b > c.在OP原始问题中,这只会在伦敦,苏黎世,纽约等城市进行.

标称的虚拟变量

对于此类问题,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
Run Code Online (Sandbox Code Playgroud)

分类变量的序数编码

但是,在序数变量的情况下,用户必须谨慎使用pandas.factorize.原因是工程师想要保留映射中的关系a > b > c.

因此,如果我想在其中采用一组分类变量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'))
Run Code Online (Sandbox Code Playgroud)

事实上,为了维持序数概念而需要保留的关系已经失去了使用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
Run Code Online (Sandbox Code Playgroud)

实际上,通过创建自己dict的值来映射值不仅可以保留您所需的序数关系,还可以用作"保持预测算法的内容和映射有序",确保您不仅没有丢失任何序数过程中的信息,但也存储了每个变量的每个映射的记录.

int进入 sklearn

最后,OP谈到将信息传递给scikit-lean分类器,这意味着需要ints.对于这种情况,如果您的数据中有任何内容,请确保您知道此处详述的astype(int)问题.NaN


dar*_*dog 1

请参阅https://pandas.pydata.org/pandas-docs/stable/ generated/pandas.factorize.html 并查看此问题How to reformatical Pandas variables for Sci-kit Learn

  • 最好充实你的答案而不是发布链接 (12认同)