Tao-Lab-Breast-Cancer / code / Exhaustive_top7.py
Exhaustive_top7.py
Raw
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from itertools import combinations
from sklearn.model_selection import StratifiedKFold, cross_val_predict
from sklearn.metrics import roc_auc_score, roc_curve, accuracy_score
import matplotlib.pyplot as plt
import numpy as np

# Load the dataset LAB
file_path = '../datasets/LAB_30.xlsx'

# Load the dataset TN 
file_path = '../datasets/TN_30.xlsx'


data = pd.read_excel(file_path)

def exhaustive_feature_selection(data, comparison_groups, target_group, n_features_to_select):
    # Adjust binary labeling: '1' for target group, '0' for comparison groups
    data['Binary_Label'] = data['Type'].apply(lambda x: 1 if x == target_group else 0 if x in comparison_groups else None)
    
    # Filter data to include only the relevant groups
    data_filtered = data[data['Type'].isin(comparison_groups + [target_group])].copy()
    
    # Prepare the data
    X = data_filtered.drop(['Type', 'Binary_Label'], axis=1)
    y = data_filtered['Binary_Label']
    
    # Initialize RandomForest classifier with class_weight='balanced'
    rf_clf = RandomForestClassifier(n_estimators=100, random_state=42, class_weight='balanced')
    
    # Initialize variables to store the best combination and its AUC score
    best_auc_score = 0
    best_accuracy = 0
    best_features = None
    best_fpr, best_tpr = None, None
    idx = 0

    # Loop over all combinations of features
    for feature_combo in combinations(X.columns, n_features_to_select):
        idx+=1

        if (idx % 100 == 0):
            print(idx)

        # Select the current combination of features
        X_selected = X[list(feature_combo)]
        
        # Setup stratified cross-validation
        cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
        
        # Perform cross-validated predictions
        y_prob = cross_val_predict(rf_clf, X_selected, y, cv=cv, method='predict_proba')
        y_pred = cross_val_predict(rf_clf, X_selected, y, cv=cv)
        
        # Calculate AUC and accuracy
        auc_score = roc_auc_score(y, y_prob[:, 1])
        accuracy = accuracy_score(y, y_pred)

        # If the current combination has the best AUC, save it
        if auc_score > best_auc_score:
            best_auc_score = auc_score
            best_accuracy = accuracy
            best_features = feature_combo
            best_fpr, best_tpr, _ = roc_curve(y, y_prob[:, 1])
    
    # Plot the ROC curve for the best feature combination
    plt.figure()
    plt.plot(best_fpr, best_tpr, color='blue', lw=2, label=f'ROC curve (AUC = {best_auc_score:.2f})')
    plt.plot([0, 1], [0, 1], color='gray', lw=2, linestyle='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.0])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('ROC Curve')
    plt.legend(loc='lower right')
    plt.show()
    
    print("Selected features:")
    for feature in best_features:
        print(f"{feature}")
    
    return best_auc_score, best_accuracy, best_features

# Perform the exhaustive feature selection analysis
auc_score, accuracy, selected_features = exhaustive_feature_selection(data, ['TN', 'Control'], 'LAB', 7)
print(f"AUC score: {auc_score:.2f}")
print(f"Accuracy: {accuracy:.2f}")