小白入门篇使用Python搭建点击率预估模型


Posted in Python onOctober 12, 2018

小白入门篇使用Python搭建点击率预估模型

点击率预估模型

0.前言

本篇是一个基础机器学习入门篇文章,帮助我们熟悉机器学习中的神经网络结构与使用。

日常中习惯于使用Python各种成熟的机器学习工具包,例如sklearn、TensorFlow等等,来快速搭建各种各样的机器学习模型来解决各种业务问题。

本文将从零开始,仅仅利用基础的numpy库,使用Python实现一个最简单的神经网络(或者说是简易的LR,因为LR就是一个单层的神经网络),解决一个点击率预估的问题。

1.假设一个业务场景

声明:为了简单起见,下面的一切设定从简….

定义需要解决的问题:

老板:小李,这台机器上有一批微博的点击日志数据,你拿去分析一下,然后搞点击率预测啥的…

是的,就是预测一篇微博是否会被用户点击(被点击的概率)…..预测未来,貌似很神奇的样子!

热门微博

简单的介绍一下加深的业务数据

每一条微博数据有由三部分构成: {微博id, 微博特征X, 微博点击标志Y}

微博特征X有三个维度:

X={x0="该微博有娱乐明星”,x1="该微博有图”,x2="该微博有表情”}

微博是否被点击过的标志Y:

Y={y0=“点击”, y1=“未点击”}

数据有了,接下来需要设计一个模型,把数据输入进去进行训练之后,在预测阶段,只需要输入{微博id,微博特征X},模型就会输出每一个微博id会被点击的概率。

2.任务分析:

这是一个有监督的机器学习任务

对于有监督的机器学习任务,可以简单的分为分类与回归问题,这里我们简单的想实现预测一条微博是否会被用户点击,预测目标是一个二值类别:点击,或者不点击,显然可以当做一个分类问题。

所以,我们需要搭建一个分类模型(点击率预测模型),这也就决定我们需要构建一个有监督学习的训练数据集。

模型的选择

选择最简单神经网络模型,人工神经网络有几种不同类型的神经网络,比如前馈神经网络、卷积神经网络及递归神经网络等。本文将以简单的前馈或感知神经网络为例,这种类型的人工神经网络是直接从前到后传递数据的,简称前向传播过程。

3.数据准备:

整体的流程:

数据预处理(数值化编码)——>特征筛选——>选择模型(前馈神经网络)——>训练模型——>模型预测

假设,对4条微博的数据进行数值化编码,可以表示为如下的矩阵格式:

小白入门篇使用Python搭建点击率预估模型

训练数据XY

解读一条样本数据:
第一条样本数据为:X0=[0 0 1],分别对应着三维的特征,最后4x1的矩阵是Y,0表示无,1表示有,可知该特征对应的Y0是未点击。

所以,这条样本可以翻译为:[该微博没娱乐明星,没有图片,有表情],最终y=0,代表该条微博没有被点击。

业务以及数据特征是不是很简单….简单有点看起来编的不太合理 - !

4.神经网络基本结构:

1.输入层:输入的业务特征数据

2.隐藏层:初始化权重参数

3.激活函数:选择激活函数

4.输出层:预测的目标,定义损失函数

我们即将使用的机器学习模型:

小白入门篇使用Python搭建点击率预估模型

超级简单的前馈神经网络

机器学习模型类似一个黑盒子,输入历史点击的数据,进行训练,然后就可以对未来的额数据进行预测….我们上面设计的是一个超级简单的前馈神经网络,但是可以实现我们上面的目的。

关于激活函数:

通过引入激活函数,实现了非线性变换,增强了模型的拟合效果。

关乎激活函数,请看之前的文章 吾爱NLP(2)--解析深度学习中的激活函数

在本文教程中,使用的是简单的Sigmoid激活函数,但注意一点,在深层神经网络模型中, sigmoid激活函数一般不作为首选,原因是其易发生梯度弥散现象。

小白入门篇使用Python搭建点击率预估模型

sigmoid公式

此函数可以将任何值映射到0到1之间,并能帮助我们规范化输入的加权和。

小白入门篇使用Python搭建点击率预估模型

sigmoid图像

对sigmoid激活函数求偏导:

小白入门篇使用Python搭建点击率预估模型

该偏导函数吗,等下写程序会用到,所以先放在这里!

模型的训练

训练阶段,模型的输入X已经确定,输出层的Y确定,机器学习模型确定,唯一需要求解的就是模型中的权重W,这就是训练阶段的目标。

主要由三个核心的流程构成:

前向计算—>计算损失函数—>反向传播

本文使用的模型是最简单的前馈神经网络,起始就是一个LR而已….所以整个过程这里就不继续介绍了,因为之前已经写过一篇关于LR的文章--- 逻辑回归(LR)个人学习总结篇 ,如果对其中的细节以及公式的推导有疑问,可以去LR文章里面去寻找答案。

这里再提一下权重参数W更新的公式:

小白入门篇使用Python搭建点击率预估模型

至此,所有的写代码需要的细节都已经交代结束了,剩下的就是代码了。

5.使用Python代码构建网络

# coding:utf-8
import numpy as np 
class NeuralNetwork(): 
 # 随机初始化权重
 def __init__(self): 
  np.random.seed(1) 
  self.synaptic_weights = 2 * np.random.random((3, 1)) - 1 
 # 定义激活函数:这里使用sigmoid
 def sigmoid(self, x): 
  return 1 / (1 + np.exp(-x)) 
 #计算Sigmoid函数的偏导数 
 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-微调权重 
   adjustments = np.dot(training_inputs.T, error * self.sigmoid_derivative(output)) 
   self.synaptic_weights += learn_rate*adjustments 
 def think(self, inputs): 
  # 输入通过网络得到输出 
  # 转化为浮点型数据类型 
  inputs = inputs.astype(float) 
  output = self.sigmoid(np.dot(inputs, self.synaptic_weights)) 
  return output 
if __name__ == "__main__": 
 # 初始化前馈神经网络类 
 neural_network = NeuralNetwork() 
 print "随机初始化的权重矩阵W"
 print neural_network.synaptic_weights
 # 模拟训练数据X
 train_data=[[0,0,1], [1,1,1], [1,0,1], [0,1,1]]
 training_inputs = np.array(train_data) 
 # 模拟训练数据Y
 training_outputs = np.array([[0,1,1,0]]).T 
 # 定义模型的参数:
 # 参数学习率
 learn_rate=0.1
 # 模型迭代的次数
 epoch=150000
 neural_network.train(training_inputs, training_outputs, learn_rate, epoch) 
 print "迭代计算之后权重矩阵W: "
 print neural_network.synaptic_weights
 # 模拟需要预测的数据X
 pre_data=[0,0,1]
 # 使用训练的模型预测该微博被点击的概率
 print "该微博被点击的概率:"
 print neural_network.think(np.array(pre_data))
"""
终端输出的结果:
随机初始化的权重矩阵W
[[-0.16595599]
 [ 0.44064899]
 [-0.99977125]]
迭代计算之后权重矩阵W: 
[[12.41691302]
 [-0.20410552]
 [-6.00463275]]
该微博被点击的概率:
[0.00246122]
[Finished in 20.2s]
"""

6.总结:

根据终端输出的模型训练以及预测的结果,针对预测数据pre_data=[0,0,1],模型输出该微博被点击的概率为0.00246,很显然被点击的概率比较小,可以认为简单认为该微博不会被点击!

是的,我们的业务目标初步实现了----输入任意一条微博的样本数据到我们的机器学习模型中,既可以输出该样本被点击的概率。

上面的就是我们设计的一个超级简单的模型,假设了一个超级简单的业务场景,并随机设定了超简单的训练数据,如果有 编 的不合理地方多多包涵!!!该例子虽然可能并不能帮你解决实际的业务问题,但是对于机器学习的新手理解神经网络,或许会有一点点帮助吧!

总结

以上所述是小编给大家介绍的用Python搭建超级简单的点击率预估模型,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python 的类、继承和多态详解
Jul 16 Python
python基础之入门必看操作
Jul 26 Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 Python
Python中django学习心得
Dec 06 Python
python通过ffmgep从视频中抽帧的方法
Dec 05 Python
Python脚本利用adb进行手机控制的方法
Jul 08 Python
Python求正态分布曲线下面积实例
Nov 20 Python
python将四元数变换为旋转矩阵的实例
Dec 04 Python
Python3 main函数使用sys.argv传入多个参数的实现
Dec 25 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
Nov 28 Python
numba提升python运行速度的实例方法
Jan 25 Python
浅谈Python基础之列表那些事儿
May 11 Python
Python读取txt内容写入xls格式excel中的方法
Oct 11 #Python
Python3 获取一大段文本之间两个关键字之间的内容方法
Oct 11 #Python
selenium+python 对输入框的输入处理方法
Oct 11 #Python
python中的json总结
Oct 11 #Python
python tkinter界面居中显示的方法
Oct 11 #Python
python TKinter获取文本框内容的方法
Oct 11 #Python
Python tkinter label 更新方法
Oct 11 #Python
You might like
javascript题目,重写函数让其无限相加
2012/02/15 Javascript
node.js中的fs.futimes方法使用说明
2014/12/17 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
VueJS全面解析
2016/11/10 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
详解nuxt 微信公众号支付遇到的问题与解决
2019/08/26 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
2020/09/02 Javascript
Vue 实现可视化拖拽页面编辑器
2021/02/01 Vue.js
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python获取系统默认字符编码的方法
2015/06/04 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
Python列表切片用法示例
2017/04/19 Python
Django ImageFiled上传照片并显示的方法
2019/07/28 Python
Python编写一个验证码图片数据标注GUI程序附源码
2019/12/09 Python
Python包和模块的分发详细介绍
2020/06/19 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
小女主人连衣裙:Little Mistress
2017/07/10 全球购物
大学生毕业求职的自我评价
2013/09/29 职场文书
开办大学饮食联盟创业计划书
2014/01/29 职场文书
工程师岗位职责规定
2014/02/26 职场文书
计生专干事迹
2014/05/28 职场文书
保洁员岗位职责
2015/02/04 职场文书
教师考核表个人总结
2015/02/12 职场文书
关于公司年会的开幕词
2016/03/04 职场文书
毕业季聚会祝酒词!
2019/07/04 职场文书
JavaScript 对象创建的3种方法
2021/11/17 Javascript
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技
Golang 字符串的常见操作
2022/04/19 Golang