Using crossvalidation (v2)
how to build predictive models on tabulardatasets, with only numerical features
- Loading
- Split data in train and test
- LogisticRegression without preprocessing
- LogisticRegression with preprocessing via pipeline
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")
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]
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")
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")
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")