美文网首页
CCF 疫情期间网民情绪识别 trick分享

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

作者: Cingti | 来源:发表于2020-03-15 22:48 被阅读0次

    多分类问题下面,我们经常会遇到一些指标,比如正在进行的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 
    

    相关文章

      网友评论

          本文标题:CCF 疫情期间网民情绪识别 trick分享

          本文链接:https://www.haomeiwen.com/subject/yqyiehtx.html