Data Preprocessing Techniques for Machine Learning with Titanic Dataset

Dataset Overview

This tutorial utilizes the Kaggle Titanic training dataset. In this dataset, the second column "Survived" represents the target variable, while all other columns serve as features. The dataset contains 891 rows, 11 features, and 1 target variable. Notably, the "Age" feature has data for only 714 rows, the "Cabin" feature for 204 rows, and the "Embarked" feature for 889 rows, with the remaining entries containing missing values.

Removing Rows or Columns

The DataFrame.drop() method allows deletion of specific rows or columns:

Syntax: DataFrame.drop(labels=None, axis=0, index=None, columns=None, inplace=False)

Parameters:

  • labels: Names of rows or columns to remove (specified as a list)
  • axis: Default is 0 (rows). Set to 1 for columns
  • index: Directly specify rows to remove
  • columns: Directly specify columns to remove
  • inplace: If False (default), returns a new DataFrame. If True, modifies the original DataFrame

Example - Removing columns:

modified_data = original_data.drop(labels=["Cabin", "Name"], axis=1, inplace=False)

Example - Removing rows:

modified_data = original_data.drop(labels=[0,1,2,3,4], axis=0, inplace=False)

Dropping Rows or Columns with Missing Values

The dropna() method handles missing values:

Syntax: DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

Parameters:

  • axis: 0 or 'index' for rows, 1 or 'columns' for columns
  • how: 'any' removes row/column with any missing value, 'all' removes only if all values are missing
  • thresh: Minimum number of non-null values required to keep a row/column
  • subset: Subset of rows/columns to consider when dropping
  • inplace: If True, modifies the original DataFrame

Example - Removing rows with missing values:

clean_data = original_data.dropna(axis=0, inplace=False)

Example - Removing columns with missing values:

clean_data = original_data.dropna(axis=1, inplace=False)

Imputing Missing Values

Scikit-learn's SimpleImputer class fills missing values:

Syntax: SimpleImputer(*, missing_values=nan, strategy='mean', fill_value=None, verbose=0, copy=True, add_indicator=False)

Parameters:

  • missing_values: The placeholder for missing values (default: np.nan)
  • strategy: Imputation strategy ('mean', 'median', 'most_frequent', 'constant')
  • fill_value: Value to use when strategy='constant'
  • add_indicator: If True, adds a binary indicator for missing values

Example - Using median to fill missing "Age" values:

age_values = original_data.loc[:, "Age"].values.reshape(-1, 1)

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy="median")
imputed_values = imputer.fit_transform(age_values)

original_data.loc[:, "Age"] = imputed_values

Data Type Conversion

To convert the "Embarked" column to integer type:

unique_values = original_data["Embarked"].unique().tolist()
original_data["Embarked"] = original_data["Embarked"].apply(lambda x: unique_values.index(x))

Splitting Data into Training and Testing Sets

Scikit-learn's train_test_split divides the dataset:

Syntax: train_test_split(*arrays, test_size=None, train_size=None, random_state=None, shuffle=True, stratify=None)

Example:

# Separate features and target
features = original_data.loc[:, original_data.columns != "Survived"]
target = original_data.loc[:, original_data.columns == "Survived"]

# Split into training and testing sets
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.3)

Reordering Indices

After splitting datasets, indices may become disordered. To correct this:

for dataset in [X_train, X_test, y_train, y_test]:
    dataset.index = range(dataset.shape[0])

Cross-Validation

Cross-validation evaluates model performance:

Syntax: cross_val_score(estimator, X, y, scoring=None, cv=None, n_jobs=None, verbose=0)

Example:

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score

model = DecisionTreeClassifier(random_state=30)
model.fit(X_train, y_train)

cv_scores = cross_val_score(model, X_train, y_train, cv=10)
mean_score = cv_scores.mean()

Grid Search

Grid search optimizes hyperparameters:

Example:

from sklearn.model_selection import GridSearchCV

# Define parameter grid
param_grid = {
    "criterion": ["gini", "entropy"],
    "splitter": ["best", "random"],
    "max_depth": list(range(1, 11))
}

base_model = DecisionTreeClassifier(random_state=30)
grid_search = GridSearchCV(base_model, param_grid, cv=10)
grid_search.fit(X_train, y_train)

# Best parameters and score
best_params = grid_search.best_params_
best_score = grid_search.best_score_

Learning Curves

Learning curves visualize model performance across different training set sizes:

import matplotlib.pyplot as plt
import sklearn.tree as tree

train_scores = []
for depth in range(1, 11):
    model = tree.DecisionTreeClassifier(
        max_depth=depth,
        criterion="entropy",
        random_state=24,
        splitter="random"
    )
    model.fit(X_train, y_train)
    accuracy = model.score(X_test, y_test)
    train_scores.append(accuracy)

plt.plot(range(1, 11), train_scores, color="red", label="Model Accuracy")
plt.xlabel("Tree Depth")
plt.ylabel("Accuracy")
plt.legend()
plt.title("Learning Curve for Decision Tree Classifier")
plt.show()

Tags: Data Preprocessing Machine Learning titanic dataset Data Cleaning Feature Engineering

Posted on Mon, 06 Jul 2026 17:28:41 +0000 by Dilb