從零開始用Python搭建超級簡單的點擊率預估模型

點擊率預估模型

0.前言

本篇是一個基礎(chǔ)機器學習入門篇文章徽职,幫助我們熟悉機器學習中的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)與使用。
日常中習慣于使用Python各種成熟的機器學習工具包佩厚,例如sklearn姆钉、TensorFlow等等,來快速搭建各種各樣的機器學習模型來解決各種業(yè)務(wù)問題抄瓦。
本文將從零開始潮瓶,僅僅利用基礎(chǔ)的numpy庫,使用Python實現(xiàn)一個最簡單的神經(jīng)網(wǎng)絡(luò)(或者說是簡易的LR钙姊,因為LR就是一個單層的神經(jīng)網(wǎng)絡(luò))毯辅,解決一個點擊率預估的問題。

1.假設(shè)一個業(yè)務(wù)場景

聲明:為了簡單起見煞额,下面的一切設(shè)定從簡….

定義需要解決的問題:

老板:小李思恐,這臺機器上有一批微博的點擊日志數(shù)據(jù)沾谜,你拿去分析一下,然后搞點擊率預測啥的…

是的胀莹,就是預測一篇微博是否會被用戶點擊(被點擊的概率)…..預測未來基跑,貌似很神奇的樣子!


熱門微博

簡單的介紹一下加深的業(yè)務(wù)數(shù)據(jù)
每一條微博數(shù)據(jù)有由三部分構(gòu)成:{微博id, 微博特征X, 微博點擊標志Y}

微博特征X有三個維度:
X={x0="該微博有娛樂明星”描焰,x1="該微博有圖”媳否,x2="該微博有表情”}

微博是否被點擊過的標志Y:

Y={y0=“點擊”, y1=“未點擊”}

數(shù)據(jù)有了,接下來需要設(shè)計一個模型荆秦,把數(shù)據(jù)輸入進去進行訓練之后篱竭,在預測階段,只需要輸入{微博id,微博特征X}萄凤,模型就會輸出每一個微博id會被點擊的概率室抽。

2.任務(wù)分析:

這是一個有監(jiān)督的機器學習任務(wù)

對于有監(jiān)督的機器學習任務(wù)搪哪,可以簡單的分為分類與回歸問題靡努,這里我們簡單的想實現(xiàn)預測一條微博是否會被用戶點擊,預測目標是一個二值類別:點擊晓折,或者不點擊惑朦,顯然可以當做一個分類問題。

所以漓概,我們需要搭建一個分類模型(點擊率預測模型)漾月,這也就決定我們需要構(gòu)建一個有監(jiān)督學習的訓練數(shù)據(jù)集。

模型的選擇
選擇最簡單神經(jīng)網(wǎng)絡(luò)模型胃珍,人工神經(jīng)網(wǎng)絡(luò)有幾種不同類型的神經(jīng)網(wǎng)絡(luò)梁肿,比如前饋神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)及遞歸神經(jīng)網(wǎng)絡(luò)等觅彰。本文將以簡單的前饋或感知神經(jīng)網(wǎng)絡(luò)為例吩蔑,這種類型的人工神經(jīng)網(wǎng)絡(luò)是直接從前到后傳遞數(shù)據(jù)的,簡稱前向傳播過程填抬。

3.數(shù)據(jù)準備:

整體的流程:

數(shù)據(jù)預處理(數(shù)值化編碼)——>特征篩選——>選擇模型(前饋神經(jīng)網(wǎng)絡(luò))——>訓練模型——>模型預測

假設(shè)烛芬,對4條微博的數(shù)據(jù)進行數(shù)值化編碼,可以表示為如下的矩陣格式:

訓練數(shù)據(jù)XY

解讀一條樣本數(shù)據(jù):

第一條樣本數(shù)據(jù)為:X0=[0 0 1]飒责,分別對應(yīng)著三維的特征赘娄,最后4x1的矩陣是Y,0表示無宏蛉,1表示有遣臼,可知該特征對應(yīng)的Y0是未點擊。

所以拾并,這條樣本可以翻譯為:[該微博沒娛樂明星揍堰,沒有圖片蚌讼,有表情],最終y=0个榕,代表該條微博沒有被點擊篡石。

業(yè)務(wù)以及數(shù)據(jù)特征是不是很簡單….簡單有點看起來編的不太合理-


4.神經(jīng)網(wǎng)絡(luò)基本結(jié)構(gòu):

1.輸入層:輸入的業(yè)務(wù)特征數(shù)據(jù)
2.隱藏層:初始化權(quán)重參數(shù)
3.激活函數(shù):選擇激活函數(shù)
4.輸出層:預測的目標西采,定義損失函數(shù)

