Example #1
0
def train(train_data,
          val_data,
          user_list_train_filtered,
          user_list_val_filtered,
          user_beta_train,
          user_beta_val,
          k,
          dataset,
          eta=0.1,
          lamb=0.1,
          tolerance=1e-4,
          num_iter_val=5,
          num_total_iter_training=6,
          random_seed=786,
          kU=None,
          cv_flag=True,
          verbose=False):

    np.random.seed(random_seed)

    user_feat = val_data.drop(['user', 'label'], axis=1).values
    user_feat_train = train_data.drop(['user', 'label'], axis=1).values
    w = np.random.normal(0, 1, user_feat.shape[1])

    metrics = Metrics()
    metrics.eta_lr = eta
    metrics.lamb_reg = lamb
    print("running for eta", eta, "and lambda", lamb)

    for i in range(num_total_iter_training):
        grad, loss = subgradient(w, train_data, user_list_train_filtered,
                                 user_beta_train, k)
        grad += lamb * w
        w = w - (eta / np.sqrt(i + 1)) * grad
        metrics.w_list.append(w)
        metrics.loss_opt_list_train.append(loss)

        y_scores = user_feat_train.dot(w)
        data_true = deepcopy(train_data)
        data_true['scores'] = y_scores
        data_true = data_true.sort_values(by='scores', ascending=False)
        data_true = data_true.reset_index(drop=True)
        metrics.micro_auc_rel_k_list_train.append(
            compute_micro(data_true, user_list_train_filtered, user_beta_train,
                          w, k))

        if verbose:
            print('Epoch', i + 1, 'completed out of', num_total_iter_training,
                  'for prec@k loss train:', metrics.loss_opt_list_train[-1])
            print('Epoch', i + 1, 'completed out of', num_total_iter_training,
                  'for prec@k grad train:', np.linalg.norm(grad))

        # evaluate combined weights
        if (cv_flag):
            if i % num_iter_val == 0:
                y_scores = user_feat.dot(w)
                data_true = deepcopy(val_data)
                data_true['scores'] = y_scores
                data_true = data_true.sort_values(by='scores', ascending=False)
                data_true = data_true.reset_index(drop=True)
                metrics.micro_auc_rel_k_list_val.append(
                    compute_micro(data_true, user_list_val_filtered,
                                  user_beta_val, w, k))

                if verbose:
                    print("\n")
                    print('Epoch', i + 1, 'completed out of',
                          num_total_iter_training, 'for prec@k loss val:',
                          metrics.micro_auc_rel_k_list_val[-1])
                    print("\n")

    return metrics, None
Example #2
0
def train(train_data,
          val_data,
          user_list_train_filtered,
          user_list_val_filtered,
          user_beta_train,
          user_beta_val,
          k,
          eta=0.1,
          lamb=0.1,
          num_iter_val=5,
          num_total_iter_training=6,
          n_classifiers=5,
          random_seed=786,
          verbose=False):

    np.random.seed(random_seed)

    user_list_val_filtered = user_list_train_filtered[
        0:int(0.2 * len(user_list_train_filtered))]
    user_list_train_filtered = list(
        set(user_list_train_filtered) - set(user_list_val_filtered))
    val_data = train_data[train_data['user'].isin(user_list_val_filtered)]
    train_data = train_data[train_data['user'].isin(user_list_train_filtered)]

    metrics = Metrics()
    metrics.eta_lr = eta
    metrics.lamb_reg = lamb

    classifier_list = []

    kf = KFold(n_splits=n_classifiers, shuffle=True)
    features = train_data.drop(['user', 'label'], axis=1)
    labels = train_data['label']
    for _, split_indices in kf.split(features):
        split_features = features.iloc[split_indices].values
        split_labels = labels.iloc[split_indices].values
        num_examples = split_features.shape[0]

        w = np.random.normal(0, 1, (split_features.shape[1], ))
        w = w / np.linalg.norm(w)
        for num_iter in np.arange(num_total_iter_training):
            scores = sigmoid(np.dot(split_features, w))
            loss = -1 / num_examples * np.sum(split_labels * np.log(scores) +
                                              (1 - split_labels) *
                                              np.log(1 - scores))
            print("loss is ", loss)
            dLdwx = (scores - split_labels) * scores * (1 - scores)
            grad = 1 / num_examples * np.sum(
                dLdwx.reshape(-1, 1) * split_features)
            grad += lamb * w
            print("grad is ", np.linalg.norm(grad))
            print("\n")
            w = w - (eta / np.sqrt(num_iter + 1)) * grad
        accuracy = np.sum(split_labels * (scores > 0.5) + (1 - split_labels) *
                          (scores < 0.5))
        print('accuracy: {}'.format(accuracy / num_examples))
        classifier_list.append(w)
    print('eta is ', eta, 'and lambda is ', lamb)
    print('\n')

    classifiers_with_metrics = []
    for w in classifier_list:
        user_feat = val_data.drop(['user', 'label'], axis=1).values
        y_scores = user_feat.dot(w)
        data_true = deepcopy(val_data)
        data_true['scores'] = y_scores
        data_true = data_true.sort_values(by='scores', ascending=False)
        data_true = data_true.reset_index(drop=True)
        metric = compute_micro(data_true, user_list_val_filtered,
                               user_beta_train, w, k)
        classifiers_with_metrics.append((metric, w))
    classifiers_with_metrics.sort(reverse=True, key=lambda x: x[0])
    combined_w = classifiers_with_metrics[0][1]
    for _, w in classifiers_with_metrics[1:]:
        combined_w = merge_micro(val_data, combined_w, w,
                                 user_list_val_filtered, user_beta_train, k)

    # create dummy metrics
    # need weights and one validation loss for the "best iter" logic
    metrics = Metrics()
    metrics.w_list.append(combined_w)
    metrics.micro_auc_rel_k_list_val.append(0)
    metrics.micro_auc_rel_k_list_train.append(0)
    metrics.loss_opt_list_train.append(0)
    return metrics, None