Spaces:
Runtime error
Runtime error
import lightgbm as lgb | |
import numpy as np | |
import json | |
import argparse | |
from run_lgb_cv_bayesopt import read_labels | |
def main(): | |
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) | |
# Path options. | |
parser.add_argument("--train_path", type=str, required=True, | |
help="Path of the trainset.") | |
parser.add_argument("--test_path", type=str, required=True, | |
help="Path of the testset.") | |
parser.add_argument("--train_features_path", type=str, required=True, | |
help="Path of the train features for stacking.") | |
parser.add_argument("--test_features_path", type=str, required=True, | |
help="Path of the test features for stacking.") | |
# Model options. | |
parser.add_argument("--models_num", type=int, default=64, | |
help="Number of models for ensemble.") | |
parser.add_argument("--labels_num", type=int, default=6, | |
help="Number of label.") | |
args = parser.parse_args() | |
train_features = [] | |
for i in range(args.models_num): | |
train_features.append(np.load(args.train_features_path + "train_features_" + str(i) + ".npy")) | |
train_features = np.concatenate(train_features, axis=-1) | |
train_labels = read_labels(args.train_path) | |
test_features = [] | |
for i in range(args.models_num): | |
test_features.append(np.load(args.test_features_path + "test_features_" + str(i) + ".npy")) | |
test_features = np.concatenate(test_features, axis=-1) | |
test_labels = read_labels(args.test_path) | |
params = { | |
"task": "train", | |
"objective": "multiclass", | |
"num_class": args.labels_num, | |
"metric": "multi_error", | |
"feature_fraction": 0.25, | |
"lambda_l1": 5.0, | |
"lambda_l2": 5.0, | |
"learning_rate": 0.02, | |
"max_depth": 100, | |
"min_data_in_leaf": 50, | |
"num_leaves": 10 | |
} | |
lgb_train = lgb.Dataset(train_features, train_labels) | |
lgb_eval = lgb.Dataset(test_features, test_labels, reference=lgb_train) | |
model = lgb.train(params, lgb_train, valid_sets=lgb_eval, verbose_eval=50) | |
test_pred = model.predict(test_features) | |
test_pred = np.argmax(test_pred, axis=1) | |
confusion = np.zeros((args.labels_num, args.labels_num)) | |
for i in range(len(test_pred)): | |
confusion[test_pred[i], test_labels[i]] += 1 | |
correct = np.sum(test_pred == test_labels) | |
macro_f1 = [] | |
print("Confusion matrix:") | |
print(confusion) | |
print("Report precision, recall, and f1:") | |
eps = 1e-9 | |
for i in range(args.labels_num): | |
p = confusion[i, i].item() / (confusion[i, :].sum().item() + eps) | |
r = confusion[i, i].item() / (confusion[:, i].sum().item() + eps) | |
f1 = 2 * p * r / (p + r + eps) | |
print("Label {}: {:.3f}, {:.3f}, {:.3f}".format(i, p, r, f1)) | |
macro_f1.append(f1) | |
print("Macro F1: {:.4f}".format(np.mean(macro_f1))) | |
print("Acc. (Correct/Total): {:.4f} ({}/{})".format(correct/len(test_pred), correct, len(test_pred))) | |
if __name__ == "__main__": | |
main() | |