数据迁移工具Kettle
数据迁移工具 Kettle
1. 背景知识
(1) 什么是 ETL
ETL 是 Extract-Transform-Load
的缩写,用来描述将数据从来源端经过抽取(extract)、交互转换(transform)、加载(load)至目的端的过程。
(2) Kettle 简介
Kettle 是一款国外开源的 ETL 工具,纯 java 编写,可以在
Window、Linux、Unix 上运行,数据抽取高效稳定。Kettle
中文名称叫水壶,该项目的主程序员 MATT
希望把各种数据放到一个壶里,然后以一种指定的格式流出。我们常用它定时将一些库的数据稍做转换后存入其它库。
(3) 工作机制
Kettle 中有两种脚本文件,transformation 和 job,transformation
完成针对数据的基础转换,job 则完成整个工作流的控制。
2. 安装和运行
(1) 安装
kettle 的最新下载地址:http://community.pentaho.com/projects/data-integration/
我在 linux 下安装,机器之前已装好 java
环境,将 ...
几种常见的数学分布
几种常见的数学分布
#数学
1. 什么是数学期望
举个例子:某城市有 10 万个家庭,没有孩子的家庭有 1000
个,有一个孩子的家庭有 9 万个,有两个孩子的家庭有 6000 个,有 3
个孩子的家庭有 3000 个
(0 * 1000 + 1 * 90000 + 2 * 6000 + 3 * 3000) / 100000 = 1.11
数学期望
(mean)(或均值,亦简称期望)是试验中每次可能结果的概率乘以其结果的总和
0 * 0.01 + 1 * 0.9 + 2 * 0.06 + 3 * 0.03 = 1.11
2. 概率密度与累积分布
概率密度一般的写法是:P(X=a) = …,即 X 等于某个值 a 的可能性
累积分布一般的写法是:P(X<=a) = …,即 X 小于等于某个值 a
的所有可能性累加之和
这二者千万别弄混,否则就会被各种公式绕晕。下图是增量分布的概率密度图(橙色)和累积分布图(蓝色)。
3. 常见的分布
(1) 离散分布:
伯努利分布(零一分布,两点分布),二项分布,几何分布,泊松分布(Poisson
分布)
(2) 连续分布: ...
调度工具Airflow
调度工具 Airflow
1. 什么是 Airflow
Airflow 是 Airbnb 开源的 data pipeline
调度和监控工作流的平台,用于用来创建、监控和调整 data
pipeline(ETL)。
2. 简单的定时任务 cron
假设我们想要定时调用一个程序,比如说:每天定时从 Web
抓数据,我们可以使用 cron。cron 是一个 Linux
下的后台服务,用来定期的执行一些任务,在/etc/crontab
中设置后即可,基本写法如下:
12# 分钟 小时 日 月 周 用户 命令 17 * * * * root date >> /tmp/time.log
它的意思是每个小时的第 18 分钟,将当前时间写入 log
文件,注意各值的取值范围(分钟 0 - 59,小时 0 - 23,天 1 - 31,月 1 -
12,星期 0 - 6,0 表示星期天)修改/etc/crontab 后,还需要用 $ sudo
service cron restart 命令重启 crontab 任务,才能生效。
3. 为什么要用 Airflow
有了 cro ...
机器学习之_逻辑回归
机器学习之 _ 逻辑回归
逻辑回归又称 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
种知识类型(具体见参考部分)。对于静态概念及概念之间关系用面向对象形式来表示,对命题型问题用一阶逻辑来表示,对于系统流程和实验流程等过程性知识用脚本表示法。
静态概念是思维最基本的组成单元(以下简称基元),无论是命题还是流程,都离不开基元。我们应该把基元看作一种语义,而非一个单词。因为很多单词不具唯一性,常有一词多义,和一义多词的问题。
再来看看基元之间的关系,比如:水果,苹果,红富士,它们可能指向同一物体,又可能不同;它们在一定程度上拥有共同属性,又拥有各自特征;基元相互之间又可能有类别的包含,近义,反义,整体与局部等各种关系……
中文中的单词至少有几万个,这还不包括简单词组成的短语,如果有一个命题是“苹果是圆的”,那么是否也需要同时加入“红富士是圆的”,如果这样描述属性,恐怕是举不胜举了。而人类一般可以 ...