Python Dataframe:在一列上使用Groupby计算置信度或预测间隔

问题描述 投票:1回答:2

我有一张如下表:

Type    Actual  Predicted
A       4       3
A       10      18
A       13      11
B       3       10
B       4       2
B       8       33
C       20      17
C       40      33
C       87      80
C       32      30

我想计算每种类型的R ^ 2和RMSE。这样做的代码如下:

import numpy as np
import pandas as pd
from sklearn.metrics import r2_score, mean_squared_error

def r2_rmse( g ):
    r2 = r2_score( g['Actual'], g['Predicted'] )
    rmse = np.sqrt( mean_squared_error( g['Actual'], g['Predicted'] ) )
    return pd.Series( dict(  r2 = r2, rmse = rmse ) )

your_df.groupby( 'Type' ).apply( r2_rmse ).reset_index()

样本输出表(值是假设的):

Type    R^2     RMSE    
A       0.66    4   
B       1.00    6   
C       0.03    1

上面的代码工作,并给了我想要的输出。但现在我想在Type类别的表中添加置信/预测区间。我已经在网上搜索了如何做到这一点,没有运气。

概念性问题:如果我想要以95%置信度捕获实际值的值范围,是否在“实际”列或“预测”列上运行置信区间?

以下是我想要的示例表:

Type    Conf_Int_90%  Conf_Int_80%
    A    (21, 100)       (5, 55)
    B    (10, 46)        (3, 14)
    C    (1, 19)         (12, 19)

我有一种感觉,置信区间代码是这样的:

st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a)) BUT ... 

我将哪些特定代码合并到现有代码中(如上所示),以便获得我想要的表输出?

python pandas numpy scikit-learn intervals
2个回答
1
投票

尝试跟随,根据我的理解,置信区间应在预测列中运行。希望它能帮到你:)

import numpy as np
import pandas as pd
import scipy.stats as st
from sklearn.metrics import r2_score, mean_squared_error

def r2_rmse_interval(g):
    r2 = r2_score( g['Actual'], g['Predicted'] )
    rmse = np.sqrt( mean_squared_error( g['Actual'], g['Predicted'] ))
    st_interval = st.t.interval(0.95, len(g) -1, loc=np.mean(g.Predicted), scale=st.sem(g.Predicted))
    return pd.Series( dict(  r2 = r2, rmse = rmse, st_interval = st_interval) )


df = pd.DataFrame({'Type': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C'],
               'Actual': [4, 10, 13, 3, 4, 8, 20, 40, 87, 32],
               'Predicted': [3, 18, 11, 10, 2, 33, 17, 33, 80, 30]}, 
                columns=['Type', 'Actual', 'Predicted'])

df.groupby( 'Type' ).apply( r2_rmse_interval ).reset_index()

1
投票

使用standard formula for 95% CI

sample mean +/- 1.96 * std.err

你可以和apply一起做所有事情:

def stats(g):
    r2 = r2_score(g.Actual, g.Predicted)
    rmse = np.sqrt(mean_squared_error(g.Actual, g.Predicted))
    ci95_hi = g.Predicted.mean() + g.Predicted.sem() * 1.96
    ci95_lo = g.Predicted.mean() - g.Predicted.sem() * 1.96
    return r2, rmse,(ci95_lo, ci95_hi)

df.groupby("Type").apply(stats)
© www.soinside.com 2019 - 2024. All rights reserved.