iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0

一、資料編碼

當拿到類別型資料特徵的時候,我們必須將文字轉換成數字供電腦去做計算。舉例來說:員工年齡分布(如上圖),員工所在部門(如下圖)。有發現轉換方式不太相同嗎?我們在下面來做講解。
https://ithelp.ithome.com.tw/upload/images/20210906/20140427COKeru5Jq0.png
https://ithelp.ithome.com.tw/upload/images/20210906/20140427EF7DVBCzRP.png

資料編碼一般分為Label Encoding 及 One-Hot Encoding兩種方法。

1. Label Encoding 跟 One-hot Encoding的差別

為何要分有順序跟無順序呢?因為如果把無順序的資料標示成1、2、3電腦會認為3>2>1,但實際上並非如此。所以最後會導致後面在跑模型的時候會不太準確。
https://ithelp.ithome.com.tw/upload/images/20210906/20140427C4yRv7eQBe.png

2. Label Encoding實作

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(df['你要轉換的特徵名稱'])
le.transform(df['你要轉換的特徵名稱'])

3. One-Hot Encoding實作

利用pandas的套件可以快速做出

資料集來源:https://aidea-web.tw/topic/2f3ee780-855b-4ea7-8fc8-61f26447af1d

#先生成虛擬變數
temp_department=pd.get_dummies(df_X["歸屬部門"],prefix="歸屬部門")
#將原先資料的特徵刪除
df_X=df_X.drop("歸屬部門",1)
#將原先資料與虛擬變數合併
df_X=pd.concat([df_X,temp_department],axis=1)

二、資料切割

機器學習模型需要資料才能訓練,如果將所有資料都丟給模型做訓練,這樣就沒有額外資料來評估模型的好壞,而為了避免模型可能會有過擬合 (Over-fitting) 的情形發生,需透過驗證/測試集評估模型是否過擬合。(如下圖)就有點類似學校考試的概念,如果一直給學生考一樣的考試,那他到最後幾乎就是把答案背起來而已,不會去暸解題目內容,看似這個學生考得很高分,但實際上他根本就不會,因此在丟給模型訓練前,我們要先將資料分配好。
https://ithelp.ithome.com.tw/upload/images/20210906/20140427jD8Zo4lEQ2.png
一般來說會將資料分成三份:

  1. 訓練資料:主要訓練的資料集。把它想成為了考試平時上課的內容。
  2. 驗證資料:驗證主要資料及模型的好壞。把它想成平時小考,測驗上課內容。
  3. 測試資料:我們預測的資料。把它想成大考,評估這整個所訓練出來的結果。

而在切分資料時又分成兩種方式:

1.正常順序切割

一般然說我們會將訓練資料與測試資料切割成8:2或7:3的比例

wilt_all = pd.read_csv('wilt_all.csv') #載入資料
#利用模型等比例切割
right_ratio_x_train, right_ratio_x_test, right_ratio_y_train, right_ratio_y_test = train_test_split(wilt_all, labels, test_size=0.2, random_state=666)
#轉換
right_ratio_y_train = le.transform(right_ratio_y_train)
right_ratio_y_test = le.transform(right_ratio_y_test)

把結果print出來

print('right_ratio_y_train class n:', sum(right_ratio_y_train==0))
print('right_ratio_y_train class w:', sum(right_ratio_y_train==1))
print('right_ratio_y_train ratio n:', sum(right_ratio_y_train==0)/len(right_ratio_y_train))
print('right_ratio_y_train ratio w:', sum(right_ratio_y_train==1)/len(right_ratio_y_train))
print('------------------------------------------')
print('right_ratio_y_test class n:', sum(right_ratio_y_test==0))
print('right_ratio_y_test class w:', sum(right_ratio_y_test==1))
print('right_ratio_y_test ratio n:', sum(right_ratio_y_test==0)/len(right_ratio_y_test))
print('right_ratio_y_test ratio w:', sum(right_ratio_y_test==1)/len(right_ratio_y_test))

https://ithelp.ithome.com.tw/upload/images/20210906/20140427yop5Txw3Ku.png
可以發現資料已經被我們等比例切割了。

2.K-fold Cross-validation

為了避免正常切割,導致有些資料訓練不到。因此衍生出將資料切成k份讓每個資料都輪流當訓練集跟驗證集。如下圖所示。
https://ithelp.ithome.com.tw/upload/images/20210906/201404275njS3014To.png

from sklearn.cross_validation import train_test_split
from sklearn.cross_validation import cross_val_score
#能夠利用cross validation計算模型之表現,看模型表現是否平均
NB_model = GaussianNB()
scores = cross_val_score(NB_model, right_ratio_x_train, right_ratio_y_train, cv=5, scoring='f1')
scores

三、結論

資料編碼跟資料分割都是資料前處理中重要的步驟,大家可以試著去找資料來做看看,順便判斷哪些資料需要做資料編碼,哪些不需要。不知不覺我們的挑戰也進行三分之一了,希望目前的教學對大家都有些許幫助,有什麼問題也歡迎拿出來一起討論喔。


上一篇
DAY09 資料前處理-異常值處理方法
下一篇
DAY11 資料前處理-資料不平衡處理方法
系列文
學資料科學的小孩不會變壞- 從入門到實戰全攻略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言