コード例 #1
0
    def get_metrics(self, scores, labels, prefix):
        scores = np.asarray(scores)
        labels = np.asarray(labels)

        metrics = {'{}_logloss'.format(prefix): log_loss(y_true=labels, y_pred=scores),
                   '{}_auc'.format(prefix): roc_auc_score(y_true=labels, y_score=scores)}

        pred_labels = (scores > 0.5).astype(int)
        metrics['{}_accuracy'.format(prefix)] = np.sum(pred_labels == labels) / len(labels)

        return metrics
コード例 #2
0
    def get_metrics(self, score, label, perfix):
        score = np.asarray(score)
        label = np.asarray(label)
        metrics = {
            '{}_logloss'.format(perfix): log_loss(label, score),
            '{}_auc'.format(perfix): roc_auc_score(label, score)
        }
        pred_labels = (score > 0.5).astype(int)
        metrics['{}_accuracy'.format(perfix)] = np.sum(
            pred_labels == label) / len(label)

        return metrics
コード例 #3
0
ファイル: uncertainty.py プロジェクト: liujiandu/bnn
 def anomaly_detection(anomaly_score_dict, name, df):
      X=[]
      Y=[]
      for l in anomaly_score_dict:
          X += anomaly_score_dict[l]
          if l in inside_labels:
              y += [0]*len(anomaly_score_dict[l])
          else:
              y += [1]*len(anomaly_score_dict[l])
      x = np.array(X)
      y = np.array(Y)
      X, y = utils.shuffle(X, y, random_state=0)
      X_train = X[:len(X)/2]
      y_train = y[:len(y)/2]
      
      clf = linear_model.LogisticRegressor(C=1.0)
      clf.fit(X_train, y_train)
      auc = metrics.roc_auc_score(np.array(y_test), clf.predict_proda(np.array(X_test))[:,1])
      print("AUC", auc)
      df.set_value()
コード例 #4
0
def generate_classification_perf(truths, pred_probs, multiclass=False):
    """Given truths, and predicted probabilities, generate ModelPerf object"""
    pred_classes = np.round(pred_probs).astype(int)
    with warnings.catch_warnings():
        warnings.simplefilter("ignore")
        retval = ClassificationModelPerf(
            auroc=metrics.roc_auc_score(truths, pred_probs),
            auroc_curve=metrics.roc_curve(truths, pred_probs)
            if not multiclass else None,
            auprc=metrics.average_precision_score(truths, pred_probs),
            accuracy=metrics.accuracy_score(truths, pred_classes)
            if not multiclass else None,
            recall=metrics.recall_score(truths, pred_classes)
            if not multiclass else None,
            precision=metrics.precision_score(truths, pred_classes)
            if not multiclass else None,
            f1=metrics.f1_score(truths, pred_classes)
            if not multiclass else None,
            ce_loss=metrics.log_loss(truths, pred_probs, normalize=False) /
            np.prod(truths.shape),
        )
    return retval
コード例 #5
0
print(X_test.shape)
print("Y_test.shape: ")
print(Y_test.shape)

In [30]:
# 3.1 建立逻辑回归模型,并且设定参数  
lr_model= LogisticRegression(penalty='l2', C=1000, solver='lbfgs', max_iter=500)

# 3.2 训练逻辑回归模型
lr_model.fit(X_train,Y_train.values.ravel())

In [31]:
# 3.3 采用测试集验证模型离线指标  
# 训练集AUC
probs_train= lr_model.predict_proba(X_train)  
AUC1 = metrics.roc_auc_score(Y_train, probs_train[:,1])
print("Train Auc: %s"%(AUC1))

# 测试集AUC
probs_test= lr_model.predict_proba(X_test)  
predict_test = lr_model.predict(X_test)
AUC2 = metrics.roc_auc_score(Y_test, probs_test[:,1])
print("Test Auc: %s"%(AUC2))

# 准确率
accuracy = metrics.accuracy_score(Y_test, predict_test) 
print("Test Accuracy: %s"%(accuracy))

# 召回率
recall = metrics.recall_score(Y_test, predict_test) 
print("Test Recall: %s"%(recall))
コード例 #6
0
ファイル: run.py プロジェクト: wuch15/PLM4NewsRec
def test(args):

    if args.enable_hvd:
        import horovod.torch as hvd

    hvd_size, hvd_rank, hvd_local_rank = utils.init_hvd_cuda(
        args.enable_hvd, args.enable_gpu)

    if args.load_ckpt_name is not None:
        #TODO: choose ckpt_path
        ckpt_path = utils.get_checkpoint(args.model_dir, args.load_ckpt_name)
    else:
        ckpt_path = utils.latest_checkpoint(args.model_dir)

    assert ckpt_path is not None, 'No ckpt found'
    checkpoint = torch.load(ckpt_path)

    if 'subcategory_dict' in checkpoint:
        subcategory_dict = checkpoint['subcategory_dict']
    else:
        subcategory_dict = {}

    category_dict = checkpoint['category_dict']
    word_dict = checkpoint['word_dict']
    domain_dict = checkpoint['domain_dict']
    tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
    config = AutoConfig.from_pretrained("bert-base-uncased",
                                        output_hidden_states=True)
    bert_model = AutoModel.from_pretrained("bert-base-uncased", config=config)
    model = ModelBert(args, bert_model, len(category_dict), len(domain_dict),
                      len(subcategory_dict))

    if args.enable_gpu:
        model.cuda()

    model.load_state_dict(checkpoint['model_state_dict'])
    logging.info(f"Model loaded from {ckpt_path}")

    if args.enable_hvd:
        hvd.broadcast_parameters(model.state_dict(), root_rank=0)

    model.eval()
    torch.set_grad_enabled(False)

    news, news_index, category_dict, domain_dict, subcategory_dict = read_news_bert(
        os.path.join(args.root_data_dir,
                     f'{args.market}/{args.test_dir}/news.tsv'), args,
        tokenizer)

    news_title, news_title_type, news_title_attmask, \
    news_abstract, news_abstract_type, news_abstract_attmask, \
    news_body, news_body_type, news_body_attmask, \
    news_category, news_domain, news_subcategory = get_doc_input_bert(
        news, news_index, category_dict, domain_dict, subcategory_dict, args)

    news_combined = np.concatenate([
    x for x in
    [news_title, news_title_type, news_title_attmask, \
    news_abstract, news_abstract_type, news_abstract_attmask, \
    news_body, news_body_type, news_body_attmask, \
    news_category, news_domain, news_subcategory]
    if x is not None], axis=1)

    class NewsDataset(Dataset):
        def __init__(self, data):
            self.data = data

        def __getitem__(self, idx):
            return self.data[idx]

        def __len__(self):
            return self.data.shape[0]

    def news_collate_fn(arr):
        arr = torch.LongTensor(arr)
        return arr

    news_dataset = NewsDataset(news_combined)
    news_dataloader = DataLoader(news_dataset,
                                 batch_size=args.batch_size * 4,
                                 num_workers=args.num_workers,
                                 collate_fn=news_collate_fn)

    news_scoring = []
    with torch.no_grad():
        for input_ids in tqdm(news_dataloader):
            input_ids = input_ids.cuda()
            news_vec = model.news_encoder(input_ids)
            news_vec = news_vec.to(torch.device("cpu")).detach().numpy()
            news_scoring.extend(news_vec)

    news_scoring = np.array(news_scoring)

    logging.info("news scoring num: {}".format(news_scoring.shape[0]))

    dataloader = DataLoaderTest(
        news_index=news_index,
        news_scoring=news_scoring,
        word_dict=word_dict,
        news_bias_scoring=None,
        data_dir=os.path.join(args.root_data_dir,
                              f'{args.market}/{args.test_dir}'),
        filename_pat=args.filename_pat,
        args=args,
        world_size=hvd_size,
        worker_rank=hvd_rank,
        cuda_device_idx=hvd_local_rank,
        enable_prefetch=True,
        enable_shuffle=False,
        enable_gpu=args.enable_gpu,
    )

    from metrics import roc_auc_score, ndcg_score, mrr_score, ctr_score

    AUC = []
    MRR = []
    nDCG5 = []
    nDCG10 = []

    def print_metrics(hvd_local_rank, cnt, x):
        logging.info("[{}] Ed: {}: {}".format(hvd_local_rank, cnt, \
            '\t'.join(["{:0.2f}".format(i * 100) for i in x])))

    def get_mean(arr):
        return [np.array(i).mean() for i in arr]

    #for cnt, (log_vecs, log_mask, news_vecs, news_bias, labels) in enumerate(dataloader):

    for cnt, (log_vecs, log_mask, news_vecs, news_bias,
              labels) in enumerate(dataloader):
        his_lens = torch.sum(log_mask,
                             dim=-1).to(torch.device("cpu")).detach().numpy()

        if args.enable_gpu:
            log_vecs = log_vecs.cuda(non_blocking=True)
            log_mask = log_mask.cuda(non_blocking=True)

        user_vecs = model.user_encoder(log_vecs, log_mask).to(
            torch.device("cpu")).detach().numpy()

        for index, user_vec, news_vec, bias, label, his_len in zip(
                range(len(labels)), user_vecs, news_vecs, news_bias, labels,
                his_lens):

            if label.mean() == 0 or label.mean() == 1:
                continue

            score = np.dot(news_vec, user_vec)

            auc = roc_auc_score(label, score)
            mrr = mrr_score(label, score)
            ndcg5 = ndcg_score(label, score, k=5)
            ndcg10 = ndcg_score(label, score, k=10)

            AUC.append(auc)
            MRR.append(mrr)
            nDCG5.append(ndcg5)
            nDCG10.append(ndcg10)

        if cnt % args.log_steps == 0:

            print_metrics(hvd_rank, cnt * args.batch_size,
                          get_mean([AUC, MRR, nDCG5, nDCG10]))

    # stop scoring
    dataloader.join()

    for i in range(2):
        print_metrics(hvd_rank, cnt * args.batch_size,
                      get_mean([AUC, MRR, nDCG5, nDCG10]))
