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
- Reduce the features with LDA, using the fewest components that reach 85% of the explained variance (configurable).
- For each candidate cluster count, run K-Means once on the LDA components and reuse those
clusters across candidate train fractions (
MiniBatchKMeansabove 50,000 rows). - Build strata from
class × clusterand do a stratified split. Strata with a single member can't be split, so those rows always go to the train set. - Score a classifier on every
(train fraction, n_clusters)pair and return the split with the best test score.
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
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_cluster,
)
# 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; cluster methods return two feature frames.
X_train, X_test, y_train, y_test = s_attp_ts(X, y)
X_train, X_test = s_attp_cluster(X)
s_attp_clustered_sampling is the advanced clustering sampler; s_attp_cluster is its alias.
It 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)
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.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| i_attp-0.2.0.tar.gz | 124.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| i_attp-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 138.0 kB
Release files / i_attp-0.2.0.tar.gz
| Download URL | i_attp-0.2.0.tar.gz |
|---|---|
| Size | 124.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ba771a6ea583681c2d8cc1f62158241ae18e5793c84f368e8ebfad88c423f8fe
|
|
BLAKE2b-256 checksum How to use checksums |
1cb1efe28991d398f8f9b583922273265ad3a4ca380fce3afea462aebd2e4c30
|
| 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 logRelease files / i_attp-0.2.0-py3-none-any.whl
| Download URL | i_attp-0.2.0-py3-none-any.whl |
|---|---|
| Size | 13.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cc5b578bddb8d95b342542a960f1e95589e0ba0f31e1275edc860cf24ed2c0be
|
|
BLAKE2b-256 checksum How to use checksums |
54f25e8dffa09fb1513f4dd8fc2284f8772d6e8240ee6d1c1407a4b7f4c4e9f8
|
| 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