在机器学习中,特征经常不是数值型的而是分类型的。举个例子,一个人可能有 ["male", "female"]
, ["from Europe", "from US", "from Asia"]
,["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]
等分类的特征。这些特征能够被有效地编码成整数,比如 ["male", "from US", "uses Internet Explorer"]
可以被表示为 [0, 1, 3]
, ["female", "from Asia", "uses Chrome"]
表示为 [1, 2, 1]
。
这个的整数特征表示并不能在scikit-learn的估计器中直接使用,因为这样的连续输入,估计器会认为类别之间是有序的,但实际却是无序的。(例如:浏览器的类别数据则是任意排序的)
一种将分类特征转换为能够被scikit-learn中模型使用的编码是one-of-K或one-hot编码,在 OneHotEncoder
中实现。这个类使用 m
个可能值转换为 m
值化特征,将分类特征的每个元素转化为一个值。
考虑如下例子:
>>>
>>> enc = preprocessing.OneHotEncoder() >>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) OneHotEncoder(categorical_features='all', dtype=<... 'numpy.float64'>, handle_unknown='error', n_values='auto', sparse=True) >>> enc.transform([[0, 1, 3]]).toarray() array([[ 1., 0., 0., 1., 0., 0., 0., 0., 1.]])
默认情况下,每个特征使用几维的数值由数据集自动推断。当然,你也可以通过使用参数``n_values``来精确指定。 在我们的例子数据集中,有两个可能得性别类别,三个洲,四个网络浏览器。接着,我们训练编码算法,并用来对一个样本数据进行转换。 在结果中,前两个数值是性别编码,紧接着的三个数值是洲编码,最后的四个数值是浏览器编码
注意,如果训练集中有丢失的分类特征值,必须显式地设置 n_values
,举个例子,
>>>
>>> enc = preprocessing.OneHotEncoder(n_values=[2, 3, 4]) >>> # 注意到第二、三个特征是不全的 >>> # features >>> enc.fit([[1, 2, 3], [0, 2, 0]]) OneHotEncoder(categorical_features='all', dtype=<... 'numpy.float64'>, handle_unknown='error', n_values=[2, 3, 4], sparse=True) >>> enc.transform([[1, 0, 0]]).toarray() array([[ 0., 1., 1., 0., 0., 1., 0., 0., 0.]])
参见 从字典类型加载特征 ,它对于分类特征代表一个dict,而不是整数。