36 lines
1.1 KiB
Python
36 lines
1.1 KiB
Python
"""Тесты кросс-валидации на синтетических данных."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import numpy as np
|
|
import pandas as pd
|
|
|
|
from stylometry.cv import run_repeated_cv
|
|
|
|
|
|
def test_repeated_cv_runs_and_has_all_predictions() -> None:
|
|
rng = np.random.default_rng(0)
|
|
n_samples = 60
|
|
n_classes = 3
|
|
X = pd.DataFrame(
|
|
{
|
|
"feature_1": rng.normal(size=n_samples),
|
|
"feature_2": rng.normal(size=n_samples),
|
|
}
|
|
)
|
|
y = np.repeat([f"c{index}" for index in range(n_classes)], 20)
|
|
from sklearn.linear_model import LogisticRegression
|
|
from sklearn.pipeline import Pipeline
|
|
from sklearn.preprocessing import StandardScaler
|
|
|
|
pipeline = Pipeline(
|
|
[("scale", StandardScaler()), ("model", LogisticRegression(max_iter=1000))]
|
|
)
|
|
result = run_repeated_cv(
|
|
pipeline, X, y, n_splits=3, n_repeats=2, seed=42, verbose=False
|
|
)
|
|
assert len(result.oof) == n_samples * 2
|
|
assert set(result.oof["y_true"]) == set(y)
|
|
assert result.fold_metrics["macro_f1"].between(0, 1).all()
|
|
assert result.labels.tolist() == ["c0", "c1", "c2"]
|