import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler data = pd.read_excel( r"C:\Users\lloyd\PycharmProjects\pythonProject\Telco_Customer_Churn.xlsx" ) # get rid of unused columns data.drop(columns=['CustomerID', 'Count', 'Country', 'State', 'City', 'Zip Code', 'Lat Long', 'Latitude', 'Longitude'], inplace=True) # change to be numerical value data['Total Charges'] = pd.to_numeric(data['Total Charges'], errors='coerce') # drop the rows with missing values data.dropna(inplace=True) # encode categorical columns categorical_columns = ['Gender', 'Senior Citizen', 'Partner', 'Dependents', 'Phone Service', 'Multiple Lines', 'Internet Service', 'Online Security', 'Online Backup', 'Device Protection', 'Tech Support', 'Streaming TV', 'Streaming Movies', 'Contract', 'Paperless Billing', 'Payment Method', 'Churn Reason'] data = pd.get_dummies(data, columns=categorical_columns, drop_first=True) # Make 'Churn Label' numeric data['Churn'] = data['Churn Label'].map({'Yes': 1, 'No': 0}) data.drop(columns=['Churn Label'], inplace=True) # separate features and target X = data.drop(columns=['Churn Score']) y = data['Churn Score'] # split the data into training and testing sets X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # scale numerical features scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) from sklearn.metrics import classification_report from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score def evaluate_model(y_true, y_pred, model, X_test): print(f"Accuracy: {accuracy_score(y_true, y_pred):.4f}") print(f"Precision (macro): {precision_score(y_true, y_pred, average='macro', zero_division=0.0):.4f}") print(f"Recall (macro): {recall_score(y_true, y_pred, average='macro'):.4f}") print(f"F1 Score (macro): {f1_score(y_true, y_pred, average='macro'):.4f}") # predicted probabilities for AUC if hasattr(model, "predict_proba"): y_prob = model.predict_proba(X_test) else: # for models that do not support predict_proba (like some versions of SVM) y_prob = model.decision_function(X_test) # for multiclass, handle AUC differently (ROC AUC requires predicted probabilities) try: print(f"AUC-ROC (macro): {roc_auc_score(y_true, y_prob, multi_class='ovr', average='macro'):.4f}") except ValueError: print("AUC-ROC: Cannot compute AUC for multiclass with this setup.") # initialize and train the Logistic Regression model lr_model = LogisticRegression() lr_model.fit(X_train_scaled, y_train) # predict and evaluate y_pred_lr = lr_model.predict(X_test_scaled) print("Logistic Regression Performance:") print(classification_report(y_test, y_pred_lr)) from sklearn.svm import SVC # initialize and train the SVM model svm_model = SVC(probability=True) svm_model.fit(X_train_scaled, y_train) # predict and evaluate y_pred_svm = svm_model.predict(X_test_scaled) print("Support Vector Machine Performance:") print(classification_report(y_test, y_pred_svm)) # split data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y) # initialize models lr_model = LogisticRegression() svm_model = SVC(probability=True) # train Logistic Regression lr_model.fit(X_train, y_train) y_pred_lr = lr_model.predict(X_test) # train SVM svm_model.fit(X_train, y_train) y_pred_svm = svm_model.predict(X_test) # check if the data is split correctly print(X_train.shape) print(y_train.shape) # evaluate models print("\nLogistic Regression - Performance Metrics:") evaluate_model(y_test, y_pred_lr, lr_model, X_test) print("\nSupport Vector Machine - Performance Metrics:") evaluate_model(y_test, y_pred_svm, svm_model, X_test) from sklearn.model_selection import GridSearchCV from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score # logistic Regression hyperparameters lr_param_grid = { 'C': [0.01, 0.1, 1, 10, 100], # Regularization strength 'solver': ['liblinear', 'saga'], # Optimization algorithm 'max_iter': [100, 200, 300] # Maximum number of iterations } # SVM hyperparameters svm_param_grid = { 'C': [0.01, 0.1, 1, 10, 100], # Regularization strength 'kernel': ['linear', 'rbf', 'poly'], # Kernel type 'gamma': ['scale', 'auto', 0.01, 0.1, 1], # Kernel coefficient 'degree': [3, 4, 5] # Degree of the polynomial kernel } # initialize models lr_model = LogisticRegression(max_iter=1000) svm_model = SVC(probability=True) # gridSearchCV for Logistic Regression lr_grid_search = GridSearchCV(estimator=lr_model, param_grid=lr_param_grid, cv=5, scoring='accuracy', n_jobs=-1) lr_grid_search.fit(X_train, y_train) print("Best Logistic Regression parameters:", lr_grid_search.best_params_) # gridSearchCV for SVM svm_grid_search = GridSearchCV(estimator=svm_model, param_grid=svm_param_grid, cv=5, scoring='accuracy', n_jobs=-1) svm_grid_search.fit(X_train, y_train) print("Best SVM parameters:", svm_grid_search.best_params_) # train Logistic Regression with the best parameters best_lr_model = lr_grid_search.best_estimator_ y_pred_lr = best_lr_model.predict(X_test) # train SVM with the best parameters best_svm_model = svm_grid_search.best_estimator_ y_pred_svm = best_svm_model.predict(X_test) # evaluate models def evaluate_model(y_true, y_pred): print(f"Accuracy: {accuracy_score(y_true, y_pred):.4f}") print(f"Precision (macro): {precision_score(y_true, y_pred, average='macro', zero_division=0.0):.4f}") print(f"Recall (macro): {recall_score(y_true, y_pred, average='macro'):.4f}") print(f"F1 Score (macro): {f1_score(y_true, y_pred, average='macro'):.4f}") # get predicted probabilities for AUC calculation if hasattr(best_lr_model, "predict_proba"): y_prob = best_lr_model.predict_proba(X_test) else: y_prob = best_lr_model.decision_function(X_test) try: print(f"AUC-ROC (macro): {roc_auc_score(y_true, y_prob, multi_class='ovr', average='macro'):.4f}") except ValueError: print("AUC-ROC: Cannot compute AUC for multiclass with this setup.") # evaluate Logistic Regression print("\nLogistic Regression - Performance Metrics:") evaluate_model(y_test, y_pred_lr) # evaluate Support Vector Machine print("\nSupport Vector Machine - Performance Metrics:") evaluate_model(y_test, y_pred_svm)