python / index.py
SubashUbahs's picture
Upload 5 files
450b204 verified
Raw History Blame Contribute Delete
6.08 kB
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import recall_score,accuracy_score,roc_auc_score,average_precision_score,roc_curve,auc
from sklearn.feature_selection import RFECV
import seaborn as sns
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
from sklearn.model_selection import cross_val_score,train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.impute import KNNImputer
import joblib
df=pd.read_excel('appendicitis.xlsx')
columns=['AppendixDiameter','ReboundTenderness','CoughingPain','FreeFluids','MigratoryPain','BodyTemp','KetonesInUrine','Nausea',
'WBCCount','NeutrophilPerc','CRPEntry','Peritonitis','DiagnosisByCriteria']
df=df[columns]
usg_col =['AppendixDiameter','FreeFluids']
df[usg_col]=df[usg_col].fillna(0)
mapping ={
'+++' : 3,
'++': 2,
'+': 1,
'no':0,
'yes':1,
'local':1,
'generalised':2,
'normal':0,
'noAppendicitis':0,
'appendicitis':1
}
for col in df.columns:
df[col]=df[col].replace(mapping)
x = df.iloc[:, 0:-1]
y = df.iloc[:, -1]
x_tempi, x_testi, y_temp, y_testi = train_test_split(x,y,test_size=0.2,random_state=17)
x_traini,x_vali,y_traini,y_vali = train_test_split(x_tempi,y_temp,test_size=0.25,random_state=17)
imputer_train = KNNImputer(n_neighbors=5)
imputer_val = KNNImputer(n_neighbors=5)
imputer_test = KNNImputer(n_neighbors=5)
imputer_temp=KNNImputer(n_neighbors=5)
x_temp=pd.DataFrame(imputer_temp.fit_transform(x_tempi),columns=x_tempi.columns,index=x_tempi.index)
x_train = pd.DataFrame(imputer_train.fit_transform(x_traini), columns=x_traini.columns, index=x_traini.index)
x_val = pd.DataFrame(imputer_val.fit_transform(x_vali), columns=x_vali.columns, index=x_vali.index)
x_test = pd.DataFrame(imputer_test.fit_transform(x_testi), columns=x_testi.columns, index=x_testi.index)
y_train=y_traini.squeeze()
y_val=y_vali.squeeze()
y_test=y_testi.squeeze()
y_temp=y_temp.squeeze()
columns_round = [ 'MigratoryPain','ReboundTenderness','CoughingPain','Peritonitis','KetonesInUrine','Nausea']
for col in columns_round:
if col in x_temp.columns:
x_temp[col]=x_temp[col].round().astype(int)
if col in x_train.columns:
x_train[col] = x_train[col].round().astype(int)
if col in x_val.columns:
x_val[col] = x_val[col].round().astype(int)
if col in x_test.columns:
x_test[col] = x_test[col].round().astype(int)
rf_model=RandomForestClassifier(
n_estimators=700,
min_samples_split=12,
min_samples_leaf=1,
max_depth=35,
random_state=17
)
scores = cross_val_score(rf_model, x_train, y_train, cv=10, scoring='accuracy', n_jobs=2)
print("Mean cross_val accuracy Score:", scores.mean())
print("Standard Deviation of cross_val accuracy Scores:", scores.std())
rf_model.fit(x_train,y_train)
joblib.dump(rf_model, 'rf_model.pkl')
# y_pred_prob=rf_model.predict_proba(x_val)[:,1]
# fpr, tpr, thresholds = roc_curve(y_val, y_pred_prob)
# youden_index = tpr - fpr
# optimal_idx = np.argmax(youden_index)
# optimal_threshold = thresholds[optimal_idx]
# distances = np.sqrt((1 - tpr)**2 + fpr**2)
# optimal_idx = np.argmin(distances)
# optimal_threshold = thresholds[optimal_idx]
# print(f"Optimal Threshold: {optimal_threshold}")
threshold=0.7032966204148201
y_pred_prob=rf_model.predict_proba(x_val)[:,1]
y_thres=(y_pred_prob >= threshold).astype(int)
auc_score = roc_auc_score(y_val, y_pred_prob)
print("Val AUC:", auc_score)
val_conf_matrix = confusion_matrix(y_val, y_thres)
TNv, FPv, FNv, TPv = val_conf_matrix.ravel()
val_sensitivity = TPv / (TPv + FNv)
val_specificity = TNv / (TNv + FPv)
val_ppv = TPv/(TPv+FPv)
val_npv = TNv/(TNv+FNv)
print(f"Sensitivity: {val_sensitivity:.3f} ({val_sensitivity * 100:.2f}%)")
print(f"Specificity: {val_specificity:.3f} ({val_specificity * 100:.2f}%)")
print (f"Positive predictive value : {val_ppv:.3f}({val_ppv*100:.2f}%)")
print (f"Negative predictive value : {val_npv:.3f}({val_npv*100:.2f}%)")
print("Val Confusion Matrix:\n", val_conf_matrix)
val_acu=accuracy_score(y_val,y_thres)
print("Val accuracy score:",val_acu)
y_test_prob=rf_model.predict_proba(x_test)[:,1]
y_thres_test=(y_test_prob >= threshold).astype(int)
auc_score = roc_auc_score(y_test, y_test_prob)
print("Test AUC:", auc_score)
test_conf_matrix = confusion_matrix(y_test, y_thres_test)
print("Test Confusion Matrix:\n", test_conf_matrix)
TNt, FPt, FNt, TPt = test_conf_matrix.ravel()
test_sensitivity = TPt / (TPt + FNt)
test_specificity = TNt / (TNt + FPt)
test_ppv = TPt/(TPt+FPt)
test_npv = TNt/(TNt+FNt)
print(f"Sensitivity: {test_sensitivity:.3f} ({test_sensitivity * 100:.2f}%)")
print(f"Specificity: {test_specificity:.3f} ({test_specificity * 100:.2f}%)")
print (f"Positive predictive value : {test_ppv:.3f}({test_ppv*100:.2f}%)")
print (f"Negative predictive value : {test_npv:.3f}({test_npv*100:.2f}%)")
test_acu=accuracy_score(y_test,y_thres_test)
print("Test Accuracy score:",test_acu)
rf_model.fit(x_temp,y_temp)
y_test1_prob=rf_model.predict_proba(x_test)[:,1]
y_thres1_test=(y_test1_prob >= threshold).astype(int)
auc_score1 = roc_auc_score(y_test, y_test1_prob)
print("Test AUC:", auc_score1)
test1_conf_matrix = confusion_matrix(y_test, y_thres1_test)
print("Test Confusion Matrix:\n", test1_conf_matrix)
TNt1, FPt1, FNt1, TPt1 = test1_conf_matrix.ravel()
test_sensitivity1 = TPt1 / (TPt1 + FNt1)
test_specificity1 = TNt1 / (TNt1 + FPt1)
test_ppv1 = TPt1/(TPt1+FPt1)
test_npv1 = TNt1/(TNt1+FNt1)
print(f"Sensitivity: {test_sensitivity1:.3f} ({test_sensitivity1 * 100:.2f}%)")
print(f"Specificity: {test_specificity1:.3f} ({test_specificity1 * 100:.2f}%)")
print (f"Positive predictive value : {test_ppv1:.3f}({test_ppv1*100:.2f}%)")
print (f"Negative predictive value : {test_npv1:.3f}({test_npv1*100:.2f}%)")
test1_acu=accuracy_score(y_test,y_thres1_test)
print("Test Accuracy score:",test1_acu)