如何将panda中的变量指定为序数/类别



我正试图使用scikit learn在数据集上运行一些机器学习算法。我的数据集有一些类似类别的功能。类似的一个特性是A,它的值1,2,3指定某个事物的质量。1:Upper, 2: Second, 3: Third class。所以它是一个序数变量。

类似地,我将具有三个值('London', Zurich', 'New York'的变量City重新编码为1,2,3,但对这些值没有特定的偏好。现在这是一个名义范畴变量。

我如何指定算法来考虑熊猫中的分类和序数等?。与R中一样,类别变量由factor(a)指定,因此不被视为连续值。熊猫/蟒蛇身上有类似的东西吗?

。。。几年后(因为我认为不仅需要对这个问题做出很好的解释,而且需要在未来提醒自己)

普通与标称

通常,人们会将分类变量转换为伪变量(或许多其他方法),,因为它们是标称的,例如它们对 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

范畴变量的有序编码

然而,在序数变量的情况下,用户在使用pandas.factorize时必须谨慎。原因是工程师希望保留映射中的关系,使得CCD_。

因此,如果我想取一组类别变量,其中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。在这种情况下,如果您的数据中有NaN,请确保您知道此处详细介绍的astype(int) gotcha。

您应该将OneHotEncoder转换器与分类变量一起使用,并保持顺序变量不变:

>>> import pandas as pd
>>> from sklearn.preprocessing import OneHotEncoder
>>> df = pd.DataFrame({'quality': [1, 2, 3], 'city': [3, 2, 1], columns=['quality', 'city']}
>>> enc = OneHotEncoder(categorical_features=[False, True])
>>> X = df.values
>>> enc.fit(X)
>>> enc.transform(X).todense()
matrix([[ 0.,  0.,  1.,  1.],
        [ 0.,  1.,  0.,  2.],
        [ 1.,  0.,  0.,  3.]])

请参阅https://pandas.pydata.org/pandas-docs/stable/generated/pandas.factorize.html请参阅此问题如何为Sci-kit重新格式化分类Pandas变量Learn

最新更新