我們即將使用的機器學習模型:


超級簡單的前饋神經(jīng)網(wǎng)絡(luò)

機器學習模型類似一個黑盒子凰萨,輸入歷史點擊的數(shù)據(jù),進行訓練械馆,然后就可以對未來的額數(shù)據(jù)進行預測….我們上面設(shè)計的是一個超級簡單的前饋神經(jīng)網(wǎng)絡(luò)胖眷,但是可以實現(xiàn)我們上面的目的。

關(guān)于激活函數(shù):

通過引入激活函數(shù)霹崎,實現(xiàn)了非線性變換珊搀,增強了模型的擬合效果。

關(guān)乎激活函數(shù)尾菇,請看之前的文章吾愛NLP(2)--解析深度學習中的激活函數(shù)
在本文教程中境析,使用的是簡單的Sigmoid激活函數(shù),但注意一點派诬,在深層神經(jīng)網(wǎng)絡(luò)模型中劳淆, sigmoid激活函數(shù)一般不作為首選,原因是其易發(fā)生梯度彌散現(xiàn)象默赂。

sigmoid公式

此函數(shù)可以將任何值映射到0到1之間沛鸵,并能幫助我們規(guī)范化輸入的加權(quán)和。

sigmoid圖像

對sigmoid激活函數(shù)求偏導:


該偏導函數(shù)嗎缆八,等下寫程序會用到曲掰,所以先放在這里!

模型的訓練

訓練階段奈辰,模型的輸入X已經(jīng)確定栏妖,輸出層的Y確定,機器學習模型確定冯挎,唯一需要求解的就是模型中的權(quán)重W底哥,這就是訓練階段的目標。

主要由三個核心的流程構(gòu)成:

前向計算—>計算損失函數(shù)—>反向傳播

本文使用的模型是最簡單的前饋神經(jīng)網(wǎng)絡(luò)房官,起始就是一個LR而已….所以整個過程這里就不繼續(xù)介紹了趾徽,因為之前已經(jīng)寫過一篇關(guān)于LR的文章---邏輯回歸(LR)個人學習總結(jié)篇,如果對其中的細節(jié)以及公式的推導有疑問翰守,可以去LR文章里面去尋找答案孵奶。

這里再提一下權(quán)重參數(shù)W更新的公式:

至此,所有的寫代碼需要的細節(jié)都已經(jīng)交代結(jié)束了蜡峰,剩下的就是代碼了了袁。

5.使用Python代碼構(gòu)建網(wǎng)絡(luò)

# coding:utf-8
import numpy as np 

class NeuralNetwork(): 
    # 隨機初始化權(quán)重
    def __init__(self): 
        np.random.seed(1) 
        self.synaptic_weights = 2 * np.random.random((3, 1)) - 1 
    
    # 定義激活函數(shù):這里使用sigmoid
    def sigmoid(self, x):  
        return 1 / (1 + np.exp(-x)) 
    
    #計算Sigmoid函數(shù)的偏導數(shù) 
    def sigmoid_derivative(self, x): 
        return x * (1 - x)
    
    # 訓練模型 
    def train(self, training_inputs, training_outputs,learn_rate, training_iterations): 
        # 迭代訓練
        for iteration in range(training_iterations): 
            #前向計算 
            output = self.think(training_inputs) 
            # 計算誤差 
            error = training_outputs - output 
            # 反向傳播-BP-微調(diào)權(quán)重 
            adjustments = np.dot(training_inputs.T, error * self.sigmoid_derivative(output)) 
            self.synaptic_weights += learn_rate*adjustments 
    
    def think(self, inputs): 
        # 輸入通過網(wǎng)絡(luò)得到輸出 
        # 轉(zhuǎn)化為浮點型數(shù)據(jù)類型 
        inputs = inputs.astype(float) 
        output = self.sigmoid(np.dot(inputs, self.synaptic_weights)) 
        return output 

if __name__ == "__main__": 
    # 初始化前饋神經(jīng)網(wǎng)絡(luò)類 
    neural_network = NeuralNetwork() 
    print "隨機初始化的權(quán)重矩陣W"
    print neural_network.synaptic_weights
    # 模擬訓練數(shù)據(jù)X
    train_data=[[0,0,1], [1,1,1], [1,0,1], [0,1,1]]
    training_inputs = np.array(train_data) 
    # 模擬訓練數(shù)據(jù)Y
    training_outputs = np.array([[0,1,1,0]]).T 
    # 定義模型的參數(shù):
    # 參數(shù)學習率
    learn_rate=0.1
    # 模型迭代的次數(shù)
    epoch=150000
    neural_network.train(training_inputs, training_outputs, learn_rate, epoch) 
    print "迭代計算之后權(quán)重矩陣W: "
    print neural_network.synaptic_weights
    # 模擬需要預測的數(shù)據(jù)X
    pre_data=[0,0,1]
    # 使用訓練的模型預測該微博被點擊的概率
    print "該微博被點擊的概率:"
    print neural_network.think(np.array(pre_data))

