对类别Category数据编码的几种方法


文中数据以Titanic数据集为例

1、Query the column

titanic_df['Embarked'][titanic_df['Embarked']=='S'] = 0
titanic_df['Embarked'][titanic_df['Embarked']=='Q'] = 1
titanic_df['Embarked'][titanic_df['Embarked']=='C'] = 2
titanic_df['Embarked']= titanic_df['Embarked'].astype(np.int64)

2、map()

embarked_mapping = {'S': 0, 'Q': 1, 'C': 2}
titanic_df['Embarked'] = titanic_df['Embarked'].map(embarked_mapping)

对于有大小意义的离散特征,比如size:[X, XL, XXL],那么就可以直接使用数值的映射{X: 1, XL: 2, XXL: 3}

3、apply()

def get_number(c):
    dic = {'S': 0, 'Q': 1, 'C': 2}
    return dic[c]

titanic_df['Embarked'] = titanic_df['Embarked'].apply(get_number)

4、LabelEncoder()

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()

titanic_df['Embarked'] = le.fit_transform(list(titanic_df['Embarked'])
test_df['Embarked'] = le.fit_transform(list(test_df['Embarked'])

如果要查看类别与数值的对应关系,可以

le.classes_

5、pd.get_dummies()

titanic_df = pd.get_dummies(titanic_df, columns=['Embarked'])

6、one-hot编码
通常来说,特征不都是连续的值而是由分类给出的。例如,一个人可以具有如下特征:
[“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]表示
但是,这样的表示不能用于Sklearn进行估计,因为离散(分类)特征,将特征值转化成数字时往往是不连续的。OneHotEncoder函数通过one-of-K (k之一)和 one-hot(独热)编码来解决这个问题。

参考:

https://www.kaggle.com/omarelgabry/a-journey-through-titanic
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html
http://blog.csdn.net/cheng9981/article/details/61650879

你可能感兴趣的:(数据处理与分析)