from sklearn import preprocessing

enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])  
enc.transform([[0, 1, 3]]).toarray()

"""
Explanation: 编码分类特征
在机器学习中,特征经常不是数值型的而是枚举型的.举个例子,一个人可能有 ["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值化特征,将分类特征的每个元素转化为一个值.
sklearn中相关的接口有:
接口|说明
---|---
preprocessing.OneHotEncoder([n_values, …])|独热编码,要求训练和转换的参数为int型,输出的为
preprocessing.LabelBinarizer([neg_label, …])|将枚举型特征转换为二值化特征矩阵,输入为int型或者字符串型
preprocessing.MultiLabelBinarizer([classes, …])|将复数枚举型特征转换为二值化特征矩阵,输入为int型或者字符串型组成的set
preprocessing.LabelEncoder|将枚举型特征编码,输入为int型或者字符串型
独热编码
End of explanation
"""


le = preprocessing.LabelEncoder()
le.fit([1, 2, 2, 6])
le.classes_

le.transform([1, 1, 2, 6])# 编码

le.inverse_transform([0, 0, 1, 2]) # 解码

"""
Explanation: 枚举型特征编码
针对int类型
End of explanation
"""


le = preprocessing.LabelEncoder()
le.fit(["paris", "paris", "tokyo", "amsterdam"])
list(le.classes_)

le.transform(["tokyo", "tokyo", "paris"])

list(le.inverse_transform([2, 2, 1]))

"""
Explanation: 针对str类型
End of explanation
"""


lb = preprocessing.LabelBinarizer()
lb.fit([1, 2, 6, 4, 2])
lb.classes_

lb.transform([1, 6])

"""
Explanation: 二值化特征
针对单一枚举类型
End of explanation
"""


lb = preprocessing.MultiLabelBinarizer()
lb.fit_transform([(1, 2), (3,)])
lb.classes_

"""
Explanation: 针对多枚举类型
End of explanation
"""


