3

我有一个如下所示的数据集,其中 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 是不是第一种情况属于“3”类的可能性?我如何计算剩余两个班级的概率。就像是:-

 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
4

2 回答 2

2

不确定您的结果表来自哪里(哪些 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.25or25%并且您有一个三类问题。这意味着其他两个类别的总概率质量为1 - 0.25 = 0.75,如果您将其75%平均分配给其余两个类别(据说不是分类器的预测),您将得到0.75 / 2 = 0.375- 或两个类别的37.5%概率(您预测)。当然,分类器对两者的概率不相等,因此一个会较低,而另一个会较高。问题是已经高于预测的class的概率,这在逻辑上是不可能的。如果分类器给出概率2312337.5%137.5%to class 2and 25%to class1那么预测应该是 class 2,而不是1像你上面所说的 class 。

逻辑回归的输出是一个概率表,其中每个实例对应一行,每个类对应一个列,例如

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]])

第一个实例的第三类的概率在第一行的第三列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_- 该数组的顺序对应于您从中获得的概率数组中的列索引逻辑回归。

于 2018-01-28T11:50:31.820 回答
2
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])

即该样本的概率。

于 2018-01-28T10:06:12.840 回答