reader = Reader(line_format='item user rating',
                sep=',',
                rating_scale=(1, 5),
                skip_lines=1)

data_train = Dataset.load_from_file(file_path, reader=reader)

# %% Best Hyper-parameters Training - NMF
alg_NMF = NMF()

alg_NMF.biased = False
alg_NMF.n_epochs = 50
alg_NMF.n_factors = 35
alg_NMF.reg_pu = 0.1
alg_NMF.reg_qi = 0.1
alg_NMF.verbose = True

start = time.time()

alg_NMF.fit(data_train.build_full_trainset())

end = time.time()
print("***********************************************")
print("Exe time:")
print(end - start)

# %% Best Hyper-parameters Training - SVD
alg_SVD = SVD()

alg_SVD.biased = True
alg_SVD.n_epochs = 50
file.close()

# *****************************************************************************
# %% Best Hyper-parameters Training:
# Training over whole training dataset, using best hyper-parameters
alg = NMF()

alg.biased = Train_CV.best_params['rmse']['biased']
alg.n_epochs = Train_CV.best_params['rmse']['n_epochs']
alg.n_factors = Train_CV.best_params['rmse']['n_factors']
alg.reg_pu = Train_CV.best_params['rmse']['reg_pu']
alg.reg_qi = Train_CV.best_params['rmse']['reg_qi']
alg.reg_bu = Train_CV.best_params['rmse']['reg_bu']
alg.reg_bi = Train_CV.best_params['rmse']['reg_bi']
alg.verbose = True
alg.random_state = 0

alg.fit(data_train.build_full_trainset())

# *****************************************************************************
# %% Loading Test Data
file_path = "Data/sample_submission.csv"
data_test = utils.load_data_desired(file_path)

# *****************************************************************************
# %% Predicting test data labels
Predict_Test = []

for line in data_test:
    Predict_Test.append(alg.predict(str(line[1]), str(line[0])).est)