我正在尝试使用scikit-learn在数据集上运行一些机器学习算法。我的数据集具有一些类似于类别的特征。就像一个功能一样A,它具有1,2,3指定事物质量的值。1:Upper, 2: Second, 3: Third class。因此,这是一个序数变量。
scikit-learn
同样地,我再编码的可变City,具有三个值('London', Zurich', 'New York'成1,2,3,但没有具体的偏好值。所以现在这是一个名义上的分类变量。
('London', Zurich', 'New York'成1,2,3
如何指定算法以将它们视为大熊猫中的分类和有序等?与R中一样,类别变量由指定factor(a),因此不被视为连续值。在pandas / python中有类似的东西吗?
..几年后(并且因为我认为不仅要对这个问题进行充分的解释,而且还需要在以后提醒自己)
序数与标称通常,将类别变量转换为伪变量(或许多其他方法),因为它们是名义上的,例如它们没有意义a > b > c。在OPs最初提出的问题中,只能在伦敦,苏黎世,纽约等城市中执行。
a > b > c
虚拟变量的名义 对于此类问题,请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。在这样的实例中,我使用自己的映射来确保保留序数属性。
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
scikit-lean