通過(guò)姓名預(yù)測(cè)性別原來(lái)這么簡(jiǎn)單?。ǜ酱a教程)
說(shuō)在前面:
性別是可變的,名字是一個(gè)較弱的性別預(yù)測(cè)因子。本文用到的是Quis應(yīng)用的功能,是Joachim Valente創(chuàng)建的一個(gè)聯(lián)系人應(yīng)用程序。
Quis是一個(gè)聯(lián)系人應(yīng)用程序,用于按時(shí)間順序?qū)β?lián)系人進(jìn)行排序并在地圖上查看它們,以及其他實(shí)驗(yàn)性功能。其中一個(gè)功能是按性別過(guò)濾聯(lián)系人,即使這些信息在聯(lián)系人數(shù)據(jù)庫(kù)中是不可用的。
過(guò)濾聯(lián)系人功能是過(guò)濾器通過(guò)一個(gè)輕量級(jí)的監(jiān)督機(jī)器學(xué)習(xí)模型——更準(zhǔn)確地說(shuō)是一個(gè)計(jì)數(shù)向量化器加上邏輯回歸——在應(yīng)用程序中嵌入了來(lái)自世界各地的數(shù)十萬(wàn)個(gè)名字的訓(xùn)練。
本文將分解整個(gè)過(guò)程,從在 Jupyter notebook 中訓(xùn)練模型到將其部署到生產(chǎn)環(huán)境。代碼在公眾號(hào),回復(fù)“姓名”得。
?

帶有本文中描述的性別過(guò)濾器的聯(lián)系人應(yīng)用程序 Quis 的屏幕截圖
準(zhǔn)備
本教程要用到Python/Jupyter notebooks, Pandas 和Scikit-Learn。如果還沒(méi)學(xué)會(huì)這些,關(guān)注公眾號(hào),免費(fèi)資料可以領(lǐng)教程的寶貝們!
首先,提出一個(gè)問(wèn)題
世界上有數(shù)百萬(wàn)個(gè)名字,我們無(wú)法將它們?nèi)看鎯?chǔ)在像智能手機(jī)這樣資源受限的環(huán)境中。
假設(shè)100萬(wàn)個(gè)名字有10個(gè)字符,這將需要1,000,000 x (10+1)個(gè)字節(jié)≈10 MB平均數(shù)。此外,還可能會(huì)偶然發(fā)現(xiàn)以前從未見(jiàn)過(guò)的名字,比如Khaleesi或Anakin,但是你還得去預(yù)測(cè)他們的性別。
解決方案是訓(xùn)練一個(gè)模型,來(lái)學(xué)習(xí)辨別女性和男性名字。
機(jī)器學(xué)習(xí)教程
一個(gè)有監(jiān)督的機(jī)器學(xué)習(xí)項(xiàng)目通常包括 5 個(gè)步驟。

步驟1:收集訓(xùn)練數(shù)據(jù)
第一步也是最關(guān)鍵的一步是收集訓(xùn)練數(shù)據(jù)。
關(guān)于姓名和性別,在網(wǎng)上可以免費(fèi)獲得多種數(shù)據(jù)集,例如這個(gè)包含1930年到2015年美國(guó) 95,000個(gè)名字的數(shù)據(jù)集:
https://data.world/howarder/gender-by-name
或者這個(gè)包含來(lái)自182個(gè)國(guó)家的177,000個(gè)名字的數(shù)據(jù)集:
https://data.world/howarder/gender-by-name
我們將使用第二個(gè)數(shù)據(jù)集,下載名為wgnd_noctry.tab CSV文件的文件。
處理數(shù)據(jù)
創(chuàng)建一個(gè)新的 Jupyter 筆記本。加載數(shù)據(jù)預(yù)覽其內(nèi)容:


預(yù)處理
我們的目標(biāo)是預(yù)測(cè)給定名稱(輸入X)的性別(輸出或標(biāo)簽y)。此外,我們需要一些預(yù)處理來(lái)清理原始數(shù)據(jù)。
拆分訓(xùn)練和測(cè)試數(shù)據(jù)
在有監(jiān)督的機(jī)器學(xué)習(xí)問(wèn)題中,我們總是留出一部分?jǐn)?shù)據(jù)集(通常在 10% 到 20% 之間)用于測(cè)試—它允許我們計(jì)算模型的準(zhǔn)確性,并驗(yàn)證我們的模型按照預(yù)期工作。Scikit-Learn為此提供了方便的功能。

(n,) 表示大小為 n 的向量
步驟 2—生成特征
收集數(shù)據(jù)后,下一步是構(gòu)建用作模型輸入的特征。在這種情況下,可能會(huì)想到許多特征:字母的數(shù)量、元音的數(shù)量、名稱是否以a或者o結(jié)尾(對(duì)西班牙語(yǔ)或意大利語(yǔ)名稱有用)、是否以輔音結(jié)尾,等等。
但是,我們將自動(dòng)構(gòu)建數(shù)千個(gè)功能,而不是手動(dòng)設(shè)計(jì)功能。
How?
使用計(jì)數(shù)向量器?
計(jì)數(shù)向量化器是一種自動(dòng)從語(yǔ)料庫(kù)構(gòu)建詞匯和特征的方法。更準(zhǔn)確地說(shuō),a ( p – q )-char?計(jì)數(shù)向量化器通過(guò)收集出現(xiàn)在語(yǔ)料庫(kù)中p ≤ n ≤ q?的n-gram來(lái)生成特征,這是p和q之間大小的子串的另一種說(shuō)法。
讓我們舉一個(gè)具體的例子。假設(shè)我們有五個(gè)名字:Chris、Christina、Marius、Marta 和 Matthias。然后,一個(gè) (2-4)-char 計(jì)數(shù)向量化器將學(xué)習(xí)以下詞匯。

