173 lines
No EOL
5.2 KiB
Python
173 lines
No EOL
5.2 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Created on Fri Mar 4 14:54:30 2022
|
|
|
|
@author: tanu
|
|
"""
|
|
import os, sys
|
|
import pandas as pd
|
|
import numpy as np
|
|
from sklearn.linear_model import LogisticRegression
|
|
from sklearn.naive_bayes import BernoulliNB
|
|
from sklearn.neighbors import KNeighborsClassifier
|
|
from sklearn.svm import SVC
|
|
from sklearn.tree import DecisionTreeClassifier
|
|
from sklearn.ensemble import RandomForestClassifier, ExtraTreesClassifier
|
|
from sklearn.neural_network import MLPClassifier
|
|
from sklearn.pipeline import Pipeline
|
|
from xgboost import XGBClassifier
|
|
from sklearn.preprocessing import StandardScaler
|
|
from sklearn.preprocessing import MinMaxScaler
|
|
from sklearn.model_selection import train_test_split
|
|
from sklearn.metrics import accuracy_score, confusion_matrix, precision_score, recall_score, roc_auc_score, roc_curve, f1_score
|
|
#%%
|
|
homedir = os.path.expanduser("~")
|
|
os.chdir(homedir + "/git/ML_AI_training/")
|
|
|
|
# my function
|
|
from MultClassPipe import MultClassPipeline
|
|
|
|
#gene = 'pncA'
|
|
#drug = 'pyrazinamide'
|
|
|
|
#==============
|
|
# directories
|
|
#==============
|
|
datadir = homedir + '/git/Data/'
|
|
indir = datadir + drug + '/input/'
|
|
outdir = datadir + drug + '/output/'
|
|
|
|
#=======
|
|
# input
|
|
#=======
|
|
infile_ml1 = outdir + gene.lower() + '_merged_df3.csv'
|
|
#infile_ml2 = outdir + gene.lower() + '_merged_df2.csv'
|
|
|
|
my_df = pd.read_csv(infile_ml1)
|
|
my_df.dtypes
|
|
my_df_cols = my_df.columns
|
|
|
|
geneL_basic = ['pnca']
|
|
geneL_na = ['gid']
|
|
geneL_na_ppi2 = ['rpob']
|
|
geneL_ppi2 = ['alr', 'embb', 'katg']
|
|
#%% get cols
|
|
mycols = my_df.columns
|
|
|
|
#%%============================================================================
|
|
# GET Y
|
|
|
|
# Target1: mutation_info_labels
|
|
dm_om_map = {'DM': 1, 'OM': 0}
|
|
target1 = my_df['mutation_info_labels'].map(dm_om_map)
|
|
|
|
# Target2: drug
|
|
drug_labels = drug + '_labels'
|
|
drug_labels
|
|
my_df[drug_labels] = my_df[drug].map({1: 'resistant', 0: 'sensitive'})
|
|
my_df[drug_labels].value_counts()
|
|
my_df[drug_labels] = my_df[drug_labels].fillna('unknown')
|
|
my_df[drug_labels].value_counts()
|
|
target2 = my_df[drug_labels]
|
|
|
|
# Target3: drtype
|
|
drtype_labels = 'drtype_labels'
|
|
my_df[drtype_labels] = my_df['drtype'].map({'Sensitive' : 0
|
|
, 'Other' : 0
|
|
, 'Pre-MDR' : 1
|
|
, 'MDR' : 1
|
|
, 'Pre-XDR' : 1
|
|
, 'XDR' : 1})
|
|
# target3 = my_df['drtype']
|
|
target3 = my_df[drtype_labels]
|
|
|
|
# sanity checks
|
|
target1.value_counts()
|
|
my_df['mutation_info_labels'].value_counts()
|
|
|
|
target2.value_counts()
|
|
my_df[drug_labels].value_counts()
|
|
|
|
target3.value_counts()
|
|
my_df['drtype'].value_counts()
|
|
|
|
#%%
|
|
# GET X
|
|
common_cols_stabilty = ['ligand_distance'
|
|
, 'ligand_affinity_change'
|
|
, 'duet_stability_change'
|
|
, 'ddg_foldx'
|
|
, 'deepddg'
|
|
, 'ddg_dynamut2']
|
|
|
|
# Build stability columns ~ gene
|
|
if gene.lower() in geneL_basic:
|
|
x_stability_cols = common_cols_stabilty
|
|
|
|
if gene.lower() in geneL_ppi2:
|
|
x_stability_cols = common_cols_stabilty + ['mcsm_ppi2_affinity'
|
|
, 'interface_dist']
|
|
if gene.lower() in geneL_na:
|
|
x_stability_cols = common_cols_stabilty + ['mcsm_na_affinity']
|
|
|
|
if gene.lower() in geneL_na_ppi2:
|
|
x_stability_cols = common_cols_stabilty + ['mcsm_na_affinity'] + ['mcsm_ppi2_affinity', 'interface_dist']
|
|
#D1148 get rid of
|
|
na_index = my_df['mutationinformation'].index[my_df['mcsm_na_affinity'].apply(np.isnan)]
|
|
my_df = my_df.drop(index=na_index)
|
|
|
|
X_strF = ['asa'
|
|
, 'rsa'
|
|
, 'kd_values'
|
|
, 'rd_values']
|
|
|
|
X_evolF = ['consurf_score'
|
|
, 'snap2_score'
|
|
, 'snap2_accuracy_pc']
|
|
|
|
# TODO: ADD ED values
|
|
# Problematic due to NA
|
|
# X_genomicF = ['af'
|
|
# , 'or_mychisq'
|
|
# , 'or_logistic'
|
|
# , 'or_fisher'
|
|
# , 'pval_fisher']
|
|
|
|
#%% try combinations
|
|
X_vars1 = my_df[x_stability_cols]
|
|
X_vars2 = my_df[X_strF]
|
|
X_vars3 = my_df[X_evolF]
|
|
#X_vars4 = my_df[X_genomicF]
|
|
#X_vars4 = X_vars4.fillna('unknown') # need one hot encoder!
|
|
|
|
X_vars5 = my_df[x_stability_cols + X_strF]
|
|
X_vars6 = my_df[x_stability_cols + X_evolF]
|
|
#X_vars7 = my_df[x_stability_cols + X_genomicF]
|
|
X_vars8 = my_df[X_strF + X_evolF]
|
|
#X_vars9 = my_df[X_strF + X_genomicF]
|
|
#X_vars10 = my_df[X_evolF + X_genomicF]
|
|
X_vars11 = my_df[x_stability_cols + X_strF + X_evolF ]
|
|
#X_vars12 = my_df[x_stability_cols + X_strF + X_evolF + X_genomicF]
|
|
|
|
#%%
|
|
X_vars1.shape[1]
|
|
X_vars5.shape[1]
|
|
# TODO: stratified cross validate
|
|
# Train-test Split
|
|
|
|
# TARGET1
|
|
X_train, X_test, y_train, y_test = train_test_split(X_vars1,
|
|
target1,
|
|
test_size = 0.33,
|
|
random_state = 42)
|
|
t1_res = MultClassPipeline(X_train, X_test, y_train, y_test)
|
|
t1_res
|
|
# TARGET3
|
|
X_train3, X_test3, y_train3, y_test3 = train_test_split(X_vars5,
|
|
target3,
|
|
test_size = 0.33,
|
|
random_state = 42)
|
|
t3_res = MultClassPipeline(X_train3, X_test3, y_train3, y_test3)
|
|
t3_res
|
|
#%% |