diff --git "a/code_files/7-Ensemble Learning Project \342\200\223 Comparing Models on a Real Dataset/day7_ex.py" "b/code_files/7-Ensemble Learning Project \342\200\223 Comparing Models on a Real Dataset/day7_ex.py" new file mode 100644 index 0000000..bdcadcb --- /dev/null +++ "b/code_files/7-Ensemble Learning Project \342\200\223 Comparing Models on a Real Dataset/day7_ex.py" @@ -0,0 +1,81 @@ +import pandas as pd +from sklearn.preprocessing import LabelEncoder, StandardScaler +from imblearn.over_sampling import SMOTE +from sklearn.model_selection import train_test_split +from sklearn.ensemble import RandomForestClassifier +from xgboost import XGBClassifier +from lightgbm import LGBMClassifier +from sklearn.metrics import classification_report, roc_auc_score + +# Load Dataset +df = pd.read_csv("Telco-Customer-Churn.csv") + +# Display dataset info and preview +print("Dataset Info: \n") +print(df.info()) +print("\n Class Distribution: \n") +print(df['Churn'].value_counts()) +print("\n Sample Data:\n", df.head()) + +# Handle missing values +df['TotalCharges'] = pd.to_numeric(df['TotalCharges'], errors='coerce') +df.fillna({'TotalCharges': df['TotalCharges'].median()}, inplace=True) + +# Encode categorical variables +label_encoder = LabelEncoder() +for column in df.select_dtypes(include=['object']).columns: + if column != 'Churn': + df[column] = label_encoder.fit_transform(df[column]) + +# Encode target variable +df['Churn'] = label_encoder.fit_transform(df['Churn']) + +# Scale numerical features +scaler = StandardScaler() +numerical_features = ['tenure', 'MonthlyCharges', 'TotalCharges'] +df[numerical_features] = scaler.fit_transform(df[numerical_features]) + +# Features and Target +X = df.drop(columns=['Churn']) +y = df['Churn'] + +# Split dataset +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) + +# Apply SMOTE +smote = SMOTE(random_state=42) +X_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train) + +# Display class distribution after SMOTE +print("\n Class Distribution after SMOTE: \n") +print(pd.Series(y_train_resampled).value_counts()) + +# Train Random Forest +rf_model = RandomForestClassifier(random_state=42) +rf_model.fit(X_train_resampled, y_train_resampled) +y_pred_rf = rf_model.predict(X_test) +roc_auc_rf = roc_auc_score(y_test, rf_model.predict_proba(X_test)[:, 1]) + +# Train XGBoost +xgb_model = XGBClassifier(eval_metric='logloss',random_state=42) +xgb_model.fit(X_train_resampled, y_train_resampled) +y_pred_xgb = xgb_model.predict(X_test) +roc_auc_xgb = roc_auc_score(y_test, xgb_model.predict_proba(X_test)[:, 1]) + +# Train LightGBM +lgb_model = LGBMClassifier(random_state=42) +lgb_model.fit(X_train_resampled, y_train_resampled) +y_pred_lgb = lgb_model.predict(X_test) +roc_auc_lgb = roc_auc_score(y_test, lgb_model.predict_proba(X_test)[:, 1]) + +# Classification reports +print("Random Forest Report:\n", classification_report(y_test, y_pred_rf)) +print("XGBoost Report: \n", classification_report(y_test, y_pred_xgb)) +print("LightGBM Report: \n", classification_report(y_test, y_pred_lgb)) + +# ROC_AUC comparison +print("ROC-AUC Scores: \n") +print(f"Random Forest: {roc_auc_rf:.2f}") +print(f"XGBoost: {roc_auc_xgb:.2f}") +print(f"LightGBM: {roc_auc_lgb:.2f}") +