Loading

import pandas as pd
import numpy as np
# import matplotlib.pyplot as plt
# import seaborn as sns
import time
myData = pd.read_csv("../../scikit-learn-mooc/datasets/adult-census.csv")
myData = myData.drop(columns="education-num")
print(f"The dataset data contains {myData.shape[0]} samples and {myData.shape[1]} features")
The dataset data contains 48842 samples and 13 features
target_column = 'class'
target = myData[target_column]
data = myData.drop(columns=target_column)
from sklearn.compose import make_column_selector as selector
# 
numerical_columns = selector(dtype_exclude=object)(data)
categorical_columns = selector(dtype_include=object)(data)
all_columns = numerical_columns + categorical_columns
data = data[all_columns]
data_numerical = data[numerical_columns]
data_categorical = data[categorical_columns]

Split data in train and test

from sklearn.model_selection import train_test_split
# 
data_train, data_test, target_train, target_test = train_test_split(
    data_numerical, target, test_size=0.25)
print(f"Number of samples in testing: {data_train.shape[0]} => "
      f"{data_test.shape[0] / data_numerical.shape[0] * 100:.1f}% of the"
      f" original set")
Number of samples in testing: 36631 => 25.0% of the original set

LogisticRegression without preprocessing

the data are split with cross_validate and not with train_test_split

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_validate
# 
model = LogisticRegression()
cv_results = cross_validate(model, data_numerical, target, cv=10)
scores = cv_results["test_score"]
fit_time = cv_results["fit_time"]
print("The accuracy is "
      f"{scores.mean():.3f} +/- {scores.std():.3f}, for {fit_time.mean():.3f} seconds")
The accuracy is 0.800 +/- 0.004, for 0.183 seconds

LogisticRegression with preprocessing via pipeline

Same accuracy but better fitting time

from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
# 
model = make_pipeline(StandardScaler(), LogisticRegression())
cv_results = cross_validate(model, data_numerical, target, cv=10)
scores = cv_results["test_score"]
fit_time = cv_results["fit_time"]
print("The accuracy is "
      f"{scores.mean():.3f} +/- {scores.std():.3f}, for {fit_time.mean():.3f} seconds")
The accuracy is 0.800 +/- 0.004, for 0.074 seconds