首页 文章

解释多类逻辑回归中的预测概率

提问于
浏览
2

我有一个如下所示的数据集,其中A,B,C,D,E是特征,'T'是目标变量 .

A     B    C     D     E       T
32    22   55    76    98      3
12    41   90    56    33      2
31    78   99    67    89      1
51    85   71    21    37      1
......
......

现在,我已经使用Scikit Learn应用了多类逻辑回归分类器,并获得了预测值和概率矩阵:

A     B    C     D     E       T   Predicted    Probablity
32    22   55    76    98       3     3           0.35
12    41   90    56    33       2     1           0.68
31    78   99    67    89       1     3           0.31
51    85   71    21    37       1     1           0.25

现在只想问一下我如何解释结果的可能性,1)到目前为止,我已经研究过默认情况下python的事件可能性为1.所以如果是这种情况,那么0.35被认为是事件1的可能性?或2)值是0.35是第1种情况属于“3”类的可能性吗?我怎么能计算剩下的两个 class 的可能性 . 就像是:-

A     B    C     D     E       T   Predicted     P_1    P_2    P_3
32    22   55    76    98       3     3           0.35   0.20   0.45
12    41   90    56    33       2     1           0.68   0.10   0.22
31    78   99    67    89       1     3           0.31   0.40   0.29
51    85   71    21    37       1     1           0.25   0.36   0.39

2 回答

  • 0
    from sklearn.linear_classifier import LogisticRegression
    
    lr = LogisticRegression(random_state = 1)
    lr.fit(x_train,y_train)
    

    我们符合我们的培训数据 .

    lr.predict_proba(x_test)
    

    假设数据集包含三个类 . 输出将类似于:

    array([[  2.69011925e-02,   5.40807755e-01,   4.32291053e-01],
       [  9.32525056e-01,   6.73606657e-02,   1.14278375e-04],
       [  5.24023874e-04,   3.24718067e-01,   6.74757909e-01],
       [  4.75066650e-02,   5.86482429e-01,   3.66010906e-01],
       [  1.83396339e-02,   4.77753541e-01,   5.03906825e-01],
       [  8.82971089e-01,   1.16720108e-01,   3.08803089e-04],
       [  4.64149328e-02,   7.17011933e-01,   2.36573134e-01],
       [  1.65574625e-02,   3.29502329e-01,   6.53940209e-01],
       [  8.70375470e-01,   1.29512862e-01,   1.11667567e-04],
       [  8.51328361e-01,   1.48584654e-01,   8.69851797e-05]])
    

    在给定的输出数组中,每行有3列,显示每个类的相应概率 . 每行代表一个样本 .

    lr.predict_proba(x_test[0,:]) **OR** lr.predict_proba(x_test)[0,:]
    

    输出:

    array([ 0.02690119,  0.54080775,  0.43229105])
    

    即该样本的概率 .

  • 0

    不确定结果表的来源(哪个API调用),但您的第二个假设是正确的 . 在下表中

    A     B    C     D     E       T   Predicted    Probablity
    32    22   55    76    98       3     3           0.35
    12    41   90    56    33       2     1           0.68
    31    78   99    67    89       1     3           0.31
    51    85   71    21    37       1     1           0.25
    

    你得到的结果是我假设的4个不同的样本(实例),目标变量(正确的类),预测类和预测类的概率 .

    我认为您的代码中的索引例程存在问题 . 让我们关注最后一行

    A     B    C     D     E       T   Predicted    Probablity
    51    85   71    21    37       1     1           0.25
    

    预测类的概率是 0.2525% ,并且您有三类问题 . 这意味着其他两个类的总概率质量是 1 - 0.25 = 0.75 ,如果你将 75% 均匀地划分在剩下的两个类之间(据说不是分类器的预测),你得到_2468665_ - 或 37.5% 的概率 23 (你预测 1 ) . 当然,分类器对于 23 都不会具有相同的概率,因此一个会降低,而另一个会更高 . 问题是 37.5% 已经高于预测类 1 的概率,这在逻辑上是不可能的 . 如果分类器将 37.5% 的概率 37.5%25% 分类给 1 ,那么肯定预测应该是 2 类,而不是像上面那样的类 1 .

    逻辑回归的输出是一个概率表,例如,每个实例都有一行,每个类有一列

    probs = array([[  2.69011925e-02,   5.40807755e-01,   4.32291053e-01],
       [  9.32525056e-01,   6.73606657e-02,   1.14278375e-04],
       [  5.24023874e-04,   3.24718067e-01,   6.74757909e-01],
       [  8.70375470e-01,   1.29512862e-01,   1.11667567e-04],
       [  8.51328361e-01,   1.48584654e-01,   8.69851797e-05]])
    

    第一个实例的第3个类的概率位于第一行 probs[0, 2] 的第三列 . 如果你想要数组中的预测类,你可以做 predicted_idx = np.argmax(probs, axis=1) ,这为你提供了上面数据的 array([1, 0, 2, 0, 0]) ,这是最高预测概率的列索引 . 然后,您可以通过提取仅预测类的概率

    probs[range(probs.shape[0]), predicted_idx]
    >> array([ 0.54080776,  0.93252506,  0.67475791,  0.87037547, 0.85132836])
    

    最后,您必须记住,结果表中的列索引不一定与数据集索引的方式相对应 . 如果您使用类似 sklearn.preprocessing.LabelEncoder 的内容,可能是您认为在索引0处的类实际上不在索引0处 . 您可以从 label_binarizer.classes_ 检查 - 该数组的顺序对应于概率数组中的列索引从逻辑回归得到 .

相关问题