"""
終端輸出的結(jié)果:
隨機初始化的權(quán)重矩陣W
[[-0.16595599]
 [ 0.44064899]
 [-0.99977125]]
迭代計算之后權(quán)重矩陣W: 
[[12.41691302]
 [-0.20410552]
 [-6.00463275]]
該微博被點擊的概率:
[0.00246122]
[Finished in 20.2s]
"""

6.總結(jié):

根據(jù)終端輸出的模型訓練以及預測的結(jié)果朗恳,針對預測數(shù)據(jù)pre_data=[0,0,1],模型輸出該微博被點擊的概率為0.00246载绿,很顯然被點擊的概率比較小粥诫,可以認為簡單認為該微博不會被點擊!

是的崭庸,我們的業(yè)務(wù)目標初步實現(xiàn)了----輸入任意一條微博的樣本數(shù)據(jù)到我們的機器學習模型中怀浆,既可以輸出該樣本被點擊的概率。

上面的就是我們設(shè)計的一個超級簡單的模型怕享,假設(shè)了一個超級簡單的業(yè)務(wù)場景执赡,并隨機設(shè)定了超簡單的訓練數(shù)據(jù),如果有 的不合理地方多多包涵:睢I澈稀!該例子雖然可能并不能幫你解決實際的業(yè)務(wù)問題跌帐,但是對于機器學習的新手理解神經(jīng)網(wǎng)絡(luò)首懈,或許會有一點點幫助吧!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末含末,一起剝皮案震驚了整個濱河市猜拾,隨后出現(xiàn)的幾起案子即舌,更是在濱河造成了極大的恐慌佣盒,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顽聂,死亡現(xiàn)場離奇詭異肥惭,居然都是意外死亡,警方通過查閱死者的電腦和手機紊搪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門蜜葱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耀石,你說我怎么就攤上這事牵囤。” “怎么了滞伟?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵揭鳞,是天一觀的道長。 經(jīng)常有香客問我梆奈,道長野崇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任亩钟,我火速辦了婚禮乓梨,結(jié)果婚禮上鳖轰,老公的妹妹穿的比我還像新娘。我一直安慰自己扶镀,他們只是感情好蕴侣,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著臭觉,像睡著了一般睛蛛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胧谈,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天忆肾,我揣著相機與錄音,去河邊找鬼菱肖。 笑死客冈,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的稳强。 我是一名探鬼主播场仲,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼退疫!你這毒婦竟也來了渠缕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤褒繁,失蹤者是張志新(化名)和其女友劉穎亦鳞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棒坏,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡燕差,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坝冕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徒探。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖喂窟,靈堂內(nèi)的尸體忽然破棺而出测暗,到底是詐尸還是另有隱情,我是刑警寧澤磨澡,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布碗啄,位于F島的核電站,受9級特大地震影響钱贯,放射性物質(zhì)發(fā)生泄漏挫掏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一秩命、第九天 我趴在偏房一處隱蔽的房頂上張望尉共。 院中可真熱鬧褒傅,春花似錦、人聲如沸袄友。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剧蚣。三九已至支竹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸠按,已是汗流浹背礼搁。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留目尖,地道東北人馒吴。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像瑟曲,于是被迫代替她去往敵國和親饮戳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 原文地址:http://www.cnblogs.com/subconscious/p/5058741.html 神...
    Albert陳凱閱讀 5,447評論 0 48
  • 文章主要分為:一洞拨、深度學習概念扯罐;二、國內(nèi)外研究現(xiàn)狀烦衣;三歹河、深度學習模型結(jié)構(gòu);四琉挖、深度學習訓練算法启泣;五、深度學習的優(yōu)點...
    艾剪疏閱讀 21,835評論 0 58
  • 前言:我們結(jié)婚第一年示辈,小月月在我肚子里16周,準爸爸的你生日快樂遣蚀! 0.1 親愛的老公矾麻,這樣的稱呼你可滿意哈。這個...
    姑娘很開心閱讀 272評論 0 1
  • 今天聽了同理心的課程芭梯,非常有用险耀。同理心就我的理解就是在站在別人的角度考慮問題。 為什么做預售要有同理心玖喘,而且說是相...
    蘭心_xiang閱讀 293評論 1 4