CCF 疫情期间网民情绪识别 trick分享

多分类问题下面,我们经常会遇到一些指标,比如正在进行的DF平台上的比赛,疫情期间网民情绪识别,用这个trick就能轻易地提分。
i数据智能上面提到:如果多类别不均衡的话,这时候直接使用神经网络优化交叉熵损失得到的结果,f1显然不是全局最优的,二分类下可以用阈值搜索,如果是多分类怎么做一个阈值搜索呢?传统的多分类我们预测结果使用argmax(logits)这时候,可以形式化的表达为求argmax(w*logits)使得f1均值最大。其中w就是要求得的再放缩权重。 我们可以使用非线性优化的方法,求解这个问题,scipy的库里有很多实现了。

以下为笔者自己实现的代码,希望对大家的比赛有帮助。

from functools import partial
import numpy as np
import scipy as sp
from sklearn.metrics import f1_score
class OptimizedF1(object):
    def __init__(self):
        self.coef_ = []

    def _kappa_loss(self, coef, X, y):
        """
        y_hat = argmax(coef*X, axis=-1)
        :param coef: (1D array) weights
        :param X: (2D array)logits
        :param y: (1D array) label
        :return: -f1
        """
        X_p = np.copy(X)
        X_p = coef*X_p
        ll = f1_score(y, np.argmax(X_p, axis=-1), average='macro')
        return -ll

    def fit(self, X, y):
        loss_partial = partial(self._kappa_loss, X=X, y=y)
        initial_coef = [1. for _ in range(len(set(y)))]
        self.coef_ = sp.optimize.minimize(loss_partial, initial_coef, method='nelder-mead')

    def predict(self, X, y):
        X_p = np.copy(X)
        X_p = self.coef_['x'] * X_p
        return f1_score(y, np.argmax(X_p, axis=-1), average='macro')

    def coefficients(self):
        return self.coef_['x']

调用时:

op = OptimizedF1()
op.fit(logits,labels)
logits = op.coefficients()*logits 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 终于要回北京了! 很奇怪的,最近几年对于北京越来越多的用到了“回”这个字。有时候自己都觉得很怪异。 这五年来,在家...
    星星的成长之路阅读 265评论 0 4
  • 生病了难受的是自己,心疼的是家人,年轻不是浪费生命的理由,有了健康才能实现自己想要的一切!从今天开始,好好吃饭,好...
    A分享阅读 170评论 0 5
  • 一、KVO原理 1. KVO 简介 KVO 是 Objective-C 对观察者设计模式的一种实现。KVO 提供一...
    sudhengshi阅读 634评论 0 4
  • 为了一个男人,离开了父母,兄弟姐妹,来到一个陌生的世界,努力去讨好他的家人,还要强颜欢笑着! 会像个迷了路的孩子,...
    梦雅星辰阅读 286评论 2 0