from collections import Counter import numpy as np from sklearn.datasets import make_classification from sklearn.linear_model import LogisticRegression from sklearn.metrics import balanced_accuracy_score, classification_report from sklearn.model_selection import train_test_split from sklearn.utils.class_weight import compute_class_weight X, y = make_classification( n_samples=1200, n_features=6, n_informative=4, n_redundant=0, weights=[0.92, 0.08], class_sep=0.65, flip_y=0.02, random_state=42, ) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.25, stratify=y, random_state=42, ) classes = np.unique(y_train) class_weights = compute_class_weight( class_weight="balanced", classes=classes, y=y_train, ) weight_map = { int(label): round(float(weight), 3) for label, weight in zip(classes, class_weights) } class_counts = { int(label): int(count) for label, count in sorted(Counter(y_train).items()) } print(f"Training class counts: {class_counts}") print(f"Balanced class weights: {weight_map}") models = { "unweighted": LogisticRegression(max_iter=1000, random_state=42), "balanced": LogisticRegression( class_weight="balanced", max_iter=1000, random_state=42, ), } for name, model in models.items(): model.fit(X_train, y_train) predictions = model.predict(X_test) score = balanced_accuracy_score(y_test, predictions) print() print(f"{name} classifier") print(f"class_weight: {model.get_params()['class_weight']}") print(f"balanced accuracy: {score:.3f}") print( classification_report( y_test, predictions, target_names=["majority 0", "minority 1"], digits=3, zero_division=0, ) )