Import Required Libraries
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt import joblib import tempfile import boto3
from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder, StandardScaler from sklearn.feature_selection import SelectKBest, f_regression 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, confusion_matrix
Define Constants BUCKET_NAME = "employee-data" S3_INPUT_FOLDER = "inputfiles" S3_OUTPUT_FOLDER = "ml-output" FILE_NAME = "employee_cleaned_data.csv" AWS S3 Initialization s3_client = boto3.client('s3')
Task 1: Load Data from S3
try: Define S3 file path s3_file_key = f"{S3_INPUT_FOLDER}/{FILE_NAME}" Use tempfile to download the file locally with tempfile.NamedTemporaryFile(delete=False, suffix='.csv') as temp_file: temp_file_path = temp_file.name s3_client.download_file(BUCKET_NAME, s3_file_key, temp_file_path) print(f"File downloaded successfully from s3://{BUCKET_NAME}/{s3_file_key}") Load the dataset into a Pandas DataFrame df = pd.read_csv(temp_file_path) print("Data loaded successfully!") except Exception as e: print("Error loading data from S3:", e)
Task 2: Preprocess Data
Remove unique identifier column
if "employee_operations_id" in df.columns: df = df.drop(columns=["employee_operations_id"]) Extract numeric values from the 'region' column if "region" in df.columns: df['region'] = df['region'].str.extract('(\d+)').astype(float)
Task 3: Analyze and Visualize Data
Remove duplicates
duplicate_count = df.duplicated().sum() print(f"Number of duplicate records: {duplicate_count}") df = df.drop_duplicates() Pie chart for Gender Distribution if 'gender' in df.columns: gender_counts = df['gender'].value_counts() plt.figure(figsize=(8, 6)) plt.pie(gender_counts, labels=gender_counts.index, autopct='%1.1f%%', startangle=140, colors=['#ff9999','#66b3ff','#99ff99']) plt.title('Gender Distribution') plt.show()
Count plot for Education by Gender
if 'education' in df.columns and 'gender' in df.columns: plt.figure(figsize=(10, 6)) sns.countplot(data=df, x='education', hue='gender', palette='Set2') plt.title('Education Level Distribution by Gender') plt.xlabel('Education Level') plt.ylabel('Count') plt.xticks(rotation=45) plt.show()
Task 4: Feature Engineering
Define dependent and independent variables
dependent_variable = "turnover" # Replace with actual column name if dependent_variable in df.columns: X = df.drop(columns=[dependent_variable]) Y = df[dependent_variable] # Preprocess with ColumnTransformer categorical_columns = X.select_dtypes(include=['object']).columns.tolist() numerical_columns = X.select_dtypes(include=['int64', 'float64']).columns.tolist() column_transformer = ColumnTransformer( transformers=[ ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_columns), ('num', 'passthrough', numerical_columns) ] ) X_transformed = column_transformer.fit_transform(X) Feature selection selector = SelectKBest(score_func=f_regression, k=5) X_selected = selector.fit_transform(X_transformed, Y)
Task 5: Model Training and Evaluation
Split data into training and testing sets X_train, X_test, y_train, y_test = train_test_split(X_selected, Y, test_size=0.2, random_state=0)
Feature scaling
scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test)
Train Logistic Regression model
model = LogisticRegression(random_state=0) model.fit(X_train_scaled, y_train)
Predictions and evaluation
y_pred = model.predict(X_test_scaled) accuracy = accuracy_score(y_test, y_pred) precision = precision_score(y_test, y_pred) recall = recall_score(y_test, y_pred) f1 = f1_score(y_test, y_pred) print(f"Accuracy: {accuracy:.2f}") print(f"Precision: {precision:.2f}") print(f"Recall: {recall:.2f}") print(f"F1-Score: {f1:.2f}") Confusion matrix heatmap cm = confusion_matrix(y_test, y_pred) plt.figure(figsize=(8, 6)) sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=['Negative', 'Positive'], yticklabels=['Negative', 'Positive']) plt.xlabel('Predicted Values') plt.ylabel('Actual Values') plt.title('Confusion Matrix') plt.show()
Task 6: Deploy Model
with tempfile.NamedTemporaryFile(delete=False, suffix='.pkl') as temp_file: model_file_path = temp_file.name joblib.dump(model, model_file_path) s3_file_key = f"{S3_OUTPUT_FOLDER}/logistic_regression_model.pkl" try: s3_client.upload_file(model_file_path, BUCKET_NAME, s3_file_key) print(f"Model uploaded successfully to s3://{BUCKET_NAME}/{s3_file_key}") except Exception as e: print("Error uploading the model:", e)
Task 7: Prediction Using Deployed Model
try: with tempfile.NamedTemporaryFile(delete=False, suffix='.pkl') as temp_file: model_file_path = temp_file.name s3_client.download_file(BUCKET_NAME, s3_file_key, model_file_path) model = joblib.load(model_file_path) y_pred = model.predict(X_test_scaled) accuracy = accuracy_score(y_test, y_pred) print(f"Prediction Accuracy: {accuracy:.2f}") except Exception as e: print("Error during prediction:", e)
Top comments (0)