Scikit learn 在scikit learn中使用OneHotEncoder为分类准备序数和标称特征

Scikit learn 在scikit learn中使用OneHotEncoder为分类准备序数和标称特征,scikit-learn,feature-extraction,Scikit Learn,Feature Extraction,我想准备一个包含连续、标称和有序特征的数据集进行分类。下面我有一些解决方法,但我想知道是否有更好的方法使用scikit learn的编码器 让我们考虑下面的示例数据集: import pandas as pd df = pd.DataFrame([['green', 'M', 10.1, 'class1'], ['red', 'L', 13.5, 'class2'], ['blue', 'XL', 15.3, 'class1']]) df.columns = ['color', 'size',

我想准备一个包含连续、标称和有序特征的数据集进行分类。下面我有一些解决方法,但我想知道是否有更好的方法使用
scikit learn
的编码器

让我们考虑下面的示例数据集:

import pandas as pd
df = pd.DataFrame([['green', 'M', 10.1, 'class1'], ['red', 'L', 13.5, 'class2'], ['blue', 'XL', 15.3, 'class1']])
df.columns = ['color', 'size', 'prize', 'class label']
df

现在,可以通过标签编码器简单地转换类标签(分类器忽略类标签中的顺序)

我将依次转换特征列
大小
,如下所示:

size_mapping = {
           'XL': 3,
           'L': 2,
           'M': 1}

df['size'] = df['size'].apply(lambda x: size_mapping[x])
df

最后是顺序
颜色
功能:

color_mapping = {
           'green': [0,0,1],
           'red': [0,1,0],
           'blue': [1,0,0]}

df['color'] = df['color'].apply(lambda x: color_mapping[x])
df


您可以使用DictVectorizer进行标称编码,从而使过程更干净。您还可以使用
.map()
直接应用“大小映射”

返回:

array([[  0. ,   0. ,   1. ,   0. ,  10.1,   1. ],
       [  1. ,   0. ,   0. ,   1. ,  13.5,   2. ],
       [  0. ,   1. ,   0. ,   0. ,  15.3,   3. ]])
获取功能名称:

 Dvec.get_feature_names()

 ['class label', 'color=blue', 'color=green', 'color=red', 'prize', 'size']

谢谢,看起来干净多了!这具有微妙的欺骗性,并证明了SciKit的巨大局限性。并非所有的标称特性都可以像您所展示的那样进行矢量化,但这正是scikits所需要的。在这里,一个大小可以工作,但说的功能是“头发颜色”?您必须提取头发颜色1与3之间的线性关系。显然,这毫无意义,而且会导致scikit的分类器和回归器得出同样荒谬的结果。
import pandas as pd
df = pd.DataFrame([['green', 'M', 10.1, 'class1'], ['red', 'L', 13.5, 'class2'], ['blue', 'XL', 15.3, 'class1']])
df.columns = ['color', 'size', 'prize', 'class label']

from sklearn.preprocessing import LabelEncoder
class_le = LabelEncoder()
df['class label'] = class_le.fit_transform(df['class label'].values)

size_mapping = {
       'XL': 3,
       'L': 2,
       'M': 1}

df['size'] = df['size'].map(size_mapping)

feats =df.transpose().to_dict().values()

from sklearn.feature_extraction import DictVectorizer
Dvec = DictVectorizer()

Dvec.fit_transform(feats).toarray()
array([[  0. ,   0. ,   1. ,   0. ,  10.1,   1. ],
       [  1. ,   0. ,   0. ,   1. ,  13.5,   2. ],
       [  0. ,   1. ,   0. ,   0. ,  15.3,   3. ]])
 Dvec.get_feature_names()

 ['class label', 'color=blue', 'color=green', 'color=red', 'prize', 'size']