返回 登录
3

MADlib---indatabase的可扩展数据库分析的开源库

阅读1780

Apache™MADlib®是用于可扩展数据库分析的开源库。 它提供了Pivotal Greenplum™ , PostgreSQL和Apache™HAWQ®(孵化) Hadoop Native SQL平台上的机器学习,数学和统计方法的数据并行实现。 MADlib使用MPP架构的完整计算能力处理非常大的数据集,而其他产品受到单个节点上可以加载到内存中的数据量的限制。 MADLib算法从熟悉的SQL接口调用,因此易于使用。

一.madlib的安装文档见GPDB的安装文档的
server documenation
–reference guide
–server configuration parameters
–Greenplum MADlib Extension for Analytics

二.MADlib方法:
1.监督学习SUPERVISED LEARNING

1.1 回归模型 Regression Models
Cox比例危害回归 Cox Proportional Hazards Regression
弹性净正规化 Elastic Net Regularization
广义线性模型 Generalized Linear Models
逻辑回归 Logistic Regression
边际效应 Marginal Effects
多项回归 Multinomial Regression
有序回归 Ordinal Regression
稳健方差,聚集方差 Robust Variance, Clustered Variance
支持向量机 Support Vector Machines

1.2 树方法 Tree Methods
决策树 Decision Tree
随机森林 Random Forest

1.3其他方法
条件随机场 Conditional Random Field
朴素贝叶斯 Naive Bayes

2.无监督学习 UNSUPERVISED LEARNING
2.1关联规则(Apriori) Association Rules (Apriori)
2.2 聚类(K-means) Clustering (K-means)
2.3 主题建模(LDA) Topic Modeling (LDA)
2.4 时间序列 TIME SERIES
ARIMA ARIMA
2.5模型评估 MODEL EVALUATION
交叉验证 Cross Validation
2.6 其他模块
共轭梯度 Conjugate Gradient
线性求解器 Linear Solvers
PMML导出 PMML Export
随机抽样 Random Sampling
文本的期限频率 Term Frequency for Text

3.数据类型和转换 DATA TYPES AND TRANSFORMATIONS
3.1 阵列操作 Array Operations
3.2 尺寸减小(PCA) Dimensionality Reduction (PCA)
3.3 编码分类变量 Encoding Categorical Variables
3.4 矩阵运算 Matrix Operations
3.5 矩阵因式分解(SVD,低等级) Matrix Factorization (SVD, Low Rank)
3.6 规范和距离函数 Norms and Distance Functions
3.7 稀疏向量 Sparse Vectors
3.8 统计-描述性 Descriptive
基数估计 Cardinality Estimators
相关性 Correlation
概要 Summary
3.9 统计-推论 Summary
假设检验 Hypothesis Tests
3.10 其他统计
概率函数 Probability Functions

实际中,树方法除了随机森林外用得比较多还有GBDT(Gradient Boost Decision Tree),是一种迭代的决策树算法。
模型中,避免过拟合,过拟合是指为了让训练集精度更高,学到了很多”仅在训练集上成立的规律“,导致换一个数据集当前规律就不适用了
logistic regression仅能用于线性回归,GBDT的适用面非常广。亦可用于二分类问题(设定阈值,大于阈值为正例,反之为负例)

三、安装
1.下载
在gpdb对应版本的安装包下面找到Analytics

2.文件是tgz格式,解压后用gpadmin账户执行
gppkg -i madlib-ossv1.9.1_pv1.9.6_gpdb4.3orca-rhel5-x86_64.gppkg

注意:如果GPDB4.3.10.0以上的madlib1.9.1需要执行下面语句
fix_madpack.sh –prefix madlib-installation-path

其中–prefix是安装目录,如果默认安装不需要提供,默认安装在$GPHOME/madlib

3.增加madlib到对应db
此步骤可以在$GPHOME/madlib/bin下执行 madpack –help查看语法

./madpack install -s madlib -p greenplum -c gpadmin@viltual1:5432/guangqi

执行完毕进行检查:
./madpack install-check -s madlib -p greenplum -c gpadmin@viltual1:5432/guangqi

安装时间较短,check时间较长,需要对每个module分别检查

4.升级
gppkg -u madlib-ossv1.9.1_pv1.9.6_gpdb4.3orca-rhel5-x86_64.gppkg
注意看安装包的版本范围,此安装包支持从1.9.1升级到1.9.6

