首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
1
MADlib——基于SQL的数据挖掘解决方案(20)——时间序列分析之ARIMA
2
MADlib——基于SQL的数据挖掘解决方案(8)——数据探索之描述性统计
3
MADlib——基于SQL的数据挖掘解决方案(7)——数据转换之其它转换
4
MADlib——基于SQL的数据挖掘解决方案(6)——数据转换之矩阵分解
5
MADlib——基于SQL的数据挖掘解决方案(5)——数据转换之邻近度
6
MADlib——基于SQL的数据挖掘解决方案(3)——数据类型之向量
7
MADlib——基于SQL的数据挖掘解决方案(4)——数据类型之矩阵
8
MADlib——基于SQL的数据挖掘解决方案(26)——聚类之k-means方法
9
MADlib——基于SQL的数据挖掘解决方案(25)——分类之随机森林
10
MADlib——基于SQL的数据挖掘解决方案(24)——分类之决策树
11
MADlib——基于SQL的数据挖掘解决方案(23)——分类之SVM
12
MADlib——基于SQL的数据挖掘解决方案(22)——分类之朴素贝叶斯
13
MADlib——基于SQL的数据挖掘解决方案(21)——分类之KNN
14
MADlib——基于SQL的数据挖掘解决方案(19)——回归之聚类方差
15
MADlib——基于SQL的数据挖掘解决方案(30)——模型评估之预测度量
16
MADlib——基于SQL的数据挖掘解决方案(18)——回归之稳健方差
17
MADlib——基于SQL的数据挖掘解决方案(17)——回归之Cox比例风险回归
18
MADlib——基于SQL的数据挖掘解决方案(29)——模型评估之交叉验证
19
MADlib——基于SQL的数据挖掘解决方案(16)——回归之弹性网络回归
20
MADlib——基于SQL的数据挖掘解决方案(15)——回归之序数回归
21
MADlib——基于SQL的数据挖掘解决方案(14)——回归之多类回归
22
MADlib——基于SQL的数据挖掘解决方案(13)——回归之逻辑回归
23
MADlib——基于SQL的数据挖掘解决方案(12)——回归之广义线性模型
24
MADlib——基于SQL的数据挖掘解决方案(11)——回归之线性回归
25
MADlib——基于SQL的数据挖掘解决方案(10)——数据探索之主成分分析
26
MADlib——基于SQL的数据挖掘解决方案(9)——数据探索之概率统计
27
MADlib——基于SQL的数据挖掘解决方案(2)——MADlib基础
28
MADlib——基于SQL的数据挖掘解决方案(1)——数据挖掘入门

MADlib——基于SQL的数据挖掘解决方案(30)——模型评估之预测度量

一、预测度量

该模块提供了一组度量来评估模型预测的质量。除非另有说明,典型的函数将采用一组“预测”和“观察”值,并使用它们来计算所需的度量。所有功能都支持分组(混淆矩阵除外)。

二、预测度量函数

  1. 平均绝对误差:mean_abs_error(table_in, table_out,prediction_col, observed_col, grouping_cols)
  2. 平均绝对百分误差:mean_abs_perc_error(table_in,table_out, prediction_col, observed_col, grouping_cols)
  3. 平均百分比误差:mean_perc_error(table_in, table_out,prediction_col, observed_col, grouping_cols)
  4. 均方误差:mean_squared_error(table_in, table_out,prediction_col, observed_col, grouping_cols)
  5. R2评分:r2_score(table_in, table_out,prediction_col, observed_col, grouping_cols)
  6. 整后的R2评分:adjusted_r2_score(table_in,table_out, prediction_col, observed_col, num_predictors, training_size,grouping_cols)
  7. 与二元分类相关的预测度量:binary_classifier(table_in,table_out, prediction_col, observed_col, grouping_cols)
  8. ROC曲线下的面积(二元分类):area_under_roc(table_in,table_out, prediction_col, observed_col, grouping_cols)
  9. 多类分类器的混淆矩阵:confusion_matrix(table_in,table_out, prediction_col, observed_col, grouping_cols)

三、参数

table_in:TEXT。输入表的名称。

table_out:TEXT。输出表的名称。出于一致性,即使在不使用分组的情况下,也会为所有度量输出创建一个表,这可能意味着在某些情况下输出表中只有一个值。

prediction_col:TEXT。输入表中预测值列的名称。

observed_col:TEXT。输入表中观察值列的名称。

