上一回說了資料採集的段落,這一回我們來講電腦怎麼處理資料吧。
先說,人類真的很強大,好比給人一個強而有力的握手這件事情其實非常的複雜。我們需要在三維空間中定位兩個物體並且讓兩個分別有六個維度自由度的物體觸碰且傳遞力量。能夠用來感知環境的卻是一對不在同一個平面上的眼睛。
我們很擅長處理視覺的資訊。很擅長處理手部細微的工作。然而讓電腦具備五感這件事其實極其困難。取得到的原始資訊在未經處理之前。看起來就像雜訊一樣
電腦怎麼理解世界的呢?
電腦將各式各樣的感測器取得的資訊,通通轉換成數字。這裡會涉及取樣頻率與取樣深度
- 聲音的數據其實是特定取樣頻率下的每個時間點振幅的紀錄,
假設是16位深度,範圍是-32768到32767。如44100hz 取樣頻率(每秒取樣44100次)
一段音檔可以被轉換為 “你好嗎?” → (0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, …)
- 影像數據則是取樣頻率下每幀凍結影像的每個像素的每個顏色都記錄下來
假設8 bit色彩深度(0~255), RGB三原色, 在 30hz攝影機 1024*768畫面底下的數據
一張狗的照片可以被表示為 ([[(0, 255, 30), (0, 255, 37) ….寬…], [(0, 255, 30), (0, 255, 37) ….] …高…])
- 文字對電腦來說就是更難理解的領域了,於是有一個學門為NLP (natural language processing) 專門在處理,可以是建立一個相關的字典萃取,抽象字的意思,或是將文字向量化,來對句意進行相關性建模。
電腦拿到一段文字的編碼其實很難理解這段字的意義是甚麼,我們可以透過這個線上工具來轉換看看電腦實際儲存了甚麼。在線Ascii編碼解碼工具,ASCII與中文互轉-愛工具 (chkaja.com)
那我們怎麼試圖讓電腦理解文字呢?
這邊舉一個最簡化的意思,我們對一段文字進行情緒分析,分別標記了兩個字典,
正面字典: [開心,滿意,愉快,享受]。
負面字典: [沒用,沒救,無效,失望,難過]
案例:有一個客人對服務的評論。我們希望藉由評論找出這個客人是不是真的滿意的
客人: 很開心客服Even 先生讓我沒用的電腦重獲新生,一開始我以為沒救了,很滿意這次愉快的客服體驗
這個客人的正面分數為[開心,滿意,愉快],總共是3分
這個客人的負面分數為[沒用,沒救],總共是2分
這位客人的評價為正面(3–2 > 0),總體來看應該還是比較滿意Even的
如果我有一個客服滿意度資料集,我就會新增一個欄位(is_positive),並且在這位客人評價的row,寫上一個 True。以上就是關於電腦怎麼理解資料以及怎麼特徵工程的簡單介紹
回到數字,數字為什麼又需要特徵工程呢。因為有些純量其實不容易關聯該值與目標(Target)的關係。
如我們希望找出肥胖人群,但只看體重不考慮身高,可能有比較嬌小但是過重的人。於是就特徵工程出BMI,綜合考量身高與體重。得出與目標肥胖人群更相關的BMI特徵。
如我們希望找出那些人熱衷公益,不能只看純時數,可能還要除上開始服務到現在已經幾年了來當作分母,相除有時也是很有效的特徵工程手段。我們將總服務時數除上總服務年資得到的年平均服務工時的這個心特徵就可以很有效描述了。 否則小王年資1年服務10小時,老李年資30年服務30小時。只看服務時數就可能失準。
關於數字的特徵工程還有很多特殊的技巧,我們先停在這。接著來介紹字串的處理方式。剛剛提到的特定文字萃取的方式可以是一個。
還有關於類別型的資料,比如鐵達尼號中Sex 有 “male" ,"female" 兩種。我們就可以建構兩個dummy的欄位。讓資料集不使用Sex這個欄位,改使用 "male”, “female” 這兩個欄位
import pandas as pd
df =pd.read_csv('data/train.csv')
X = df[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']]
y = df['Survived']
print(X.Sex.unique())
X.join(pd.get_dummies(X.Sex)).drop('Sex', axis=1)
這邊可以特別提一點,Pclass是艙等的意思,1是頭等艙,3是三等艙。像這種艙等其實也可以通過get dummy來分層三個獨立的欄位。但特別的是這個1~3艙等其實有一個大小級進的關係在,這時候保留他是一個數字,也可以在訓練中起到一定的效果。這就是ML自由度很高,可以讓資料工程師揮灑創意的地方。任何說法都可以聽起來有道理,也可能值得一試。
Embarked是登入的港口 就比較明確需要轉換了,轉換多個欄位可以用以下的語法
X.join(pd.get_dummies(X[['Sex', 'Embarked']])).drop(['Sex', 'Embarked'], axis=1)
這篇先介紹到這,下一篇我們將開始送train我們的模型