Files
Data_ScienceUse_Cases/Classification/Imbalanced_Tes.ipynb

1263 lines
52 KiB
Plaintext
Raw Permalink Normal View History

2024-04-23 23:56:47 +07:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "35edb7d6",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "7c963881",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Role Satisfaction</th>\n",
" <th>Skill Utilization</th>\n",
" <th>Career Growth Opportunity</th>\n",
" <th>Supervisor Support</th>\n",
" <th>Work-Life Balance</th>\n",
" <th>Recognition &amp; Appreciation</th>\n",
" <th>Company Culture</th>\n",
" <th>Training &amp; Development</th>\n",
" <th>Communication Effectiveness</th>\n",
" <th>Diversity &amp; Inclusion</th>\n",
" <th>Work Environment</th>\n",
" <th>Compensation</th>\n",
" <th>Staff_Id</th>\n",
" <th>Month_Of_Service</th>\n",
" <th>Years_Of_Service</th>\n",
" <th>Residence</th>\n",
" <th>Residence_Code</th>\n",
" <th>Net_Salary</th>\n",
" <th>Resigned</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>SA63171</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>Depok</td>\n",
" <td>4</td>\n",
" <td>5582218</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>SP10211</td>\n",
" <td>43</td>\n",
" <td>3</td>\n",
" <td>Jakarta</td>\n",
" <td>1</td>\n",
" <td>9213443</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>5</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>SA79627</td>\n",
" <td>10</td>\n",
" <td>0</td>\n",
" <td>Bekasi</td>\n",
" <td>3</td>\n",
" <td>5836455</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>SA02310</td>\n",
" <td>17</td>\n",
" <td>1</td>\n",
" <td>Depok</td>\n",
" <td>4</td>\n",
" <td>6035466</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>SA98565</td>\n",
" <td>17</td>\n",
" <td>1</td>\n",
" <td>Jakarta</td>\n",
" <td>1</td>\n",
" <td>5568101</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Role Satisfaction Skill Utilization Career Growth Opportunity \\\n",
"0 3 4 5 \n",
"1 2 3 1 \n",
"2 3 3 2 \n",
"3 3 3 4 \n",
"4 3 2 4 \n",
"\n",
" Supervisor Support Work-Life Balance Recognition & Appreciation \\\n",
"0 2 2 3 \n",
"1 2 4 3 \n",
"2 2 2 5 \n",
"3 4 3 1 \n",
"4 3 3 2 \n",
"\n",
" Company Culture Training & Development Communication Effectiveness \\\n",
"0 3 3 2 \n",
"1 4 3 2 \n",
"2 4 4 3 \n",
"3 4 4 4 \n",
"4 3 4 2 \n",
"\n",
" Diversity & Inclusion Work Environment Compensation Staff_Id \\\n",
"0 3 4 4 SA63171 \n",
"1 2 2 4 SP10211 \n",
"2 2 4 5 SA79627 \n",
"3 5 3 5 SA02310 \n",
"4 3 2 3 SA98565 \n",
"\n",
" Month_Of_Service Years_Of_Service Residence Residence_Code Net_Salary \\\n",
"0 1 0 Depok 4 5582218 \n",
"1 43 3 Jakarta 1 9213443 \n",
"2 10 0 Bekasi 3 5836455 \n",
"3 17 1 Depok 4 6035466 \n",
"4 17 1 Jakarta 1 5568101 \n",
"\n",
" Resigned \n",
"0 0 \n",
"1 0 \n",
"2 0 \n",
"3 0 \n",
"4 0 "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Grab Data\n",
"df = pd.read_excel(\"https://raw.githubusercontent.com/youronlydimwit/Data_ScienceUse_Cases/main/Classification/Data/HRD_Survey_50.xlsx\")\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "fcbe70d6",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Role Satisfaction</th>\n",
" <th>Skill Utilization</th>\n",
" <th>Career Growth Opportunity</th>\n",
" <th>Supervisor Support</th>\n",
" <th>Work-Life Balance</th>\n",
" <th>Recognition &amp; Appreciation</th>\n",
" <th>Company Culture</th>\n",
" <th>Training &amp; Development</th>\n",
" <th>Communication Effectiveness</th>\n",
" <th>Diversity &amp; Inclusion</th>\n",
" <th>Work Environment</th>\n",
" <th>Compensation</th>\n",
" <th>Month_Of_Service</th>\n",
" <th>Years_Of_Service</th>\n",
" <th>Residence_Code</th>\n",
" <th>Net_Salary</th>\n",
" <th>Resigned</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>5582218</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>43</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>9213443</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>5</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>10</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>5836455</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>17</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>6035466</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>17</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>5568101</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Role Satisfaction Skill Utilization Career Growth Opportunity \\\n",
"0 3 4 5 \n",
"1 2 3 1 \n",
"2 3 3 2 \n",
"3 3 3 4 \n",
"4 3 2 4 \n",
"\n",
" Supervisor Support Work-Life Balance Recognition & Appreciation \\\n",
"0 2 2 3 \n",
"1 2 4 3 \n",
"2 2 2 5 \n",
"3 4 3 1 \n",
"4 3 3 2 \n",
"\n",
" Company Culture Training & Development Communication Effectiveness \\\n",
"0 3 3 2 \n",
"1 4 3 2 \n",
"2 4 4 3 \n",
"3 4 4 4 \n",
"4 3 4 2 \n",
"\n",
" Diversity & Inclusion Work Environment Compensation Month_Of_Service \\\n",
"0 3 4 4 1 \n",
"1 2 2 4 43 \n",
"2 2 4 5 10 \n",
"3 5 3 5 17 \n",
"4 3 2 3 17 \n",
"\n",
" Years_Of_Service Residence_Code Net_Salary Resigned \n",
"0 0 4 5582218 0 \n",
"1 3 1 9213443 0 \n",
"2 0 3 5836455 0 \n",
"3 1 4 6035466 0 \n",
"4 1 1 5568101 0 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Making a copy of df, but with only numerical information\n",
"# Removing unnecessary columns\n",
"pred_df = df.drop(columns=['Staff_Id','Residence'])\n",
"pred_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "10a4fe36",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Role Satisfaction int64\n",
"Skill Utilization int64\n",
"Career Growth Opportunity int64\n",
"Supervisor Support int64\n",
"Work-Life Balance int64\n",
"Recognition & Appreciation int64\n",
"Company Culture int64\n",
"Training & Development int64\n",
"Communication Effectiveness int64\n",
"Diversity & Inclusion int64\n",
"Work Environment int64\n",
"Compensation int64\n",
"Month_Of_Service int64\n",
"Residence_Code int64\n",
"Net_Salary int64\n",
"Resigned int64\n",
"dtype: object"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pred_df = pred_df.drop(columns=[\"Years_Of_Service\"])\n",
"pred_df.dtypes"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "a4bf1dae",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "2dd56994",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.tree import DecisionTreeClassifier"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "b7c40c6f",
"metadata": {},
"outputs": [],
"source": [
"# Split the data into features (X) and labels (y)\n",
"X = pred_df.drop(columns=['Resigned'])\n",
"y = pred_df['Resigned']\n",
"\n",
"# Split the data into training and testing sets\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
"\n",
"# Define a dictionary to store results\n",
"results = {'Model': [], 'F1_score': [], 'Accuracy': [], 'Precision': [], 'Recall': []}"
]
},
{
"cell_type": "markdown",
"id": "319665bc",
"metadata": {},
"source": [
"# Norm"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "e162bda0",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Asus\\anaconda3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
" _warn_prf(average, modifier, msg_start, len(result))\n",
"C:\\Users\\Asus\\anaconda3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
" _warn_prf(average, modifier, msg_start, len(result))\n"
]
}
],
"source": [
"# Train Random Forest model\n",
"rf_model = RandomForestClassifier(random_state=42)\n",
"rf_model.fit(X_train, y_train)\n",
"\n",
"# Train Decision Tree model\n",
"dt_model = DecisionTreeClassifier(random_state=42)\n",
"dt_model.fit(X_train, y_train)\n",
"\n",
"# Train Logistic Regression model\n",
"lr_model = LogisticRegression(random_state=42)\n",
"lr_model.fit(X_train, y_train)\n",
"\n",
"# Evaluate models\n",
"models = {\"Random Forest\": rf_model, \"Decision Tree\": dt_model, \"Logistic Regression\": lr_model}\n",
"metrics = {\"Accuracy\": accuracy_score, \"Precision\": precision_score, \"Recall\": recall_score, \"F1 Score\": f1_score}\n",
"results = {}\n",
"\n",
"for name, model in models.items():\n",
" y_pred = model.predict(X_test)\n",
" result = {}\n",
" for metric_name, metric_func in metrics.items():\n",
" result[metric_name] = metric_func(y_test, y_pred)\n",
" results[name] = result\n",
"\n",
"# Convert results to DataFrame for easier plotting\n",
"results_df = pd.DataFrame(results)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "94ebdccc",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Random Forest</th>\n",
" <th>Decision Tree</th>\n",
" <th>Logistic Regression</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Accuracy</th>\n",
" <td>0.87</td>\n",
" <td>0.820000</td>\n",
" <td>0.87</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Precision</th>\n",
" <td>0.00</td>\n",
" <td>0.272727</td>\n",
" <td>0.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Recall</th>\n",
" <td>0.00</td>\n",
" <td>0.230769</td>\n",
" <td>0.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>F1 Score</th>\n",
" <td>0.00</td>\n",
" <td>0.250000</td>\n",
" <td>0.00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Random Forest Decision Tree Logistic Regression\n",
"Accuracy 0.87 0.820000 0.87\n",
"Precision 0.00 0.272727 0.00\n",
"Recall 0.00 0.230769 0.00\n",
"F1 Score 0.00 0.250000 0.00"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"results_df"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "e95e9b4b",
"metadata": {},
"outputs": [],
"source": [
"from imblearn.over_sampling import SMOTE"
]
},
{
"cell_type": "markdown",
"id": "96ab491e",
"metadata": {},
"source": [
"# SMOTE"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "4bed2a76",
"metadata": {},
"outputs": [],
"source": [
"# Apply SMOTE to oversample the minority class in the training data\n",
"smote = SMOTE(random_state=42)\n",
"X_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "c24a2a88",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Random Forest</th>\n",
" <th>Decision Tree</th>\n",
" <th>Logistic Regression</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Accuracy</th>\n",
" <td>0.83</td>\n",
" <td>0.720000</td>\n",
" <td>0.130000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Precision</th>\n",
" <td>0.00</td>\n",
" <td>0.105263</td>\n",
" <td>0.130000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Recall</th>\n",
" <td>0.00</td>\n",
" <td>0.153846</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>F1 Score</th>\n",
" <td>0.00</td>\n",
" <td>0.125000</td>\n",
" <td>0.230088</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Random Forest Decision Tree Logistic Regression\n",
"Accuracy 0.83 0.720000 0.130000\n",
"Precision 0.00 0.105263 0.130000\n",
"Recall 0.00 0.153846 1.000000\n",
"F1 Score 0.00 0.125000 0.230088"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Train Random Forest model\n",
"rf_model = RandomForestClassifier(random_state=42)\n",
"rf_model.fit(X_train_resampled, y_train_resampled)\n",
"\n",
"# Train Decision Tree model\n",
"dt_model = DecisionTreeClassifier(random_state=42)\n",
"dt_model.fit(X_train_resampled, y_train_resampled)\n",
"\n",
"# Train Logistic Regression model\n",
"lr_model = LogisticRegression(random_state=42)\n",
"lr_model.fit(X_train_resampled, y_train_resampled)\n",
"\n",
"# Evaluate models\n",
"models = {\"Random Forest\": rf_model, \"Decision Tree\": dt_model, \"Logistic Regression\": lr_model}\n",
"metrics = {\"Accuracy\": accuracy_score, \"Precision\": precision_score, \"Recall\": recall_score, \"F1 Score\": f1_score}\n",
"results = {}\n",
"\n",
"for name, model in models.items():\n",
" y_pred = model.predict(X_test)\n",
" result = {}\n",
" for metric_name, metric_func in metrics.items():\n",
" result[metric_name] = metric_func(y_test, y_pred)\n",
" results[name] = result\n",
"\n",
"# Convert results to DataFrame for easier plotting\n",
"results_df_resampled = pd.DataFrame(results)\n",
"\n",
"results_df_resampled"
]
},
{
"cell_type": "markdown",
"id": "45d27935",
"metadata": {},
"source": [
"# OVERSAMPLER"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "33d278e9",
"metadata": {},
"outputs": [],
"source": [
"from imblearn.over_sampling import RandomOverSampler"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "c4b2b38c",
"metadata": {},
"outputs": [],
"source": [
"# Apply Random Oversampling to balance the training data\n",
"oversampler = RandomOverSampler(random_state=42)\n",
"X_train_resampled, y_train_resampled = oversampler.fit_resample(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "6e730981",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Asus\\anaconda3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
" _warn_prf(average, modifier, msg_start, len(result))\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Random Forest</th>\n",
" <th>Decision Tree</th>\n",
" <th>Logistic Regression</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Accuracy</th>\n",
" <td>0.87</td>\n",
" <td>0.78</td>\n",
" <td>0.130000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Precision</th>\n",
" <td>0.00</td>\n",
" <td>0.00</td>\n",
" <td>0.130000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Recall</th>\n",
" <td>0.00</td>\n",
" <td>0.00</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>F1 Score</th>\n",
" <td>0.00</td>\n",
" <td>0.00</td>\n",
" <td>0.230088</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Random Forest Decision Tree Logistic Regression\n",
"Accuracy 0.87 0.78 0.130000\n",
"Precision 0.00 0.00 0.130000\n",
"Recall 0.00 0.00 1.000000\n",
"F1 Score 0.00 0.00 0.230088"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Train Random Forest model\n",
"rf_model = RandomForestClassifier(random_state=42)\n",
"rf_model.fit(X_train_resampled, y_train_resampled)\n",
"\n",
"# Train Decision Tree model\n",
"dt_model = DecisionTreeClassifier(random_state=42)\n",
"dt_model.fit(X_train_resampled, y_train_resampled)\n",
"\n",
"# Train Logistic Regression model\n",
"lr_model = LogisticRegression(random_state=42)\n",
"lr_model.fit(X_train_resampled, y_train_resampled)\n",
"\n",
"# Evaluate models\n",
"models = {\"Random Forest\": rf_model, \"Decision Tree\": dt_model, \"Logistic Regression\": lr_model}\n",
"metrics = {\"Accuracy\": accuracy_score, \"Precision\": precision_score, \"Recall\": recall_score, \"F1 Score\": f1_score}\n",
"results = {}\n",
"\n",
"for name, model in models.items():\n",
" y_pred = model.predict(X_test)\n",
" result = {}\n",
" for metric_name, metric_func in metrics.items():\n",
" result[metric_name] = metric_func(y_test, y_pred)\n",
" results[name] = result\n",
"\n",
"# Convert results to DataFrame for easier plotting\n",
"results_df_resampled = pd.DataFrame(results)\n",
"\n",
"results_df_resampled"
]
},
{
"cell_type": "markdown",
"id": "bbe4b256",
"metadata": {},
"source": [
"# CLASS WEIGHTS - NORM"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "a1a034ad",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Asus\\anaconda3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
" _warn_prf(average, modifier, msg_start, len(result))\n",
"C:\\Users\\Asus\\anaconda3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
" _warn_prf(average, modifier, msg_start, len(result))\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Random Forest</th>\n",
" <th>Decision Tree</th>\n",
" <th>Logistic Regression</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Accuracy</th>\n",
" <td>0.87</td>\n",
" <td>0.800000</td>\n",
" <td>0.87</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Precision</th>\n",
" <td>0.00</td>\n",
" <td>0.111111</td>\n",
" <td>0.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Recall</th>\n",
" <td>0.00</td>\n",
" <td>0.076923</td>\n",
" <td>0.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>F1 Score</th>\n",
" <td>0.00</td>\n",
" <td>0.090909</td>\n",
" <td>0.00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Random Forest Decision Tree Logistic Regression\n",
"Accuracy 0.87 0.800000 0.87\n",
"Precision 0.00 0.111111 0.00\n",
"Recall 0.00 0.076923 0.00\n",
"F1 Score 0.00 0.090909 0.00"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Define class weights\n",
"class_weights = {0: 1, 1: 9}\n",
"\n",
"# Train Random Forest model\n",
"rf_model = RandomForestClassifier(random_state=42, class_weight=class_weights)\n",
"rf_model.fit(X_train, y_train)\n",
"\n",
"# Train Decision Tree model\n",
"dt_model = DecisionTreeClassifier(random_state=42, class_weight=class_weights)\n",
"dt_model.fit(X_train, y_train)\n",
"\n",
"# Train Logistic Regression model\n",
"lr_model = LogisticRegression(random_state=42, class_weight=class_weights)\n",
"lr_model.fit(X_train, y_train)\n",
"\n",
"# Evaluate models\n",
"models = {\"Random Forest\": rf_model, \"Decision Tree\": dt_model, \"Logistic Regression\": lr_model}\n",
"metrics = {\"Accuracy\": accuracy_score, \"Precision\": precision_score, \"Recall\": recall_score, \"F1 Score\": f1_score}\n",
"results = {}\n",
"\n",
"for name, model in models.items():\n",
" y_pred = model.predict(X_test)\n",
" result = {}\n",
" for metric_name, metric_func in metrics.items():\n",
" result[metric_name] = metric_func(y_test, y_pred)\n",
" results[name] = result\n",
"\n",
"# Convert results to DataFrame for easier plotting\n",
"results_df_resampled = pd.DataFrame(results)\n",
"\n",
"results_df_resampled"
]
},
{
"cell_type": "markdown",
"id": "00cb6be9",
"metadata": {},
"source": [
"# UNDERSAMPLER"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "06a4d1c7",
"metadata": {},
"outputs": [],
"source": [
"from imblearn.under_sampling import RandomUnderSampler"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "dcb0db52",
"metadata": {},
"outputs": [],
"source": [
"# Apply Random Oversampling to balance the training data\n",
"undersampler = RandomUnderSampler(random_state=42)\n",
"X_train_resampled, y_train_resampled = undersampler.fit_resample(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "a939e8fe",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Random Forest</th>\n",
" <th>Decision Tree</th>\n",
" <th>Logistic Regression</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Accuracy</th>\n",
" <td>0.560000</td>\n",
" <td>0.490000</td>\n",
" <td>0.130000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Precision</th>\n",
" <td>0.155556</td>\n",
" <td>0.183333</td>\n",
" <td>0.130000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Recall</th>\n",
" <td>0.538462</td>\n",
" <td>0.846154</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>F1 Score</th>\n",
" <td>0.241379</td>\n",
" <td>0.301370</td>\n",
" <td>0.230088</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Random Forest Decision Tree Logistic Regression\n",
"Accuracy 0.560000 0.490000 0.130000\n",
"Precision 0.155556 0.183333 0.130000\n",
"Recall 0.538462 0.846154 1.000000\n",
"F1 Score 0.241379 0.301370 0.230088"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Train Random Forest model\n",
"rf_model = RandomForestClassifier(random_state=42)\n",
"rf_model.fit(X_train_resampled, y_train_resampled)\n",
"\n",
"# Train Decision Tree model\n",
"dt_model = DecisionTreeClassifier(random_state=42)\n",
"dt_model.fit(X_train_resampled, y_train_resampled)\n",
"\n",
"# Train Logistic Regression model\n",
"lr_model = LogisticRegression(random_state=42)\n",
"lr_model.fit(X_train_resampled, y_train_resampled)\n",
"\n",
"# Evaluate models\n",
"models = {\"Random Forest\": rf_model, \"Decision Tree\": dt_model, \"Logistic Regression\": lr_model}\n",
"metrics = {\"Accuracy\": accuracy_score, \"Precision\": precision_score, \"Recall\": recall_score, \"F1 Score\": f1_score}\n",
"results = {}\n",
"\n",
"for name, model in models.items():\n",
" y_pred = model.predict(X_test)\n",
" result = {}\n",
" for metric_name, metric_func in metrics.items():\n",
" result[metric_name] = metric_func(y_test, y_pred)\n",
" results[name] = result\n",
"\n",
"# Convert results to DataFrame for easier plotting\n",
"results_df_resampled = pd.DataFrame(results)\n",
"\n",
"results_df_resampled"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "3269fce1",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 720x432 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Calculate class frequencies for y_train_resampled and y_train\n",
"unique_train_resampled, counts_train_resampled = np.unique(y_train_resampled, return_counts=True)\n",
"unique_train, counts_train = np.unique(y_train, return_counts=True)\n",
"\n",
"# Plot bar plots\n",
"plt.figure(figsize=(10, 6))\n",
"\n",
"# Plot for y_train_resampled\n",
"plt.subplot(1, 2, 1)\n",
"plt.bar(unique_train_resampled, counts_train_resampled, color='red')\n",
"plt.title('Distribution of y_train_resampled')\n",
"plt.xlabel('Class')\n",
"plt.ylabel('Frequency')\n",
"plt.xticks(unique_train_resampled)\n",
"plt.ylim(0, max(max(counts_train_resampled), max(counts_train)) + 10)\n",
"\n",
"# Plot for y_train\n",
"plt.subplot(1, 2, 2)\n",
"plt.bar(unique_train, counts_train, color='blue')\n",
"plt.title('Distribution of y_train')\n",
"plt.xlabel('Class')\n",
"plt.ylabel('Frequency')\n",
"plt.xticks(unique_train)\n",
"plt.ylim(0, max(max(counts_train_resampled), max(counts_train)) + 10)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f16cadbc",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}