【问题标题】:Calculating multinomial logit model prediction probabilities计算多项式 logit 模型预测概率
【发布时间】:2020-01-27 20:38:51
【问题描述】:

请尝试给出参数化解决方案(有超过三个替代方案)。

我有一个带有 beta 值的字典:

{'B_X1': 2.0, 'B_X2': -3.0}

还有这个数据框:

 X1_123  X1_456  X1_789  X2_123  X2_456  X2_789
   6.75    4.69    9.59    5.52    9.69    7.40
   7.46    4.94    3.01    1.78    1.38    4.68
   2.05    7.30    4.08    7.02    8.24    8.49
   5.60    7.88    8.11    5.98    4.60    1.39
   1.80    8.28    9.16    7.34    7.69    6.16
   3.73    6.93    8.93    2.58    3.48    6.04
   8.06    8.88    7.06    6.76    4.68    7.82
   5.00    7.29    5.86    3.92    5.67    4.10
   2.49    2.55    4.66    7.15    6.26    7.87
   1.50    3.35    5.70    9.86    4.83    1.17
   8.19    7.72    9.56    6.61    4.15    3.64
   2.43    9.54    9.15    4.41    9.18    7.85
   2.71    3.24    4.56    6.22    7.89    9.93
   5.96    4.34    5.26    8.63    9.81    9.40

123456789 是备选方案。

我想用这个公式计算预测概率:

jks 是上述替代方案。

预期结果:

 X1_123  X1_456  X1_789  X2_123  X2_456  X2_789  P_123  P_456  P_789
   6.75    4.69    9.59    5.52    9.69    7.40  0.490  0.000  0.510
   7.46    4.94    3.01    1.78    1.38    4.68  0.979  0.021  0.000
   2.05    7.30    4.08    7.02    8.24    8.49  0.001  0.998  0.001
   5.60    7.88    8.11    5.98    4.60    1.39  0.000  0.000  1.000
   1.80    8.28    9.16    7.34    7.69    6.16  0.000  0.002  0.998
   3.73    6.93    8.93    2.58    3.48    6.04  0.024  0.952  0.024
   8.06    8.88    7.06    6.76    4.68    7.82  0.000  1.000  0.000
   5.00    7.29    5.86    3.92    5.67    4.10  0.210  0.107  0.683
   2.49    2.55    4.66    7.15    6.26    7.87  0.038  0.623  0.339
   1.50    3.35    5.70    9.86    4.83    1.17  0.000  0.000  1.000
   8.19    7.72    9.56    6.61    4.15    3.64  0.000  0.005  0.995
   2.43    9.54    9.15    4.41    9.18    7.85  0.041  0.037  0.922
   2.71    3.24    4.56    6.22    7.89    9.93  0.981  0.019  0.001
   5.96    4.34    5.26    8.63    9.81    9.40  0.975  0.001  0.024

每行的概率总和应该为 1。

请尝试给出参数化解决方案(有3个以上的选择)。

每个备选方案的预期结果为常数: {'B_X1': 2.0, 'B_X2': -3.0, 'B_123': 0.1, 'B_456': 0.2, 'B_789': 0.3}

 X1_123  X1_456  X1_789  X2_123  X2_456  X2_789  P_123  P_456  P_789
   6.75    4.69    9.59    5.52    9.69    7.40  0.440  0.000  0.560
   7.46    4.94    3.01    1.78    1.38    4.68  0.977  0.023  0.000
   2.05    7.30    4.08    7.02    8.24    8.49  0.001  0.998  0.001
   5.60    7.88    8.11    5.98    4.60    1.39  0.000  0.000  1.000
   1.80    8.28    9.16    7.34    7.69    6.16  0.000  0.002  0.998
   3.73    6.93    8.93    2.58    3.48    6.04  0.021  0.952  0.027
   8.06    8.88    7.06    6.76    4.68    7.82  0.000  1.000  0.000
   5.00    7.29    5.86    3.92    5.67    4.10  0.180  0.102  0.717
   2.49    2.55    4.66    7.15    6.26    7.87  0.034  0.604  0.363
   1.50    3.35    5.70    9.86    4.83    1.17  0.000  0.000  1.000
   8.19    7.72    9.56    6.61    4.15    3.64  0.000  0.005  0.995
   2.43    9.54    9.15    4.41    9.18    7.85  0.034  0.034  0.932
   2.71    3.24    4.56    6.22    7.89    9.93  0.978  0.021  0.001
   5.96    4.34    5.26    8.63    9.81    9.40  0.970  0.001  0.029