詞匯表是在訓(xùn)練示例中找到的二元組、三元組和四元組的集合
使用該詞匯表,計(jì)數(shù)向量化器可以將任何名稱(在語(yǔ)料庫(kù)中或不在語(yǔ)料庫(kù)中)轉(zhuǎn)換為一個(gè)大的稀疏向量v,其中v(i)是i名稱中標(biāo)記出現(xiàn)的次數(shù)。例如,名稱 Rita 和 Laetitia 將被轉(zhuǎn)換為大小為 55 的向量,如下所示:

“Tina”這個(gè)名字包含三個(gè)二元組、兩個(gè)三元組和一個(gè)四元組

“Laetitia”這個(gè)名字包含兩次雙字母“ti”。它包括我們?cè)~匯表中沒(méi)有的其他 n-gram,如“l(fā)ae”
整個(gè)過(guò)程可以使用Scikit-Learn分3行完成。
你會(huì)注意到幾個(gè)參數(shù):
min_df?是語(yǔ)料庫(kù)中某個(gè)標(biāo)記出現(xiàn)在詞匯表中的最少次數(shù)。(例如,khal如果它以 Khaleesi 的名字只出現(xiàn)一次,我們將丟棄)。min_df有助于過(guò)度擬合并減少我們的詞匯表和模型的大小。
ngram_range?令牌中的最小和最大字符數(shù)。
analyzer='char'?意味著我們使用字符級(jí)標(biāo)記化而不是字級(jí)標(biāo)記。
preprocessor?是在構(gòu)建詞匯表之前應(yīng)用于每個(gè)名稱的函數(shù)。在這里,我們添加了前導(dǎo)^和尾隨$,這是表示開(kāi)始和結(jié)束的常見(jiàn)做法。這很重要,因?yàn)槔?,a姓名末尾的字母a與中間的字母大不相同。
讓我們來(lái)探索學(xué)習(xí)到的詞匯。提示:Sckit-Learn估計(jì)器在調(diào)用.fit()后學(xué)到的參數(shù)總是以下劃線作為后綴。