num_predictors(只对adjusted_r2_score):INTEGER。不含常数项的预测模型中的参数个数。

training_size(只对adjusted_r2_score):INTEGER。用于训练的行数,不包括任何空行。

grouping_cols(可选):TEXT。缺省值为NULL。输入表中分组列的名称。

四、函数的具体细节

1.r2_score

该函数返回预测值和观测值之间的决定系数(R2)。R2为1表示回归线与数据完全吻合,而R2为0表示该线完全不适合数据。当将非线性函数拟合为数据时,R2可能出现负值。详情请参阅参考资料[1]。

2. adjusted_r2_score

该函数返回对上述R2调整后的评分。当模型中加入额外的解释变量时,调整后的R2得分用来抵消R2自动增加的问题。它需要两个额外参数描述模型的自由度(num_predictors)和函数训练集的大小(training_size):

  • num_predictors:指示模型具有常数项以外的参数个数。例如,如果它被设置为“3”的模式,可采取以下形式为例:7 + 5x + 39y + 0.91z。
  • training_size:指示训练集的行数(不包括任何空行)。

这些参数都不能从预测值和测试数据中推断出来,这就是它们是显式输入的原因。详情请参阅参考资料[1]。

3.BinaryClassification

该函数返回一个输出表,其中包含一些二进制分类常用的度量指标。各度量的定义如下:

  • tp:正确分类的正样本计数。
  • tn:正确分类的负样本计数。
  • fp:错误分类的正样本计数。
  • fn:错误分类的负样本计数。
  • tpr= tp / (tp + fn)
  • tnr = tn / (fp + tn)
  • ppv = tp / (tp + fp)
  • npv = tn / (tn + fn)
  • fpr = fp / (fp + tn)
  • fdr = 1- ppv
  • fnr = fn / (fn + tp)
  • acc = (tp + tn)/ (tp + tn + fp + fn)
  • f1 = 2* tp / (2 * tp + fp + fn)

4. area_under_roc

该函数返回二元分类(AUC)下接收者操作特征曲线下的面积。ROC曲线是曲线与分类器的TPR和FPR度量。(这些度量定义见上面的二进制分类)。详情请参阅参考资料[2]。注意二分类函数可以用来获取绘制ROC曲线要求的数据(TPR和FPR值)。

注意:

对于‘binary_classifier’和‘area_under_roc’函数:

  • “observed_col”列为一个有两个值的数值列:0和1,或一个布尔列。就公制计算而言,0被认为是负的,1被认为是正的。
  • “pred_col”列包含相应的似然概率值。更大的值对应于更大的确定性,即所观察到的值将是“1”,而较低的值对应于更大的确定性,它将是“0”。

5. confusion_matrix

该函数返回多类分类的混淆矩阵。矩阵的每一列表示一个预测类中的实例,而每一行代表实际类中的实例。这比精确猜测(准确率)允许更详细的分析。详情请参阅参考资料[3]。请注意,混淆矩阵不支持分组。

五、示例

1. 创建示例数据

代码语言:javascript
复制
drop table if exists test_set;
create table test_set(
                  pred float8,
                  obs float8
                );
insert into test_set values
  (37.5,53.1), (12.3,34.2), (74.2,65.4), (91.1,82.1);

2. 运行平均绝对误差函数

代码语言:javascript
复制
drop table if exists table_out;
select madlib.mean_abs_error( 'test_set', 'table_out', 'pred', 'obs');
select * from table_out;

结果:

代码语言:javascript
复制
 mean_abs_error 
----------------
         13.825
(1 row)

3. 运行平均绝对百分误差函数

代码语言:javascript
复制
drop table if exists table_out;
select madlib.mean_abs_perc_error( 'test_set', 'table_out', 'pred', 'obs');
select * from table_out;

结果:

代码语言:javascript
复制
        avg        
-------------------
 0.294578793636013
(1 row)

4.运行平均百分比误差函数

代码语言:javascript
复制
drop table if exists table_out;
select madlib.mean_perc_error( 'test_set', 'table_out', 'pred', 'obs');
select * from table_out;

结果:

代码语言:javascript
复制
  mean_perc_error  
-------------------
 -0.17248930032771
(1 row)

5. 运行均方误差函数

代码语言:javascript
复制
drop table if exists table_out;
select madlib.mean_squared_error( 'test_set', 'table_out', 'pred', 'obs');
select * from table_out;

结果:

