sklearn中的多类概率标签数据和同类型预测用啥?
Posted
技术标签:
【中文标题】sklearn中的多类概率标签数据和同类型预测用啥?【英文标题】:What to use for multi-class probability label data and same type prediction in sklearn?sklearn中的多类概率标签数据和同类型预测用什么? 【发布时间】:2013-12-08 19:53:02 【问题描述】:我有一个用 4 个不同类别的概率值标记的数据,我也想以这种方式进行预测。但是,我找不到任何算法来处理此类数据并预测每个类的概率值而不是二进制顺序。我可以在这样的问题中使用什么?
【问题讨论】:
scikit-learn 中没有将概率分布作为y
的估计器。如果您在概率分布的argmax
上进行训练,那么逻辑回归、朴素贝叶斯和一些树集成估计器应该可以工作。
@larsmans 我们在“argmax”训练时不会丢失信息吗?
@AbhishekThakur:是的,有些信息丢失了。我现在才想到的另一种方法是将具有概率p
的样本输入训练算法两次:一次带有标签 1 和 p
的 sample_weight
,一次带有标签 0 和 sample_weight
的1-p
。不过,在多类情况下,这可能会变得复杂。
【参考方案1】:
scikit-learn 分类器不支持开箱即用的概率分布训练。解决方法是将样本 K 次提供给 K 类的训练算法,使用概率分布作为sample_weight
。并非所有分类器都支持这一点,但 SGDClassifier
确实并且将使用正确的设置拟合逻辑回归模型。
为了举例,让我们做一个随机训练集。
>>> X = np.random.randn(10, 6)
>>> p_pos = np.random.random_sample(10)
>>> p_pos
array([ 0.19751302, 0.01538067, 0.87723187, 0.63745719, 0.38188726,
0.62435933, 0.3706495 , 0.12011895, 0.61787941, 0.82476533])
现在将其输入到使用 SGD 训练的逻辑回归模型中,两次。
>>> lr = SGDClassifier(loss="log")
>>> y = p_pos > .5
>>> lr.fit(np.vstack([X, X]), np.hstack([np.ones(10), np.zeros(10)]),
... sample_weight=np.hstack([p_pos, 1 - p_pos]))
SGDClassifier(alpha=0.0001, class_weight=None, epsilon=0.1, eta0=0.0,
fit_intercept=True, l1_ratio=0.15, learning_rate='optimal',
loss='log', n_iter=5, n_jobs=1, penalty='l2', power_t=0.5,
random_state=None, shuffle=False, verbose=0, warm_start=False)
前面的例子是二进制 LR。多类 LR 稍微复杂一些。假设您有一个由n_samples
概率分布组成的矩阵 P,每个矩阵都是一个行向量:
>>> P = np.abs(np.random.randn(10, 4))
>>> P /= P.sum(axis=1).reshape(-1, 1) # normalize
>>> P
array([[ 0.22411769, 0.06275884, 0.25062665, 0.46249682],
[ 0.20659542, 0.06153031, 0.03973449, 0.69213978],
[ 0.20214651, 0.084988 , 0.12751119, 0.5853543 ],
[ 0.35839192, 0.30211805, 0.01093208, 0.32855796],
[ 0.34267131, 0.07151225, 0.09413323, 0.4916832 ],
[ 0.26670351, 0.30988833, 0.22118608, 0.20222208],
[ 0.00694437, 0.68845955, 0.18413326, 0.12046281],
[ 0.34344352, 0.27397581, 0.34626692, 0.03631376],
[ 0.29315434, 0.25683875, 0.14935136, 0.30065555],
[ 0.19147437, 0.22572122, 0.57924412, 0.00356029]])
现在我们有四个类,所以我们需要将训练集输入估计器四次。
>>> n_classes = P.shape[1]
>>> X4 = np.vstack([X for i in xrange(n_classes)])
>>> y = np.arange(n_classes).repeat(10)
>>> sample_weight = P.T.ravel()
>>> lr.fit(X4, y, sample_weight=sample_weight)
SGDClassifier(alpha=0.0001, class_weight=None, epsilon=0.1, eta0=0.0,
fit_intercept=True, l1_ratio=0.15, learning_rate='optimal',
loss='log', n_iter=5, n_jobs=1, penalty='l2', power_t=0.5,
random_state=None, shuffle=False, verbose=0, warm_start=False)
【讨论】:
以上是关于sklearn中的多类概率标签数据和同类型预测用啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何在“GridSearchCV”中使用“log_loss”和 Scikit-Learn(sklearn)中的多类标签?