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
分类器,这意味着需要int
s.对于这种情况,如果您的数据中有任何内容,请确保您知道此处详述的astype(int)
问题.NaN
请参阅https://pandas.pydata.org/pandas-docs/stable/ generated/pandas.factorize.html 并查看此问题How to reformatical Pandas variables for Sci-kit Learn