我們將介紹一些強(qiáng)大的,但是在機(jī)器學(xué)習(xí)中普遍適用的技術(shù)。閱讀之后,你應(yīng)該具備在你自己的領(lǐng)域著手進(jìn)行具體機(jī)器學(xué)習(xí)實(shí)驗(yàn)的相應(yīng)知識(shí)。 我們結(jié)合一個(gè)Python擴(kuò)展的“案例研究”:我們可以如何構(gòu)建用于檢測(cè)信用卡詐騙的機(jī)器學(xué)習(xí)模型?(雖然我們會(huì)使用詐騙檢測(cè)語言,所做的大部工作是在微小修改基礎(chǔ)上適用于其他分類問題,例如,廣告點(diǎn)擊預(yù)測(cè)。)隨著時(shí)間的推移,我們會(huì)遇到許多機(jī)器學(xué)習(xí)的關(guān)鍵思想和術(shù)語,包括邏輯回歸、決策樹、隨機(jī)森林、正向預(yù)測(cè)(True Positive)和負(fù)向預(yù)測(cè)(False Positive)、交叉驗(yàn)證(cross-validation),以及受試者工作特征(Receiver Operating Characteristic,簡稱ROC)曲線和曲線以下區(qū)域(Area Under the Curve,簡稱AUC)曲線。 在線銷售產(chǎn)品的企業(yè)不可避免地需要應(yīng)對(duì)欺詐行為。一個(gè)典型的欺詐交易,詐騙者使用偷來的信用卡號(hào)碼去在線網(wǎng)站購買商品。欺詐者稍后會(huì)在其他地方以打折形式銷售這些商品,中飽私囊,然而企業(yè)必須承擔(dān)“退款”成本。你可以從這里獲取信用卡詐騙的詳細(xì)內(nèi)容。 讓我們假設(shè)自己是一個(gè)電子商務(wù)企業(yè),并且已經(jīng)應(yīng)對(duì)詐騙有一些時(shí)間了,我們想要使用機(jī)器學(xué)習(xí)幫助解決問題。更具體地說,每次交易進(jìn)行時(shí),我們想要去預(yù)測(cè)是否可以證明是詐騙者(例如,是否授權(quán)的持卡人不是交易人),這樣我們可以相應(yīng)地采取行動(dòng)。這類機(jī)器學(xué)習(xí)問題被稱為分類,因?yàn)槲覀冋谧龅木褪前衙抗P收入歸入欺詐或非欺詐這兩類中的其中一類。 對(duì)于每一筆歷史付款,我們有一個(gè)布爾值指示表明這筆交易是否欺詐(fraudulent),以及一些我們認(rèn)為可能表明欺詐的其他屬性,例如,以美元支付的金額(amount)、卡片開卡國家(card_country),以及這張卡片同一天內(nèi)在我們企業(yè)的支付次數(shù)(card_use_24h)。因此,極有可能我們建立預(yù)測(cè)模型的數(shù)據(jù)看起來如以下CSV所示: fraudulent,charge_time,amount,card_country,card_use_24hFalse,2015-12-31T23:59:59Z,20484,US,0False,2015-12-31T23:59:59Z,1211,US,0False,2015-12-31T23:59:59Z,8396,US,1False,2015-12-31T23:59:59Z,2359,US,0False,2015-12-31T23:59:59Z,1480,US,3False,2015-12-31T23:59:59Z,535,US,3False,2015-12-31T23:59:59Z,1632,US,0False,2015-12-31T23:59:59Z,10305,US,1False,2015-12-31T23:59:59Z,2783,US,0 有兩個(gè)重要的細(xì)節(jié)我們會(huì)在討論里跳過,但是我們需要牢記于心,因?yàn)樗鼈兺瑯又匾?,甚至超過我們?cè)谶@里介紹的模型構(gòu)建問題。 首先,確定我們認(rèn)為存在詐騙行為的特征是一個(gè)數(shù)據(jù)科學(xué)問題。在我們的例子中,我們已經(jīng)確認(rèn)支付的金額、這張卡片是在哪個(gè)國家發(fā)行的,以及過去一天里我們收到的卡片交易次數(shù)等作為特征,我們認(rèn)為這些特征可能可以有效預(yù)測(cè)詐騙。一般來說,你將需要花費(fèi)許多時(shí)間查看這些數(shù)據(jù),以決定什么是有用的,什么是沒有用的。 其次,計(jì)算特征值的時(shí)候存在數(shù)據(jù)基準(zhǔn)問題:我們需要所有歷史樣本值用于訓(xùn)練模型,但是我們也需要把他們的實(shí)時(shí)付款值加進(jìn)來,用以正確地對(duì)新的交易加入訓(xùn)練。當(dāng)你開始擔(dān)憂詐騙之前,你已經(jīng)維持和記錄了過去24小時(shí)滾動(dòng)記錄的信用卡使用次數(shù),這樣如果你發(fā)現(xiàn)特征是有利于詐騙檢測(cè)的,你將會(huì)需要在生產(chǎn)環(huán)境和批量環(huán)境中分別在計(jì)算中使用它們。依賴于定義的不同特征,結(jié)果很有可能是不一樣的。 這些問題合在一起通常被認(rèn)為是特征工程,并且通常是工業(yè)級(jí)機(jī)器學(xué)習(xí)領(lǐng)域最常涉及(有影響)的部分。 讓我們以一個(gè)最基本的模型開始,一個(gè)線性模型。我們將會(huì)發(fā)現(xiàn)系數(shù)a、b、...、z,如下 對(duì)于每一筆支付,我們會(huì)將amount、card_country和card_use_24h的值代入到上面的公式中,如果概率大于0.5,我們會(huì)“預(yù)測(cè)”這筆支付是欺詐的,反之我們將會(huì)預(yù)測(cè)它是合法的。 在我們討論如何計(jì)算a、b、...、z之前,我們需要解決兩個(gè)當(dāng)前問題:
為了解決問題(1),我們會(huì)建立一個(gè)稱為詐騙者的log-odds模型,而不是直接通過p = Probability(fraud)構(gòu)建模型,所以我們的模型就變成 如果一個(gè)事件發(fā)生的概率為p,它的可能性是p / (1 - p),這就是為什么我們稱公式左邊為“對(duì)數(shù)幾率(log odds)”或者“l(fā)ogit”。 考慮到a、b、...、z這些值和特征,我們可以通過反轉(zhuǎn)上面給出的公式計(jì)算預(yù)測(cè)詐騙概率,得到以下公式 詐騙p的概率是線性函數(shù)的轉(zhuǎn)換函數(shù)L=a x amount + b x card_use_24h + …,看起來如下所示: 不考慮線性函數(shù)的值,sigmoid映射為一個(gè)在0和1之間的數(shù)字,這是一個(gè)合法的概率。 為了解決問題(2),我們會(huì)使用分類變量 card_country(拿N個(gè)不同值中的1個(gè))并且擴(kuò)展到N-1“虛擬”變量。這些新的特征是布爾型格式,card_country = AU、card_country = GB等等。我們只是需要N-1“虛擬”,因?yàn)楫?dāng)N-1虛擬值都是false的時(shí)候N值是必然包含的。為了簡單起見,讓我們假設(shè)card_country可以僅僅使用AU、GB和US三個(gè)值中的一個(gè)。然后我們需要兩個(gè)虛擬變量去對(duì)這個(gè)值進(jìn)行編碼,并且我們想要去適配的模型(例如,發(fā)現(xiàn)系數(shù)值)是: 模型類型被稱為一個(gè)邏輯回歸。 我們?nèi)绾未_定a、b、c、d和Z的值?讓我們以隨機(jī)選擇a、b、c、d和Z的方式開始。我們可以定義這套猜測(cè)的可能性如: 也就是說,從我們的數(shù)據(jù)集里取出每一個(gè)樣本,并且計(jì)算詐騙p的預(yù)測(cè)概率,提供給猜測(cè)a、b、c、d和Z(每個(gè)樣本的特征值)的值使用: 對(duì)于每個(gè)實(shí)際上是欺詐的樣本,我們希望p比較接近1,而對(duì)于每一個(gè)不是詐騙的樣本,我們希望p接近0(所以1-p應(yīng)該接近1)。因此,我們對(duì)于所有欺詐樣本采用p產(chǎn)品,對(duì)于所有非欺詐樣本采用1-p產(chǎn)品,用以得到評(píng)估,猜測(cè)a、b、c、d和Z有多好。我們想讓似然函數(shù)盡可能大(例如,盡可能地接近1)。開始我們的猜測(cè),我們迭代地調(diào)整a、b、c、d和Z,提高可能性,直到我們發(fā)現(xiàn)不可以再通過擾動(dòng)系數(shù)提升它的值。一種常用的優(yōu)化方式是隨機(jī)梯度下降。 現(xiàn)在我們將會(huì)使用標(biāo)準(zhǔn)的Python開源工具實(shí)踐我們剛剛討論完的原理。我們將會(huì)使用pandas,它給Python帶來了類似于R語言的大規(guī)模數(shù)據(jù)科學(xué)的API(R-like data frames),以及scikit-learn,它是一個(gè)熱門的機(jī)器學(xué)習(xí)包。讓我們對(duì)之前描述過的CSV文件命名為“data.csv”;我們可以上傳數(shù)據(jù)并看一下下面的代碼: 我們可以使用如下代碼編碼card_country成為合適的虛擬變量 現(xiàn)在大規(guī)模數(shù)據(jù)幀數(shù)據(jù)擁有了所有我們需要的數(shù)據(jù)、虛擬變量以及所有用于訓(xùn)練我們的模型的數(shù)據(jù)。我們對(duì)目標(biāo)進(jìn)行切分(在這種欺詐情況下嘗試預(yù)測(cè)變量)以及用scikit需要的屬性作為不同的輸入?yún)?shù)。 在進(jìn)行模型訓(xùn)練之前,我們還有一個(gè)問題需要討論。我們希望我們的模型歸納充分,例如,當(dāng)對(duì)付款進(jìn)行分類時(shí)應(yīng)該是準(zhǔn)確的,它應(yīng)該是我們之前沒有見過的方式,而不應(yīng)該僅僅是之前見過那些在支付時(shí)計(jì)算的特殊模式。為了確保不會(huì)在現(xiàn)有的數(shù)據(jù)中過度擬合模型成為噪聲,我們將會(huì)分割數(shù)據(jù)為兩個(gè)訓(xùn)練集,一個(gè)訓(xùn)練集會(huì)被用來評(píng)估模型參數(shù)(a、b、c、d和Z)以及驗(yàn)證集(也被叫做測(cè)試集),另一個(gè)數(shù)據(jù)集會(huì)被用來計(jì)算模型性能指標(biāo)(下一章我們會(huì)介紹)。如果一個(gè)模型是過度擬合的,它會(huì)在訓(xùn)練集上表現(xiàn)良好(因?yàn)樗鼤?huì)在該集合中學(xué)習(xí)模式),但是在驗(yàn)證集上表現(xiàn)較差。還有其他的交叉驗(yàn)證方式(例如,k-fold交叉驗(yàn)證),但是“測(cè)試訓(xùn)練”分離會(huì)適合我們這里的目的。 我們使用sckit可以很輕松地分割數(shù)據(jù)為訓(xùn)練和測(cè)試集,如下: 在這里例子中,我們會(huì)使用數(shù)據(jù)的2/3用于訓(xùn)練模型,數(shù)據(jù)的1/3用于驗(yàn)證模型。我們現(xiàn)在準(zhǔn)備去訓(xùn)練模型,在此它只是個(gè)瑣碎小事: 該擬合函數(shù)運(yùn)行擬合程序(最大化上面提到的似然函數(shù)),然后我們可以針對(duì)a、b、c、d(在coef_)和Z(在intercept_)的值查詢返回的對(duì)象。因此我們的最終模型是 一旦訓(xùn)練了模型之后,我們就需要去確定這個(gè)模型在預(yù)測(cè)感興趣的變量上究竟有多好了(在本例子中,該布爾值表明該支付是否存在欺詐)。回想一下我們?cè)?jīng)說過希望對(duì)支付按照欺詐進(jìn)行分類,如果概率(欺詐)大于0.5,我們希望將其歸類為合法的。針對(duì)一個(gè)模型和一個(gè)分類規(guī)則的性能評(píng)定方式,通常使用兩個(gè)變量,如下所示:
評(píng)估分類性能有很多方式,我們會(huì)鎖定這兩個(gè)變量。 理想情況下,假陽性率將會(huì)接近0并且真陽正率會(huì)接近1。當(dāng)我們改變概率閾值時(shí)我們把一筆費(fèi)用分類為欺詐的(上面我們說是0.5,但是我們可以選擇0和1之間的任何值,越小的值意味著我們更加積極地標(biāo)記支付為欺詐的,而高的值意味著我們更加保守),假陽性率和真陽正率勾畫了一個(gè)曲線,這個(gè)曲線依賴于我們的模型有多好。我們稱之為受試者工作特征曲線(ROC曲線),可以使用scikit很容易計(jì)算出來: 變量fpr、tpr和閾值包含了所有ROC曲線的數(shù)據(jù),但是我們挑選了一些有針對(duì)性的樣本:如果概率(欺詐)大于0.514,而假陽性率是0.374,真陽性率是0.681時(shí),我們假定該費(fèi)用為欺詐。我們所選的ROC曲線及描繪點(diǎn)為: 模型性能較好,越接近ROC曲線(上面藍(lán)色的線),越會(huì)緊靠圖形左上方的邊框。注意ROC曲線可以告訴你模型有多好,可以使用一個(gè)AUC數(shù)計(jì)算,或者查看曲線下的面積。AUC值越接近于1,模型性能越好。 當(dāng)然,當(dāng)你把模型值放入生產(chǎn)環(huán)境并使用它時(shí),你通常會(huì)需要去通過我們上面采用的方式,即比較他們的閾值方式采取行動(dòng)輸出概率模型,如果概率(欺詐)>0.5,我們認(rèn)為一筆費(fèi)用被假設(shè)為是欺詐的。因此,對(duì)于一個(gè)特定的應(yīng)用程序,模型性能對(duì)應(yīng)于ROC曲線上的一個(gè)點(diǎn),曲線整體再一次僅僅控制了假陽性率和真陽正率之間的交易平衡,例如,政策選擇范圍內(nèi)的處置方式不同。 上述的邏輯回歸模型是線性機(jī)器學(xué)習(xí)模型的一個(gè)示例。想象一下,我們有的每一筆支付示例是空間里的一個(gè)點(diǎn),這個(gè)點(diǎn)的坐標(biāo)就是特征值。如果我們僅僅有兩個(gè)特征值,每個(gè)示例點(diǎn)會(huì)是X-Y平面上的一個(gè)點(diǎn)。如果在我們可以使用線性函數(shù)把無欺詐樣本和欺詐者樣本區(qū)分開時(shí),通常類似于邏輯回歸的線性模型就能較好地運(yùn)行,這意味著幾乎所有欺詐樣本處于一條線的一邊,而幾乎所有的非欺詐樣本處于這條線的另一邊。 通常情況下,預(yù)測(cè)特征和目標(biāo)變量之間的關(guān)系,我們?cè)噲D預(yù)測(cè)這個(gè)關(guān)系是非線性的,在這種情況下,我們需要使用非線性模型計(jì)算關(guān)系。一個(gè)強(qiáng)有力的、較為直觀的非線性模型是決策樹,如下所示: 對(duì)于每個(gè)節(jié)點(diǎn),我們將特定特征的值和一些閾值進(jìn)行比較,根據(jù)比較結(jié)果分出向左還是向右。我們繼續(xù)以這種方式(類似一個(gè)于二十問的游戲,雖然數(shù)目不需要二十層深度),直到我們到達(dá)樹木的樹葉。樹葉由我們訓(xùn)練集里的所有的樣本組成,比較這棵樹上的每一個(gè)節(jié)點(diǎn)的滿意路徑,示例樹葉上欺詐那一部分被模型報(bào)告預(yù)測(cè)的概率判定為欺詐。當(dāng)我們有新的樣本需要被分類時(shí),直到到達(dá)樹葉之前,我們生成它的特征并且開始玩“二十問的游戲”,然后預(yù)測(cè)欺詐的可能性,并描述如下。 雖然我們不會(huì)去深究樹是如何生成的細(xì)節(jié)內(nèi)容(雖然,簡單來說我們就是為每一個(gè)節(jié)點(diǎn)選擇特征和閾值,最大化信息增益或者辨別力概念,即上述圖表中報(bào)告的基尼系數(shù),并在達(dá)到預(yù)先指定的一些停止標(biāo)準(zhǔn)前一直進(jìn)行遞歸),使用scikit訓(xùn)練決策樹模型就像訓(xùn)練邏輯回歸一樣容易(或者事實(shí)上在任何其他模型上): 決策樹的一個(gè)問題是它們很容易被過度擬合,一棵很深的樹的每個(gè)葉子僅僅是訓(xùn)練數(shù)據(jù)里的一個(gè)示例,通常會(huì)計(jì)算每個(gè)樣本的噪音,并且可能不是常見趨勢(shì),但是隨機(jī)森林模型可以幫助解決這個(gè)問題。在一個(gè)隨機(jī)森林中,我們訓(xùn)練大量的決策樹,但是每棵樹的訓(xùn)練僅僅是我們現(xiàn)有的數(shù)據(jù)的一個(gè)子集,并且當(dāng)構(gòu)建每棵樹時(shí)我們僅僅考慮了切分的子集特征。所預(yù)測(cè)的欺詐的概率是森林里所有樹所生產(chǎn)的平均概率。僅基于數(shù)據(jù)子集對(duì)每棵樹進(jìn)行訓(xùn)練,僅將特征的子集作為每個(gè)節(jié)點(diǎn)的分離候選來考慮,減少樹木之間的相關(guān)性,讓過度擬合更少一些。 綜上所述,當(dāng)特征和目標(biāo)變量之間的關(guān)系是線性時(shí),像邏輯回歸這樣的線性模型是適當(dāng)?shù)?,或者?dāng)你希望分離任務(wù)特征對(duì)預(yù)測(cè)的影響(因?yàn)檫@樣可以直接讀取回歸系數(shù))。另一方面,像決策樹這樣的非線性模型和隨機(jī)森林是很難解釋的,但是他們可以被用來計(jì)算更復(fù)雜的關(guān)系。 訓(xùn)練一個(gè)機(jī)器學(xué)習(xí)模式可以被認(rèn)為僅僅是使用機(jī)器學(xué)習(xí)解決業(yè)務(wù)問題過程的第一步。正如上面描述的,模型訓(xùn)練通常必須在特征工程開始工作前完成。一旦有了模型就需要去產(chǎn)品化它了,也就是說,讓這個(gè)模型可以用于生產(chǎn)環(huán)境并可以采取適當(dāng)?shù)男袆?dòng)(例如,阻止被評(píng)估為欺詐的交易)。 雖然我們不會(huì)在這里談?wù)摷?xì)節(jié),但是產(chǎn)品化會(huì)引入許多挑戰(zhàn),例如,你可以使用Python部署模型,但是你的生產(chǎn)環(huán)境軟件棧使用的是Ruby。如果出現(xiàn)這種情況,你將會(huì)需要讓你的模型通過一定格式的序列化形式從Python轉(zhuǎn)為Ruby,并且讓你生產(chǎn)環(huán)境的Ruby代碼讀取序列化,或者使用面向服務(wù)的系統(tǒng)架構(gòu)實(shí)現(xiàn)從Python到Ruby的服務(wù)請(qǐng)求,二選一。 對(duì)于完全不同性質(zhì)的問題,你也會(huì)想要在生產(chǎn)環(huán)境下維持度量模型性能(與驗(yàn)證數(shù)據(jù)的大量計(jì)算不同)。依賴于你如何使用模型,這個(gè)過程可能比較困難,因?yàn)閮H僅使用模型去控制行為的方式可以導(dǎo)致你沒有數(shù)據(jù)計(jì)算你的度量。本系列的其他文章將會(huì)考慮一些這類問題。 |
|