問題:英文名,有分開男性和女性用。例如 John 是男名, Mary 是女名。根據劉家傑的說法, Vivian 是男名, Vivien/Viviana 才是女名。有些名是男女都用,例如 Alex 、 Jacky 。人類在看到未見過的英文名,約略可以估到其性別。例如 Yulia 你會估是女名,而 Mikael 卻估是男名。為甚麼我們會這樣估呢?男女名的分辦,我們就好似有 intuition 那樣。但是,對於電腦,就算你給它非常常見的英文名如 Annie, Angus, Kelly, Kevin ,它也並不能分辨出來。
今次的目的是寫一個 function ,就稱它為 predGender() ,如輸入 predGender("ANNIE") ,它會回報 TRUE ,代表那是一個女名。而輸入 predGender(ANGUS") ,它會回報 FALSE 。
問題類型:此為一個 Supervised learning 的 classification 問題。合理的做法,是找一堆英文名,而此堆英文名是已經有人標示了是男名還是女名。問題是要用甚麼的 feature ,才能準確的分辨英文名屬男屬女。
數據:數據來自美國的 Census department 。根據 1990 年 Census 數據,它們編集了主流 90% 人的英文名列表,而且是有分開男性和女性兩個檔案。從數據可見,女性的名稱比男性為多,因為女名的花款較多。
未完成的 prototype:
Code: predGender
將數據隨機分成三份: Training, cross validation 和 test 。我先從 training set 找出了男女名稱最尾一字母的 distribution 。
從圖中所見,女名(黑線)多以 A, E, I 作結。那麼,我們是否可以用英文名的最尾字母估計名稱的姓別呢?在今次的例子,我用上了 Naïve Bayes 來設定模型,而 feature 就是英文名的最後一個字母。
根據模型,我輸入了以下的數據
WILLIAMS, VICTORIA, NEO, TRINITY, LISBETH, MIKAEL, DORIS
電腦的估計是
Male, Female, Male, Female, Female, Female, Male
其中 WILLIAMS 和 NEO 估中為男性, VICTORIA, LISBETH 也估中為女性,但是 MIKAEL 和 DORIS 卻估錯了。七中五,好像不錯吧,但事實真係咁好嗎?
我分別用了 Training set 和 CV set 來作檢驗。 Training 和 CV 的準確度如下:
Training
precision: 0.583
recall: 0.407
F1 score: 0.479
Cross validation
precision: 0.565
recall: 0.39
F1 score: 0.462
從結果可見,如此模型相當差。而比較 Training 和 CV 的準確度,兩者數目差不多地衰,故此模型是 underfit (high bias) 。而解決 high bias 的方法,是要更多的 feature 。
下一集會看看還有甚麼 feature 有用。