如何指定Pandas中的变量为有序/分类变量?

57hvy0tb  于 2023-01-04  发布在  其他
关注(0)|答案(3)|浏览(137)

我尝试使用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中有类似的操作吗?

bt1cpqcv

bt1cpqcv1#

......年后(而且因为我认为需要对这些问题进行很好的解释,不仅是为了这个问题,而且是为了帮助将来提醒自己)

顺序与标称

一般来说,我们会将分类变量转换为哑变量(或host of other methodologies),因为它们是名义变量,例如,它们没有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,原因是工程师希望在Map中保留关系,使得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'))

事实上,为了维护序数的概念而需要保留的关系在使用pandas.factorize时已经丢失,在这样的示例中,我使用自己的Map来确保序数属性得到保留。

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来Map值,不仅可以保留您想要的顺序关系,还可以用来“保持预测算法的内容和Map的组织性”,确保您不仅不会在过程中丢失任何顺序信息,而且还可以存储每个变量的每个Map是什么的记录。

int s转换为sklearn

最后,OP谈到了将信息传递到scikit-lean分类器,这意味着需要int。在这种情况下,如果您的数据中有任何NaN,请确保您知道这里详细介绍的astype(int) gotcha

wh6knrhe

wh6knrhe2#

您应该对分类变量使用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.]])

相关问题