【火爐煉AI】機器學習002-標記編碼方法

煉丹老頑童發表於2018-08-04

【火爐煉AI】機器學習002-標記編碼方法

(本文所使用的Python庫和版本號: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

監督學習中的標記的形式有各種各樣,比如對於人臉識別的標記,可能是[“小紅”,“小花”,“翠花”。。。],這些標記對於機器學習來說,如同天書一般,故而為了讓機器學習“看懂”這些標記,需要將這些文字類的標記進行一定的編碼,形成比如【3,2,4,0,…】等形式.


1. 編碼方法

有很多python模組可以實現對標記進行編碼,此處使用scikit-learn模組中的preprocessing包來進行編碼。Talk is cheap, just show me the code….

# *****************對label進行編碼********************************
from sklearn import preprocessing

# 構建編碼器
encoder=preprocessing.LabelEncoder() # 先定義一個編碼器物件
raw_labels=['翠花','張三','王寶強','芙蓉姐姐','鳳姐','王寶強','鳳姐']
encoder.fit(raw_labels) # 返回自己的一個例項
print('編碼器列表:{}'.format(encoder.classes_)) # 返回編碼器中所有類別,已經排除了重複項
for index,item in enumerate(encoder.classes_):
    print('{} --> {}'.format(item,index))
    
# 使用編碼器來編碼新樣本資料
need_encode_labels=['王寶強','芙蓉姐姐','翠花']
# need_encode_labels=['王寶強','芙蓉姐姐','翠花','無名氏'] 
# '無名氏'不存在編碼器列表中,會報錯
encoded_labels=encoder.transform(need_encode_labels)
print('\n編碼之前的標記:{}'.format(need_encode_labels))
print('編碼之後的標記:{}'.format(encoded_labels))

# 使用編碼器將編碼數字解碼成原來的文字標記,注意最大值不能超過編碼器中的長度
encoded=[1,3,0,4]
# encoded=[1,3,0,4,5] # 5不存在與編碼器中,故報錯
decoded_labels=encoder.inverse_transform(encoded)
print('\n已經編碼的標記程式碼:{}'.format(encoded))
print('解碼後的標記:{}'.format(decoded_labels))
複製程式碼

-------------------------------------輸---------出--------------------------------

編碼器列表:['鳳姐' '張三' '王寶強' '翠花' '芙蓉姐姐'] 鳳姐 --> 0 張三 --> 1 王寶強 --> 2 翠花 --> 3 芙蓉姐姐 --> 4

編碼之前的標記:['王寶強', '芙蓉姐姐', '翠花'] 編碼之後的標記:[2 4 3]

已經編碼的標記程式碼:[1, 3, 0, 4] 解碼後的標記:['張三' '翠花' '鳳姐' '芙蓉姐姐']

--------------------------------------------完-------------------------------------

########################小**********結###############################

1,使用sklearn的preprocessing模組對標記進行編碼是非常簡單的,首先構建一個基於所有標記資料的編碼器,然後使用該編碼器進行編碼或解碼

2,需要注意,在編碼時,如果遇到編碼器中沒有的標記時會報錯,在解碼時也一樣。

#################################################################


注:本部分程式碼已經全部上傳到(我的github)上,歡迎下載。

參考資料:

1, Python機器學習經典例項,Prateek Joshi著,陶俊傑,陳小莉譯

相關文章