【问题讨论】:

    标签: python pandas numpy mlogit


    【解决方案1】:

    IIUC:

    将列转换为多索引

    df = df.set_axis(df.columns.str.split('_', expand=True), axis=1, inplace=False)
    

    并定义您的 B 以使键与 df 中的前缀匹配

    B = {'X1': 2.0, 'X2': -3.0}
    

    然后

    def f(b, x):
        return np.exp((b * x).sum(1))
    
    parts = f(B, df.stack()).unstack()
    
    preds = parts.div(parts.sum(1), axis=0)
    
    df.join(pd.concat({'P': preds}, axis=1).round(3)).pipe(
        lambda d: d.set_axis(map('_'.join, d.columns), axis=1, inplace=False)
    )
    
        X1_123  X1_456  X1_789  X2_123  X2_456  X2_789  P_123  P_456  P_789
    0     6.75    4.69    9.59    5.52    9.69    7.40  0.490  0.000  0.510
    1     7.46    4.94    3.01    1.78    1.38    4.68  0.979  0.021  0.000
    2     2.05    7.30    4.08    7.02    8.24    8.49  0.001  0.998  0.001
    3     5.60    7.88    8.11    5.98    4.60    1.39  0.000  0.000  1.000
    4     1.80    8.28    9.16    7.34    7.69    6.16  0.000  0.002  0.998
    5     3.73    6.93    8.93    2.58    3.48    6.04  0.024  0.952  0.024
    6     8.06    8.88    7.06    6.76    4.68    7.82  0.000  1.000  0.000
    7     5.00    7.29    5.86    3.92    5.67    4.10  0.210  0.107  0.683
    8     2.49    2.55    4.66    7.15    6.26    7.87  0.038  0.623  0.339
    9     1.50    3.35    5.70    9.86    4.83    1.17  0.000  0.000  1.000
    10    8.19    7.72    9.56    6.61    4.15    3.64  0.000  0.005  0.995
    11    2.43    9.54    9.15    4.41    9.18    7.85  0.041  0.037  0.922
    12    2.71    3.24    4.56    6.22    7.89    9.93  0.981  0.019  0.001
    13    5.96    4.34    5.26    8.63    9.81    9.40  0.975  0.001  0.024
    

    封装在一个漂亮的函数中

    def f(df, b):
        d = df.set_axis(df.columns.str.split('_', expand=True), axis=1, inplace=False)
        parts = np.exp(d.stack().mul(b).sum(1).unstack())
        preds = pd.concat({'P': parts.div(parts.sum(1), axis=0)}, axis=1).round(3)
        d = d.join(preds)
        d.columns = list(map('_'.join, d.columns))
        return d
    
    f(df, B)
    
        X1_123  X1_456  X1_789  X2_123  X2_456  X2_789  P_123  P_456  P_789
    0     6.75    4.69    9.59    5.52    9.69    7.40  0.490  0.000  0.510
    1     7.46    4.94    3.01    1.78    1.38    4.68  0.979  0.021  0.000
    2     2.05    7.30    4.08    7.02    8.24    8.49  0.001  0.998  0.001
    3     5.60    7.88    8.11    5.98    4.60    1.39  0.000  0.000  1.000
    4     1.80    8.28    9.16    7.34    7.69    6.16  0.000  0.002  0.998
    5     3.73    6.93    8.93    2.58    3.48    6.04  0.024  0.952  0.024
    6     8.06    8.88    7.06    6.76    4.68    7.82  0.000  1.000  0.000
    7     5.00    7.29    5.86    3.92    5.67    4.10  0.210  0.107  0.683
    8     2.49    2.55    4.66    7.15    6.26    7.87  0.038  0.623  0.339
    9     1.50    3.35    5.70    9.86    4.83    1.17  0.000  0.000  1.000
    10    8.19    7.72    9.56    6.61    4.15    3.64  0.000  0.005  0.995
    11    2.43    9.54    9.15    4.41    9.18    7.85  0.041  0.037  0.922
    12    2.71    3.24    4.56    6.22    7.89    9.93  0.981  0.019  0.001
    13    5.96    4.34    5.26    8.63    9.81    9.40  0.975  0.001  0.024
    

    【讨论】:

    • 非常酷,但是如果我有两个以上的变量和测试版,你能告诉我如何以参数化的方式实现这个解决方案吗?
    • 有不止一种方法可以将您的意思解释为“参数化”。请举例说明您的意思。 IMO,我提供的内容是参数化的,因为我提供了一个带参数的函数。
    • 如果我有 X1, X2, ..., X20,那么我想避免手动编写它们。假设我们有[X1, X2, ..., X20] 的列表,所以我们可以使用它。
    • 看看有没有帮助。
    • 最后一个问题,如果我有每个备选方案的常量:{'B_X1': 2.0, 'B_X2': -3.0, 'B_123': 0.1, 'B_456': 0.2, 'B_789': 0.3},我该如何添加它? (使用常量查看预期结果。)
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2021-05-31
    • 2014-04-08
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多