projectxddi's picture
AI server: backend, start-up, status and admin pages
093748c verified
Raw History Blame Contribute Delete
5.24 kB
from data_preparation import ProteinInformation
from ml_trainer import MLTrainer
from ml_predictor import MLPredictor
from config import FileSetter, FileManager
from architectures import CNN2Layers
import numpy as np
from sklearn.model_selection import PredefinedSplit
class BindEmbed21DL(object):
@staticmethod
def cross_train_pipeline(params, model_output, predictions_output, ri):
"""
Run cross-training pipeline for a specific set of parameters
:param params:
:param model_output: If None, trained model is not written
:param predictions_output: If None, predictions are not written
:param ri: Should RI or raw probabilities be written?
:return:
"""
print("Prepare data")
ids = []
fold_array = []
for s in range(1, 6):
ids_in = '{}{}.txt'.format(FileSetter.split_ids_in(), s)
split_ids = FileManager.read_ids(ids_in)
ids += split_ids
fold_array += [s] * len(split_ids)
ps = PredefinedSplit(fold_array)
# get sequences + maximum length + labels
sequences, max_length, labels = ProteinInformation.get_data(ids)
embeddings = FileManager.read_embeddings(FileSetter.embeddings_input())
proteins = dict()
trainer = MLTrainer(pos_weights=params['weights'])
for train_index, test_index in ps.split():
split_counter = fold_array[test_index[0]]
train_ids = [ids[train_idx] for train_idx in train_index]
validation_ids = [ids[test_idx] for test_idx in test_index]
print("Train model")
model_split = trainer.train_validate(params, train_ids, validation_ids, sequences, embeddings, labels,
max_length, verbose=False)
if model_output is not None:
model_path = '{}{}.pt'.format(model_output, split_counter)
FileManager.save_classifier_torch(model_split, model_path)
print("Calculate predictions per protein")
ml_predictor = MLPredictor(model_split)
curr_proteins = ml_predictor.predict_per_protein(validation_ids, sequences, embeddings, labels, max_length)
proteins = {**proteins, **curr_proteins}
if predictions_output is not None:
FileManager.write_predictions(proteins, predictions_output, 0.5, ri)
return proteins
@staticmethod
def hyperparameter_optimization_pipeline(params, num_splits, result_file):
"""
Development pipeline used to optimize hyperparameters
:param params:
:param num_splits:
:param result_file:
:return:
"""
print("Prepare data")
ids = []
fold_array = []
for s in range(1, num_splits + 1):
ids_in = '{}{}.txt'.format(FileSetter.split_ids_in(), s)
split_ids = FileManager.read_ids(ids_in)
ids += split_ids
fold_array += [s] * len(split_ids)
ids = np.array(ids)
# get sequences + maximum length + labels
sequences, max_length, labels = ProteinInformation.get_data(ids)
embeddings = FileManager.read_embeddings(FileSetter.embeddings_input())
print("Perform hyperparameter optimization")
trainer = MLTrainer(pos_weights=params['weights'])
del params['weights'] # remove weights to not consider as parameter for optimization
model = trainer.cross_validate(params, ids, fold_array, sequences, embeddings, labels, max_length, result_file)
return model
@staticmethod
def prediction_pipeline(model_prefix, cutoff, result_folder, ids, fasta_file, ri):
"""
Run predictions with bindEmbed21DL for a given list of proteins
:param model_prefix:
:param cutoff: Cutoff to use to define prediction as binding (default: 0.5)
:param result_folder:
:param ids:
:param fasta_file:
:param ri: Should RI or raw probabilities be written?
:return:
"""
print("Prepare data")
sequences, max_length, labels = ProteinInformation.get_data_predictions(ids, fasta_file)
embeddings = FileManager.read_embeddings(FileSetter.embeddings_input())
proteins = dict()
for i in range(0, 5):
print("Load model")
model_path = '{}{}.pt'.format(model_prefix, i + 1)
model = FileManager.load_classifier_torch(model_path)
print("Calculate predictions")
ml_predictor = MLPredictor(model)
curr_proteins = ml_predictor.predict_per_protein(ids, sequences, embeddings, labels, max_length)
for k in curr_proteins.keys():
if k in proteins.keys():
prot = proteins[k]
prot.add_predictions(curr_proteins[k].predictions)
else:
proteins[k] = curr_proteins[k]
for k in proteins.keys():
proteins[k].normalize_predictions(5)
if result_folder is not None:
FileManager.write_predictions(proteins, result_folder, cutoff, ri)
return proteins