对于GPDB4.3.10.0以上的madlib1.9.1需要执行下面语句
fix_madpack.sh –prefix madlib-installation-path

db库对象升级:
madpack -s madlib -p greenplum -c gpadmin@mdw:5432/testdb upgrade

5.卸载
首先卸载库对象:
madpack -s madlib -p greenplum -c gpadmin@mdw:5432/testdb uninstall
然后卸载madlib包
gppkg -r madlib-ossv1.9_pv1.9.5_gpdb4.3orca
卸载后重启db

四、官方例子
逻辑回归:
1.假设我们正在与医生就与心力衰竭有关的项目进行工作。 数据集中的因变量是患者是否在1年内发生第二次心脏病发作(是= 1)。 我们有两个独立的变量:一个是患者是否完成了愤怒控制的治疗(是= 1),另一个是特征焦虑量表的分数(更高的分数意味着更焦虑)。
这个想法是使用标记数据训练模型,然后使用该模型预测其他患者的第二次心脏病发作。

2.构建基础数据
DROP TABLE IF EXISTS patients, patients_logregr, patients_logregr_summary;

CREATE TABLE patients( id INTEGER NOT NULL,
second_attack INTEGER,
treatment INTEGER,
trait_anxiety INTEGER);

INSERT INTO patients VALUES
(1, 1, 1, 70),
(3, 1, 1, 50),
(5, 1, 0, 40),
(7, 1, 0, 75),
(9, 1, 0, 70),
(11, 0, 1, 65),
(13, 0, 1, 45),
(15, 0, 1, 40),
(17, 0, 0, 55),
(19, 0, 0, 50),
(2, 1, 1, 80),
(4, 1, 0, 60),
(6, 1, 0, 65),
(8, 1, 0, 80),
(10, 1, 0, 60),
(12, 0, 1, 50),
(14, 0, 1, 35),
(16, 0, 1, 50),
(18, 0, 0, 45),
(20, 0, 0, 60);

3.调用MADlib内置函数,使用训练数据表作为输入来训练分类模型:
SELECT madlib.logregr_train(
‘patients’, – source table
‘patients_logregr’, – output table
‘second_attack’, – labels
‘ARRAY[1, treatment, trait_anxiety]’, – features 特征变量
NULL, – grouping columns
20, – max number of iteration 最大迭代次数
‘irls’ – optimizer优化器
);

4.查看刚刚受过培训的模型:
– Set extended display on for easier reading of output (\x is for psql only)
\x on
SELECT * from patients_logregr;

SELECT unnest(array[‘intercept’, ‘treatment’, ‘trait_anxiety’]) as attribute,
unnest(coef) as coefficient,
unnest(std_err) as standard_error,
unnest(z_stats) as z_stat,
unnest(p_values) as pvalue,
unnest(odds_ratios) as odds_ratio
FROM patients_logregr;

– ** –
– Result –
– ** –
+—————+—————+——————+———–+———–+————–+
| attribute | coefficient | standard_error | z_stat | pvalue | odds_ratio |
|—————+—————+——————+———–+———–+————–|
| intercept | -6.36347 | 3.2139 | -1.97999 | 0.0477052 | 0.00172338 |
| treatment | -1.02411 | 1.17108 | -0.874498 | 0.381847 | 0.359117 |
| trait_anxiety | 0.119045 | 0.054979 | 2.16528 | 0.0303664 | 1.12642 |
+—————+—————+——————+———–+———–+————–+

5.现在使用模型使用逻辑回归模型预测因变量(1年内的第二次心脏病发作)。 为了演示,我们将使用原始数据表进行预测。 通常,与原始训练数据集具有相同特征的不同测试数据集将用于预测。

SELECT p.id, madlib.logregr_predict(coef, ARRAY[1, treatment, trait_anxiety]),
p.second_attack
FROM patients p, patients_logregr m
ORDER BY p.id;

显示预测值:
SELECT p.id, madlib.logregr_predict_prob(coef, ARRAY[1, treatment, trait_anxiety])
FROM patients p, patients_logregr m
ORDER BY p.id;
ARRAY中的1项表示标准方式中模型中的额外偏差项,以允许非零截距值。
如果概率大于0.5,则预测值为True 。 否则它被赋予False 。

注:madlib如果想知道某个模型如何使用
例子:SELECT madlib.svd(‘example’)
参数:SELECT madlib.svd(‘usage’);

评论