解释多类逻辑回归中的预测概率
Posted
技术标签:
【中文标题】解释多类逻辑回归中的预测概率【英文标题】:Interpret predicted probabilities in multiclass logistic regression 【发布时间】:2018-07-05 16:04:40 【问题描述】:我有一个如下所示的数据集,其中 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
【问题讨论】:
请提供用于模型构建和获取预测的代码示例(通常,scikit-learn
会返回每个类的概率)
【参考方案1】:
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])
即该样本的概率。
【讨论】:
你能澄清一下列索引和类标签之间的关系吗,我认为你写的对于初学者来说不太清楚。【参考方案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.25
或25%
,你有一个三类问题。这意味着其他两个类的总概率质量为1 - 0.25 = 0.75
,如果你将75%
平均分配给其余两个类(这应该不是分类器的预测),你会得到0.75 / 2 = 0.375
- 或@987654328 @2
和 3
的概率(你预测了 1
)。当然,分类器对于2
和3
的概率不会相等,因此一个会更低,而另一个会更高。问题是37.5%
已经高于 比您的预测 类1
的概率,这在逻辑上是不可能的。如果分类器将概率37.5%
赋予2
类,将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]])
第一个实例第三类的概率在第一行的第三列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_
进行检查 - 该数组的顺序对应于中的列索引你从逻辑回归得到的概率数组。
【讨论】:
以上是关于解释多类逻辑回归中的预测概率的主要内容,如果未能解决你的问题,请参考以下文章