コード例 #7
0
def test(rank, args):
    if rank is None:
        is_distributed = False
        rank = 0
    else:
        is_distributed = True

    if is_distributed:
        utils.setuplogger()
        dist.init_process_group('nccl',
                                world_size=args.nGPU,
                                init_method='env://',
                                rank=rank)

    torch.cuda.set_device(rank)

    if args.load_ckpt_name is not None:
        ckpt_path = utils.get_checkpoint(args.model_dir, args.load_ckpt_name)

    assert ckpt_path is not None, 'No checkpoint found.'
    checkpoint = torch.load(ckpt_path, map_location='cpu')

    subcategory_dict = checkpoint['subcategory_dict']
    category_dict = checkpoint['category_dict']
    word_dict = checkpoint['word_dict']

    dummy_embedding_matrix = np.zeros(
        (len(word_dict) + 1, args.word_embedding_dim))
    module = importlib.import_module(f'model.{args.model}')
    model = module.Model(args, dummy_embedding_matrix, len(category_dict),
                         len(subcategory_dict))
    model.load_state_dict(checkpoint['model_state_dict'])
    logging.info(f"Model loaded from {ckpt_path}")

    if args.enable_gpu:
        model.cuda(rank)

    model.eval()
    torch.set_grad_enabled(False)

    news, news_index = read_news(os.path.join(args.test_data_dir, 'news.tsv'),
                                 args,
                                 mode='test')
    news_title, news_category, news_subcategory = get_doc_input(
        news, news_index, category_dict, subcategory_dict, word_dict, args)
    news_combined = np.concatenate([
        x
        for x in [news_title, news_category, news_subcategory] if x is not None
    ],
                                   axis=-1)

    news_dataset = NewsDataset(news_combined)
    news_dataloader = DataLoader(news_dataset,
                                 batch_size=args.batch_size,
                                 num_workers=4)

    news_scoring = []
    with torch.no_grad():
        for input_ids in tqdm(news_dataloader):
            input_ids = input_ids.cuda(rank)
            news_vec = model.news_encoder(input_ids)
            news_vec = news_vec.to(torch.device("cpu")).detach().numpy()
            news_scoring.extend(news_vec)

    news_scoring = np.array(news_scoring)
    logging.info("news scoring num: {}".format(news_scoring.shape[0]))

    if rank == 0:
        doc_sim = 0
        for _ in tqdm(range(1000000)):
            i = random.randrange(1, len(news_scoring))
            j = random.randrange(1, len(news_scoring))
            if i != j:
                doc_sim += np.dot(news_scoring[i], news_scoring[j]) / (
                    np.linalg.norm(news_scoring[i]) *
                    np.linalg.norm(news_scoring[j]))
        logging.info(f'News doc-sim: {doc_sim / 1000000}')

    data_file_path = os.path.join(args.test_data_dir, f'behaviors_{rank}.tsv')

    def collate_fn(tuple_list):
        log_vecs = torch.FloatTensor([x[0] for x in tuple_list])
        log_mask = torch.FloatTensor([x[1] for x in tuple_list])
        news_vecs = [x[2] for x in tuple_list]
        labels = [x[3] for x in tuple_list]
        return (log_vecs, log_mask, news_vecs, labels)

    dataset = DatasetTest(data_file_path, news_index, news_scoring, args)
    dataloader = DataLoader(dataset,
                            batch_size=args.batch_size,
                            collate_fn=collate_fn)

    from metrics import roc_auc_score, ndcg_score, mrr_score

    AUC = []
    MRR = []
    nDCG5 = []
    nDCG10 = []

    def print_metrics(rank, cnt, x):
        logging.info("[{}] {} samples: {}".format(
            rank, cnt, '\t'.join(["{:0.2f}".format(i * 100) for i in x])))

    def get_mean(arr):
        return [np.array(i).mean() for i in arr]

    def get_sum(arr):
        return [np.array(i).sum() for i in arr]

    local_sample_num = 0

    for cnt, (log_vecs, log_mask, news_vecs, labels) in enumerate(dataloader):
        local_sample_num += log_vecs.shape[0]

        if args.enable_gpu:
            log_vecs = log_vecs.cuda(rank, non_blocking=True)
            log_mask = log_mask.cuda(rank, non_blocking=True)

        user_vecs = model.user_encoder(log_vecs, log_mask).to(
            torch.device("cpu")).detach().numpy()

        for user_vec, news_vec, label in zip(user_vecs, news_vecs, labels):
            if label.mean() == 0 or label.mean() == 1:
                continue

            score = np.dot(news_vec, user_vec)

            auc = roc_auc_score(label, score)
            mrr = mrr_score(label, score)
            ndcg5 = ndcg_score(label, score, k=5)
            ndcg10 = ndcg_score(label, score, k=10)

            AUC.append(auc)
            MRR.append(mrr)
            nDCG5.append(ndcg5)
            nDCG10.append(ndcg10)

        if cnt % args.log_steps == 0:
            print_metrics(rank, local_sample_num,
                          get_mean([AUC, MRR, nDCG5, nDCG10]))

    logging.info('[{}] local_sample_num: {}'.format(rank, local_sample_num))
    if is_distributed:
        local_sample_num = torch.tensor(local_sample_num).cuda(rank)
        dist.reduce(local_sample_num, dst=0, op=dist.ReduceOp.SUM)
        local_metrics_sum = torch.FloatTensor(
            get_sum([AUC, MRR, nDCG5, nDCG10])).cuda(rank)
        dist.reduce(local_metrics_sum, dst=0, op=dist.ReduceOp.SUM)
        if rank == 0:
            print_metrics('*', local_sample_num,
                          local_metrics_sum / local_sample_num)
    else:
        print_metrics('*', local_sample_num,
                      get_mean([AUC, MRR, nDCG5, nDCG10]))