Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Validation] Classe Validation qui retourne la decision de l’arbre de decision empirique de l’hopital Foche #52

Open
sirineBS opened this issue Jan 9, 2019 · 3 comments
Assignees

Comments

@sirineBS
Copy link

sirineBS commented Jan 9, 2019

No description provided.

@martindaniel4
Copy link
Contributor

@Karinehoo voir le script que Tiphaine avait développé:

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 20 15:34:14 2018

@author: 212561583
"""
import pandas as pd
import numpy as np

#------------------------------------------------------------------------------
def decisionLoop(test0,test1,test2):
    if test0:
        if test1:
            return test2
        else:
            return False
    else:
        return test2
  
def test_0(ligne_glob): #Le patient était sous ECMO?
    return ligne_glob.ECMO_during_surgery.values[0]

def test_1(ligne_bloc, pam_inf = 55, pam_sup = 65, threshold_percentage = 90): 
    #ECMO weaning test 
    pam = (ligne_bloc > pam_inf) & (ligne_bloc < pam_sup)
    try:
        test1_pam = pam.value_counts(normalize=True)[True]*100 > threshold_percentage
    except:
        test1_pam = False
    test1_adrenaline = True # a remplir avec le vrai test: peu de noradrenaline et pas d'adrenaline
    test1_pap = ligne_bloc.iloc[0] > ligne_bloc.iloc[15] #diminution des PAP, critère à affiner
    return test1_pam & test1_adrenaline & test1_pap

def test_2(ligne_bloc): 
    # iNO weaning test 
    test2_pao2Fio2 = True # a remplir avec le vrai test: augmentation de ce rapport
    test2_pap = ligne_bloc.iloc[15] > ligne_bloc.iloc[30] #diminution des PAP, critère à affiner
    return test2_pao2Fio2 & test2_pap

def display_performance(results):
    compare_egal = results[:,1] == results[:,2]
    unique, counts = np.unique(compare_egal, return_counts=True)
    compare_fauxPos = results[:,1] > results[:,2]
    unique_fauxPos, counts_fauxPos = np.unique(compare_fauxPos, return_counts=True)
    compare_fauxNeg = results[:,1] < results[:,2]
    unique_fauxNeg, counts_fauxNeg = np.unique(compare_fauxNeg, return_counts=True)
    print "Pourcentage de concordance: ", float(counts[list(unique).index(True)])/len(results)*100
    print "Pourcentage de faux positifs: ", float(counts_fauxPos[list(unique_fauxPos).index(True)])/len(results)*100
    print "Pourcentage de faux négatifs: ", float(counts_fauxNeg[list(unique_fauxNeg).index(True)])/len(results)*100

def apply_decisionTree(available_pat,df_glob,df):
    results = np.zeros([len(available_pat),3])
    ind = 0
    for pat in available_pat:
        ligne_glob = df_glob[df_glob.numero == float(pat)]
        ligne_bloc = df[str(pat)]
        
        test0 = test_0(ligne_glob)
        test1 = test_1(ligne_bloc)
        test2 = test_2(ligne_bloc)
        results[ind,0] = pat
        results[ind,1] = int(decisionLoop(test0,test1,test2))
        results[ind,2] = ligne_glob[' immediate_extubation'].values[0]
        ind += 1
    return results
#------------------------------------------------------------------------------
fileName_glob = r'base LgTx IA 24oct2018.csv'
df_glob = pd.read_csv(fileName_glob,sep=";")
extub_pat = list(df_glob[df_glob[' immediate_extubation'] == 1].numero.astype('str'))

typeData = 'PASm' #'PAPmoy' #
fileName = r'\%s.csv'%typeData

df = pd.read_csv(fileName)
df = df.drop(df.columns[0],axis=1)
df = df.replace(0,np.nan,regex=True)
emptyCol = df.count() < len(df)*0.5
df = df.drop(df.columns[emptyCol],axis=1)
#------------------------------------------------------------------------------
# Décision de l'arbre sur un exemple de patient donné
"""results = apply_decisionTree(['186.0'],df_glob,df)            

print "Decision finale arbre: ", results[0,1]
print "Decision finale réelle: ", results[0,2]"""
#------------------------------------------------------------------------------
# Application de l'arbre simulé à toute la base
available_pat = list(df.columns)

results = apply_decisionTree(available_pat,df_glob,df)
display_performance(results)

@Karinehoo
Copy link
Contributor

Pour refaire l'arbre de décison empirique j'ai besoin notamment de savoir si il y a eu une ECMO durant l'opération et les variables qui le décrivent sont des variables "STATIC_CATEGORIES/patient_intraoperative" donc non prises en compte dans la class Dataset que l'on utilise pour la modélisation.

@martindaniel4 :

  • Comme on veut faire une class Validation pour comparer nos futurs predictions avec la décision issue de l'arbre empirique de l'hopital, je me suis basée sur notre class Dataset pour qu'on ait les mêmes informations en amont, mais est ce le bon raisonnement ou alors je peux me servir de toutes les autres variables ?

  • J'ai du passer à côté de l'info quand vous avez parlé d'enlever les variables "patients_intraoperative" et "patient_postoperative" du dataset : je comprends pour le "patient_postoperative" --> ne pas prendre en compte du futur dans nos predictions, mais je comprends un peu moins pour le "patients_intraoperative" à moins que chaque élément puisse étre retrouvé via les variables dynamiques ?

Désolée si c'est de la répétition et merci !

@martindaniel4
Copy link
Contributor

Hey @Karinehoo, top que tu avances là dessus.

Si tu veux récupérer l'intégralité du CSV, tu peux aussi utiliser les variables définies dans le fichier config.py et que tu peux importer via :

from transplant.config import *
df_static = pd.read_csv(PATH_STATIC_CLEAN)

Pour ce qui concerne les variables intra opératoire, on peut tout à fait les ajouter, mais elles sont redondantes avec les données dynamiques et on voulait séparer les données statiques avant l'opération, des données dynamiques pendant opération (cf papier des chercheurs de l'hôpital de Berlin)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants