机器学习之_逻辑回归
机器学习之 _ 逻辑回归
逻辑回归又称 logistic
回归,逻辑斯谛回归,是一种广义的线性回归分析模型。
1. Sigmod 函数
Sigmoid 函数也是神经网络中常用的函数,用于把 x
从负无穷到正无穷压缩到 y 从 0 到 1 之间。画出来就是一条 S
型曲线,如下图中的蓝色曲线:
它以 0 点为中心对称,公式如下:
当 x 值接近负无穷时,分母很大,S(x) 接近 0,当 x
接近正无穷时,分母接近 1,S(x) 接近 1,当 x 为 0 时,S(x) 为 1/2
在正中间。S 曲线的弯曲程度由 e 决定。它的导数是上图中的橙色曲线:
导数的意义是变化率,当 x 很大时或很小时,S’(x) 接近 0,而在 x 接近
0 时,S’(x) 值最大,即 S 曲线在 0 点处变化剧烈,它勾勒出了 y 在 0 与 1
之间模棱两可的区域。
2. 逻辑斯谛分布
必须满足逻辑斯谛分布,才能用逻辑回归。那么什么是逻辑斯谛分布?
逻辑斯谛分布即增长分布,增长分布的分布函数是“增长函数”,公式如下:
可以看到,它把 (x-μ)/γ代入 Sigmoid
函数。其中μ ...
XGboost_增量学习
Xgboost 之增量学习
1. 说明
当我们的训练数据非常多,并且还在不断增加时,每次都用全量训练,数据过多,时间过长,此时就可以使用增量训练:用新增的数据微调校正模型。
2. 全量与增量的差异
在使用增量训练时,最关心的问题是:全量和增量的差别,从而确定增量训练的使用场景。
假设有 200 条数据,第一次训练 150 条,第二次训练 50 条,和直接用 200
条训练的差异在于:在第二次训练 50 条时,前 150
条数据已经不存在了,模型更拟合于后面的数据。如果我们定期增量训练,那么离当前时间越近的数据对模型影响越大,这也是我们想要的结果。但如果最后一批数据质量非常差,就可能覆盖之前的正确实例的训练结果,把模型带偏。
同理,如果我们按时间把数据分成几部分,然后按从早到晚的顺序多次训练模型,每个模型在上一个模型基础上训练,也间接地参加了后期实例的权重。
Xgboost
提供两种增量训练的方式,一种是在当前迭代树的基础上增加新树,原树不变;另一种是当前迭代树结构不变,重新计算叶节点权重,同时也可增加新树。
对于已存在的决策树,早期训练的实例决定了模型的结构(选择哪些特征及分裂点),后 ...
XGboost_调试方法
Xgboost 调试方法
1. 调试 test 目录下的测试用例
在测试程序后面加入以下代码,即可启动调试程序
12if __name__ == "__main__": unittest.main()
2. 显示树结构
1234import matplotlib.pyplot as plt fig,ax = plt.subplots()xgb.plot_tree(gbdt_03a, ax = ax, num_trees=0) # 显示模型中的第一棵树plt.show()
3. 打印详细调试信息
在 xgb 的 params 中设置:
12'silent': 0,'debug_verbose': 5
4. 修改源码
修改 c++ 源码后如果运行 c++ 程序,在 xgboost 目录下执行编译命令
make,重新生成二进制程序 xgboost,运行即可。
修改 c++ 源码后如果运行 Python 程序,需要将
xgboost/lib/libxgboost.so,复制到 python
对应的库目录下(如:/ ...
Python的Debug工具
Python 的 Debug 工具
1. 命令行使用 pdb
(1) 我们先写个简单的
python 程序 a.py 如下:
1234for i in range(0,3): print(i) print("@@@@") print("###")
(2) 用 pdb 调试
1$ pdb a.py # 此后看到 > 提示符,即可以输入命令调试
2. 常用 pdb 命令
pdb 命令和 gdb 差不多,最常用的命令如下:
单步调试(进入函数):s(tep)
单步调试(不进入函数):n(ext)
继续往后执行,直到下个断点:c(ont(inue))
运行到函数结束:r(eturn)
运行到当前循环结束:unt(il)
设置断点:b(reak) 文件名: 行号(或行号,或函数名)
显示当前调用关系:w(here)
显示当前代码段:l(ist)
显示变量:p(rint) 变量名
显示当前函数的参数:a(rgs)
显示帮助信息:h(elp)
退出:q(uit)
3. Notebook 使用 pdb
(1) 单步调试
用 No ...
XGBoost_原理
XGBoost_ 原理
1. 说明:
难了不会,会了不难,你明白了,觉得这还用说?不明白,跳步之后,似懂非懂。本篇是我对论文《XGBoost:
A Scalable Tree Boosting System》的阅读笔记,用大白话解释 xgboost
原理,学霸请跳过,懒得看公式的也请跳过。
2.
第一步:整体误差(重点:整体视角)
整体误差指的是 XGBoost
模型训练完成之后,将训练集中所有实例代入模型,用以下函数(总误差
L())衡量模型的好坏:
左边是训练集所有实例的误差之和,i 指每个实例,y^是预测值,y
是实际值,而 l() 是衡量 y’与 y 差异的方法,比如
RMSE。左边比较好理解,就是说训练一个模型,最好能对于所有的实例都做出与真实值相似的预测。
右边是正则项,它的用途就是防止模型过拟合,比如说一个模型,一共 400
个实例,模型做了 400
个叶节点,与实例一一对应,它的泛化就很差,所以应该尽量简化模型,正则项在第四步详述。
3.
第二步:计算 t 棵树时的误差(重点:从第 t-1 棵到第 t 棵)
梯度下降决策树是由多棵树组成的模型。假设它由 t 棵树组成, ...
XGBoost_源码初探
XGBoost_ 源码初探
##1. 说明
本篇来读读 Xgboost 源码。其核心代码基本在 src 目录下,由 C++
实现,40 几个 cc 文件,代码 11000
多行,虽然不算太多,但想把核心代码都读明白,也需要很长时间。我觉得阅读的目的主要是:了解基本原理,流程,核心代码的位置,修改从哪儿入手,而得以快速入门。因此,需要跟踪代码执行过程,同时查看在某一步骤其内部环境的取值情况。具体方法是:单步调试或在代码中加入一些打印信息,因此选择了安装编译源码的方式。
##2. 下载编译
用参数 --recursive 可以下载它的支持包 rabit 和 cur,否则编不过
123$ git clone --recursive https://github.com/dmlc/xgboost$ cd xgboost$ make -j4
##3. 运行
测试程序 demo
目录中有多分类,二分类,回归等各种示例,这里从二分类入手。
1234$ cd demo #运行一个测试程序 $ cd binary_classification$ ./runexp.sh # 可以通过修改cfg ...
知识图谱之WordNet
知识图谱之 WordNet
#自然语言处理
1. 说明
今天讨论的是自然语言中的知识抽取和知识表示,换言之,就是如何从大量的书籍文献中剥离出我们关心的所谓“知识”,并将起组织保存成简单可用的描述。
不同的知识类型需要采用不同的知识表示方式,温有奎教授总结了 10
种知识类型(具体见参考部分)。对于静态概念及概念之间关系用面向对象形式来表示,对命题型问题用一阶逻辑来表示,对于系统流程和实验流程等过程性知识用脚本表示法。
静态概念是思维最基本的组成单元(以下简称基元),无论是命题还是流程,都离不开基元。我们应该把基元看作一种语义,而非一个单词。因为很多单词不具唯一性,常有一词多义,和一义多词的问题。
再来看看基元之间的关系,比如:水果,苹果,红富士,它们可能指向同一物体,又可能不同;它们在一定程度上拥有共同属性,又拥有各自特征;基元相互之间又可能有类别的包含,近义,反义,整体与局部等各种关系……
中文中的单词至少有几万个,这还不包括简单词组成的短语,如果有一个命题是“苹果是圆的”,那么是否也需要同时加入“红富士是圆的”,如果这样描述属性,恐怕是举不胜举了。而人类一般可以 ...
特征工程之_筛选
特征工程之 _ 筛选
1. 说明
本文并非介绍某个成熟算法或者工具,只是个人的一点感悟,写得可能不正确,不全面,希望能给大家带来一些启发,也欢迎各位回复讨论。
2. 特征工程
大数据相关的工作可简要地归纳为:模型部分和数据部分,在模型部分,目前大家的做法主要是拿现成的模型来用,对其做内部修改或重写的很少,主要工作在选型和调参。
相对来说,对数据部分做的工作更多,在比赛中数据都是固定的,且很多时候数据已脱敏,特征工程能做的不太多,而真实场景中,往往能从复杂数据中提取更多信息,因此如期何提取以及筛选信息就变得尤为重要。
3. 筛选
筛选分为筛选实例和筛选特征,如果把整体数据看成一张表,就是删行或者删列。
在实际应用时,常遇到的一个难题是:怎么把人的经验和算法结合起来,特征工程是一个重要的入口,一方面我们可以用经验构造更多特征,另一方面,也可以通过经验选择合理的实例代入模型,以及分配权重。
4. 特征筛选
(1) 为什么筛选
对特征的筛选主要是去掉无关特征,无关特征一般有两种影响:在数据量大的情况下,影响训练速度,在数据量少的情况下,带来更多误差。像天池的汽车上牌赛和 ...
Swagger和Python配合使用
Swagger 和 Python 配合使用
1 简介
先来看一个应用场景:
我写了一段功能性的程序(可能是 Java 的,也可能是 Python
的),供他人调用(调我程序可能是其它编程语言,或者直接运行,如果调用者对我使用的工具不熟悉,直接调用可能很麻烦),这个程序需要传入多个参数,需要结构化的输出,我以什么方式提供给比较好呢?
我们可能会选择 BS 的结构,建立一个 Web-Server,然后把功能性的程序放在
Web-Server 上并向外暴露接口,其它程序用 Http 协议调用该接口,以 POST 或
GET 的方式转入参数,然后得到返回结果。
于是我们就需要定义一些交互协议,写接口描述文档,在调用出错时,联调是哪一端的问题,总之,沟通成本很高。
Swagger
可以很好地解这一问题,一方面,它能按规范自动生成接口文档(以网页形式提供),这样编写
API
和编写文档同时完成,几乎不用考虑文本和代码版本不同步的问题;另一方面,它能提供测试界面,我们只需要在网页上填写相应的参数,点击调用(网页由
swagger
生成),就可以轻松调用接口,使得服务端的开发者,不使用客户端,就可以完 ...
SOAP协议及Python调用
SOAP 协议及 Python 调用
1. 什么是 SOAP 协议
SOAP 是一种简单的基于 XML 的协议,它底层通过 HTTP 来交换信息。SOAP
的优点是可以传递结构化的数据。
客户生成的 SOAP 请求会被嵌入在一个 HTTP POST 请求中,发送到 Web
服务器。Web 服务器再把这些请求转发给 Web service
请求处理器,它解析收到的 SOAP 请求,调用 Web service,处理后再生成相应的
SOAP 应答。Web 服务器得到 SOAP 应答后,会再通过 HTTP
应答的方式把它送回到客户端。
从 HTTP 协议的角度看,最基本的四种操作是
GET(查),POST(改),PUT(增),DELETE(删),我们用的比较多的是 POST
和 GET 方式。而 SOAP 可视为 POST 的一个专用版本,遵循一种特殊的 XML
消息格式。
最常见的场景是:Server 端使用了 SOAP 协议,而 Client
端也必须遵从该协议才能交互,本文介绍一下,如何在 Client 端使用 SOAP
协议,以及如何配置 SOAP 测试环境。
2. 什 ...