Skip to main content

attp (Adaptive Train Test Partitioner)

Cluster-stratified train/test splitting on an LDA-reduced feature space (S-ATTP).

Instead of stratifying on the class label alone, sattp also stratifies on where a row sits in feature space, so the test set covers the same sub-populations as the train set.

How it works

  1. Reduce the features with LDA, using the fewest components that reach 85% of the explained variance (configurable).
  2. For each candidate cluster count, run K-Means once on the LDA components and reuse those clusters across candidate train fractions (MiniBatchKMeans above 50,000 rows).
  3. Build strata from class × cluster and do a stratified split. Strata with a single member can't be split, so those rows always go to the train set.
  4. Score a classifier on every (train fraction, n_clusters) pair and return the split with the best test score.

Process Flow Diagram

process flow diagram

Install

pip install i-attp

Or install directly from GitHub:

pip install git+https://github.com/Jabualani/ATTP.git

For development:

git clone https://github.com/Jabualani/ATTP.git
cd ATTP
pip install -e ".[dev]"
pytest

Version history and migration

Version Main functionality
0.1.2 The original S-ATTP classifier split, exposed as sattp_split, plus the legacy S_ATTP wrapper.
0.2.0 The classifier's preferred name is s_attp_clf; sattp_split and S_ATTP remain available. Adds classification, regression, time-series, and clustering variants, including s_attp_clustered_sampling.

The 0.2.0 release also adds the optional dr_reducer=True output for retrieving a fitted dimensionality reducer. The original s_attp_clf call continues to return its SplitResult by default; most added variants return (X_train, X_test, y_train, y_test), while time-series, pool, clustering, and outlier/inlier methods have their own output shapes as documented below.

To migrate from 0.1.2, prefer the new import name:

from attp import s_attp_clf

result = s_attp_clf(X, y)

Existing code can continue importing sattp_split or S_ATTP. No version bump is needed for documentation-only changes. For future releases, reserve patch increments for bug fixes and documentation-only package updates, and use a minor increment for backward-compatible API additions while the project remains in the 0.x series. Review return shapes and behavior before each release.

Classification usage

from attp import s_attp_clf

result = s_attp_clf(
    X, y,
    splits=[0.7, 0.75, 0.8],   # candidate train fractions
    min_clusters=2,
    max_clusters=10,
)

X_train, y_train, X_test, y_test = result      # unpacks like a 4-tuple
print(result.best_split, result.best_n_clusters, result.n_lda_components)
print(result.explained_variance_ratio)          # ratio explained by each LDA component
print(result.total_explained_variance)           # combined ratio for the selected components
print(result.metrics.head())                    # every candidate, best first

Row labels of the original X/y are preserved in the outputs.

s_attp_clf is the current name for the original S-ATTP split function. The previous sattp_split name remains available as a backward-compatible alias.

Useful options: model= (any scikit-learn classifier used for scoring; defaults to LDA), scoring= (custom (fitted_model, X, y) -> float), variance_threshold=, random_state=, test_size= to provide one holdout size (otherwise splits contains candidate train fractions), and verbose=True to print progress and the selected split. Set DR_Comps_Min= and DR_Comps_Max= to choose the LDA component range.

Set dr_reducer=True on any splitter to receive (normal_output, reducer). The reducer is the fitted LDA, PCA, or PLS estimator where that method uses one; splitters that do not reduce features return None as the reducer. The default dr_reducer=False preserves the normal return value.

Other variants return scikit-learn-ordered tuples: (X_train, X_test, y_train, y_test); pool and clustering functions without targets return (X_train, X_test).

from attp import (
    b_attp_clf, m_attp_clf, mc_mcls_attp_clf,
    s_attp_reg, m_attp_reg, r_t_attp, r_f_attp,
    s_attp_ts, s_attp_clustered_sampling,
)

# PCA/GMM classifier split; random oversampling is applied to training rows only.
X_train, X_test, y_train, y_test = m_attp_clf(X, y, test_size=0.2)
X_train, X_test, y_train, y_test = b_attp_clf(X, y, test_size=0.2)

# Regression: target-bin and feature-aware options.
X_train, X_test, y_train, y_test = s_attp_reg(X, y, test_size=0.2)
X_train, X_test, y_train, y_test = m_attp_reg(X, y, test_size=0.2)
r_t_attp(X, y)  # target-bin stratification
r_f_attp(X, y)  # feature-cluster stratification

# Temporal splits preserve row order; clustered sampling accepts labeled or unlabeled data.
X_train, X_test, y_train, y_test = s_attp_ts(X, y)
X_train, X_test = s_attp_clustered_sampling(X)

s_attp_clustered_sampling supports mixed data with imputation/encoding, date and high-missingness column removal, correlation filtering, supervised LDA or unsupervised PCA, optional outlier/inlier partitioning, and stratified cluster sampling. For example:

from attp import s_attp_clustered_sampling

X_train, X_test, y_train, y_test = s_attp_clustered_sampling(
    X, y, test_size=0.2, n_clusters=5
)
X_inliers, X_outliers = s_attp_clustered_sampling(X, o_i=True)

The ATTP Framework Reference Architecture Documentation describes the library's concepts and variants. It is included in the GitHub repository and in the installed attp package.

Set dr_reducer=True to append the fitted reducer to the normal result; it is None only when supervised reduction cannot be applied (for example, a single target class).

The package also exports auto_attp_clf, auto_attp_reg, auto_attp_ts, auto_attp_al_clf, auto_attp_al_reg, mc_mcls_attp_reg, r_tf_attp, r_ra_attp, r_d_attp, m_attp_ts, and m_attp_cluster.

Original function signature

S_ATTP keeps the original call signature for existing code:

from attp import S_ATTP

X_tr, y_tr, X_te, y_te = S_ATTP(
    X_df, y_df, "target_col", [0.7, 0.8], 2, 10, 1, 3, None, "frames", False, False
)

return_type="indices" returns (train_index, test_index), and return_split_metadata=True appends the metrics DataFrame. If no valid split exists it returns Nones, like the original.

Caveats

  • LDA is fitted on the whole dataset (using all labels) before splitting, and the winning split is chosen by its test score. Both make the reported test score optimistic. Treat it as a way to build a representative split, not as an unbiased performance estimate.
  • Features must be numeric with no missing values.

License

MIT

Metadata

Release files for i-attp 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for i-attp 0.2.1
File Size Uploaded
i_attp-0.2.1.tar.gz 343.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for i-attp 0.2.1
File Interpreter ABI Platform
i_attp-0.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 575.1 kB

Release files / i_attp-0.2.1.tar.gz

Download URL i_attp-0.2.1.tar.gz
Size 343.3 kB
Tags Source
SHA-256 checksum
How to use checksums
a7d4953f02813511f7212a6ce627c0fbb646bd981558039cf8bdd1a307711f5a
BLAKE2b-256 checksum
How to use checksums
b92b02b7b3d2414eef22779f968240efccbcf932894670209ac84665abffdb6d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 17, 2026.

Transparency log

Release files / i_attp-0.2.1-py3-none-any.whl

Download URL i_attp-0.2.1-py3-none-any.whl
Size 231.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
093c088b099c1c1ce6823a375a3631144e085651c428ed276f93e152bd21e353
BLAKE2b-256 checksum
How to use checksums
6e69efb3997d9b2376358fed1c01765a3199f25ce3d582ef02e8bc76fb8dab17
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 17, 2026.

Transparency log

Release history Release notifications | RSS feed

0.2.3

2 release files

0.2.2

2 release files

This release

0.2.1 This release

2 release files

0.2.0

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page