代码语言:javascript
复制
 mean_squared_error 
--------------------
           220.3525
(1 row)

6. 运行R2评分函数

代码语言:javascript
复制
drop table if exists table_out;
select madlib.r2_score( 'test_set', 'table_out', 'pred', 'obs');
select * from table_out;

结果:

代码语言:javascript
复制
     r2_score      
-------------------
 0.279929088443375
(1 row)

7. 运行调整后的R2评分函数

代码语言:javascript
复制
drop table if exists table_out;
select madlib.adjusted_r2_score( 'test_set', 'table_out', 'pred', 'obs', 3, 100);
select * from table_out;

结果:

代码语言:javascript
复制
     r2_score      | adjusted_r2_score 
-------------------+-------------------
 0.279929088443375 | 0.257426872457231
(1 row)

8. 为二进制分类器度量创建样本数据

代码语言:javascript
复制
drop table if exists test_set;
create table test_set as
    select ((a*8)::integer)/8.0 pred,
        ((a*0.5+random()*0.5)>0.5) obs
    from (select random() as a from generate_series(1,100)) x;

9. 运行二元分类器度量函数

代码语言:javascript
复制
drop table if exists table_out;
select madlib.binary_classifier( 'test_set', 'table_out', 'pred', 'obs');

10. 查看真正率和假正率

代码语言:javascript
复制
select threshold, tpr, fpr from table_out order by threshold;

结果:

代码语言:javascript
复制
       threshold        |        tpr        |        fpr         
------------------------+-------------------+--------------------
 0.00000000000000000000 |                 1 |                  1
 0.12500000000000000000 |                 1 |  0.882352941176471
 0.25000000000000000000 | 0.979591836734694 |  0.745098039215686
 0.37500000000000000000 | 0.897959183673469 |  0.568627450980392
 0.50000000000000000000 | 0.836734693877551 |  0.431372549019608
 0.62500000000000000000 | 0.693877551020408 |  0.313725490196078
 0.75000000000000000000 | 0.551020408163265 |  0.176470588235294
 0.87500000000000000000 | 0.428571428571429 | 0.0980392156862745
 1.00000000000000000000 | 0.163265306122449 | 0.0196078431372549
(9 rows)

11. 查看给定阈值下的所有度量值

代码语言:javascript
复制
-- Set extended display on for easier reading of output
\x on
select * from table_out where threshold=0.5;

结果:

代码语言:javascript
复制
-[ RECORD 1 ]---------------------
threshold | 0.50000000000000000000
tp        | 41
fp        | 22
fn        | 8
tn        | 29
tpr       | 0.836734693877551
tnr       | 0.568627450980392
ppv       | 0.650793650793651
npv       | 0.783783783783784
fpr       | 0.431372549019608
fdr       | 0.349206349206349
fnr       | 0.163265306122449
acc       | 0.7
f1        | 0.73214285714285714286

12. 运行ROC曲线下的面积函数

代码语言:javascript
复制
drop table if exists table_out;
select madlib.area_under_roc( 'test_set', 'table_out', 'pred', 'obs');
select * from table_out;

结果:

代码语言:javascript
复制
               area_under_roc                
---------------------------------------------
 0.77691076430572228891752501000400160064025
(1 row)

13. 创建混淆矩阵的样本数据

代码语言:javascript
复制
drop table if exists test_set;
create table test_set as
    select (x+y)%5+1 as pred,
        (x*y)%5 as obs
    from generate_series(1,5) x,
        generate_series(1,5) y;

14. 运行混淆矩阵函数

代码语言:javascript
复制
drop table if exists table_out;
select madlib.confusion_matrix( 'test_set', 'table_out', 'pred', 'obs');
select * from table_out order by class;

结果:

代码语言:javascript
复制
 row_id | class | confusion_arr 
--------+-------+---------------
      1 |     0 | {0,1,2,2,2,2}
      2 |     1 | {0,2,0,1,1,0}
      3 |     2 | {0,0,0,2,2,0}
      4 |     3 | {0,0,2,0,0,2}
      5 |     4 | {0,2,1,0,0,1}
      6 |     5 | {0,0,0,0,0,0}
(6 rows)

六、参考文献

[1]https://en.wikipedia.org/wiki/Coefficient_of_determination

[2]https://en.wikipedia.org/wiki/Receiver_operating_characteristic

[3]https://en.wikipedia.org/wiki/Confusion_matrix

下一篇
举报
领券