第3步:模型架構(gòu)
多虧了計(jì)數(shù)向量化器,我們現(xiàn)在可以將訓(xùn)練集中的15萬(wàn)個(gè)名字轉(zhuǎn)換成8414個(gè)數(shù)字特征。
我們需要訓(xùn)練一個(gè)模型來(lái)將這8414個(gè)數(shù)字轉(zhuǎn)換為一個(gè)預(yù)測(cè),該預(yù)測(cè)表示一個(gè)名字是女性(p = 0)或男性(p = 1)的可能性。
有許多架構(gòu)可供選擇:邏輯回歸、決策樹(shù)、神經(jīng)網(wǎng)絡(luò)、SVM 等等。
但是,因?yàn)槲覀儗⒃诘?步中序列化模型并將其嵌入到應(yīng)用程序中,所以我們希望它盡可能輕量級(jí),所以我們使用邏輯回歸。
邏輯回歸模型的形式為f(x1,…Xn = sigmoid(k1*x1 + k2*x2 +…+ kn*xn + b),其中sigmoid(x) = 1 / (1 + exp(-x)),它總是在0和1之間,可以解釋為概率。
該模型通過(guò)一種稱為隨機(jī)梯度下降(SGD)的迭代過(guò)程,逐步減小其對(duì)提供給它的訓(xùn)練示例的預(yù)測(cè)誤差,從而學(xué)習(xí)其參數(shù)k1, k2,…,kn(稱為權(quán)重)和b(稱為偏差)。

邏輯回歸模型將向量(例如,計(jì)數(shù)向量化器的輸出)映射到概率
為了避免兩步過(guò)程——首先訓(xùn)練計(jì)數(shù)向量化器,然后訓(xùn)練邏輯回歸——我們可以使用 Scikit-Learn管道。管道將連續(xù)步驟包裝到單個(gè)模型中,因此只需調(diào)用.fit()一次。
現(xiàn)在可以預(yù)測(cè)性別了!


它似乎做得不錯(cuò)。你可以注意到,對(duì)于用拉丁字符(Ma和Yang)轉(zhuǎn)錄的中文名字來(lái)說(shuō),這并不是很有效,不過(guò)算是意料之中的。
我們計(jì)算原始概率來(lái)獲得信心。下面的例子表明,F(xiàn)ran?oise勉強(qiáng)正確,但非常自信吉娜是一個(gè)女性的名字。

Optional. 我們可以進(jìn)一步探索,看看模型認(rèn)為哪些n-gram是典型的男性化和女性化。

我們可以識(shí)別-nice,一個(gè)表示勝利的女性后綴,后綴-a可能是世界上最常見(jiàn)的女性后綴,以及前綴Nya-在斯瓦希里語(yǔ)名稱中很常見(jiàn)。

我們可以承認(rèn)ABD-其前綴很多男性阿拉伯名字,日本后綴-ICH和-io和-lino這是在意大利和西班牙的男性常見(jiàn)的后綴。
最后,我們可以評(píng)估模型在測(cè)試集上的準(zhǔn)確程度;換句話說(shuō),它預(yù)測(cè)正確性別的頻率。

87%的準(zhǔn)確率——對(duì)于我們的第一次嘗試來(lái)說(shuō)還不錯(cuò),但肯定可以改進(jìn)。
第4步-部署
許多書(shū)籍和在線教程都沒(méi)有涵蓋這一步,但這是至關(guān)重要的一步。一旦你在Jupyter notebook中訓(xùn)練了一個(gè)模型,你如何在生產(chǎn)中使用它?
最簡(jiǎn)單的方法是使用joblib(對(duì) Python 的改進(jìn)pickle)序列化您的模型:
但是,它有兩個(gè)明顯的缺點(diǎn):如果您的notebook和prod中的Scikit-Learn版本不同,它可能會(huì)中斷,并且它假定您的生產(chǎn)環(huán)境使用Python。
已經(jīng)開(kāi)發(fā)了更精細(xì)的解決方案,如ONNX(https://onnx.ai/),但因?yàn)槲覀冇心康牡乇3帜P秃?jiǎn)單,我們將做一些不同的事情:手動(dòng)序列化它。我們需要保存參數(shù)——模型學(xué)到的東西,比如詞匯和邏輯回歸權(quán)重和偏差——并編寫(xiě)我們自己的計(jì)數(shù)向量化器和邏輯回歸版本。

當(dāng)然,在實(shí)踐中,會(huì)將此代碼轉(zhuǎn)換為編寫(xiě)服務(wù)器的語(yǔ)言。
這樣的模型需要多少空間?
與存儲(chǔ)詳盡列表相比,這減少100倍的空間,非常適合嵌入到智能手機(jī)應(yīng)用程序中。
步驟5—監(jiān)控和迭代
將模型部署到生產(chǎn)環(huán)境后,應(yīng)對(duì)其進(jìn)行監(jiān)控以衡量其實(shí)際性能。不幸的是,我們的模型并不完美,需要迭代才能變得更好。這里有一些問(wèn)題和改進(jìn)的想法。
通過(guò)使用模型架構(gòu),毫無(wú)疑問(wèn)可以提高 87% 的準(zhǔn)確率。例如,我們可以嘗試用另一種類型的分類器替換邏輯回歸,或者使用計(jì)數(shù)向量化器超參數(shù)。(如果這樣做,請(qǐng)記住使用驗(yàn)證集。)
有些名字在一些國(guó)家是陽(yáng)性的,而在另一些國(guó)家是陰性的(比如Alexis或Andrea,在美國(guó)通常是陰性的,而在法國(guó)和意大利則分別是男性)。您可以將國(guó)家作為特征添加到模型中?;蛘?,您可以為每個(gè)國(guó)家訓(xùn)練一個(gè)模型。
詞匯量可能仍然太大,這對(duì)模型大小來(lái)說(shuō)是一個(gè)問(wèn)題,并且會(huì)引入過(guò)擬合。一種解決方案是添加正則化,例如通過(guò)增加min_df或減少ngram_range。
當(dāng)前數(shù)據(jù)集包含數(shù)十萬(wàn)個(gè)名稱,無(wú)論它們的受歡迎程度如何,它們都被一視同仁。然而,實(shí)際上,常見(jiàn)名稱的錯(cuò)誤比不常見(jiàn)名稱的錯(cuò)誤更嚴(yán)重,因?yàn)樗鼈儠?huì)影響更多用戶??赡艿慕鉀Q方法包括從訓(xùn)練集中刪除最不常見(jiàn)的名稱并使用名稱流行度作為樣本權(quán)重。
有些名字喜歡Alex和Leslie被兩性普遍使用。我們可以為男女通用或非性別名稱引入第三個(gè)標(biāo)簽類。
參考文檔:
[0] Raffo, Julio; Lax-Martinez, Gema, 2018, “WGND 1.0”,
https://doi.org/10.7910/DVN/YPRQH8, Harvard Dataverse, V1,
UNF:6:bUIQ2Bd/6h9Bup1ZI2PnwA== [fileUNF]
文章來(lái)源:
https://pub.towardsai.net/predicting-name-gender-from-notebook-to-production-99e51d2aabd7
免責(zé)聲明:所載內(nèi)容來(lái)源互聯(lián)網(wǎng),僅供參考(如有錯(cuò)漏歡迎指正)。轉(zhuǎn)載稿件版權(quán)歸原作者和機(jī)構(gòu)所有,如有侵權(quán),請(qǐng)聯(lián)系我們刪除。