PR1: PDL contracts & safety hardening#245
Closed
Hedy-dev wants to merge 9 commits into
Closed
Conversation
… from pdl-develop issues
…ostic, name policy
…egistry, relative imports, pyproject) for DataCube
…her comments, docstring
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Отчёт по выполнению PR 1
Статус: Issue 1 — выполнен. Issue 2 — выполнен.
Затронутые файлы:
1. Явные constants/metadata для classification target semantics
Статус: выполнено
Файл:
pairwise_core.py, строки 14–16Добавлено:
Где используется:
CLASSIFICATION_SAME_LABELpairwise_core.py_predict_same_probability— выбор столбца P(same) изpredict_proba; `CLASSIFICATION_SAME_LABEL,CLASSIFICATION_DIFFERENT_LABELpairwise_core.py_pair_target_semantics(task="classification")→ поляsame_label,different_labelREGRESSION_DELTA_SIGNpairwise_core.py_pair_target_semantics(task="regression")→ полеdelta_sign2. Политика имён:
sameиdifferentне смешиваютсяСтатус: выполнено в active path и legacy helper
Classification — training target
pair_target = (left != anchor)dissimilarity_target = (left != anchor)pairwise_core.py,build_classification_pairs(~143)dissimilarity_target+ docstring контракта0=same, 1=differentpairwise_model.py,pair_output_difference(~65–78)Семантика (зафиксированный контракт):
В
PairwiseBatch.targetпо-прежнему поле называетсяtarget(публичная структура не менялась), но в него кладётсяdissimilarity_target.Classification — inference / scoring
similarity = predict_similarity_by_chunks(...)same_probability = predict_similarity_by_chunks(...)pairwise_model.py,score_difference(~174)target_differencedissimilarity_targetpairwise_model.py,score_difference(~175–176)predicted_difference = 1.0 - similaritypredicted_dissimilarity = 1.0 - same_probabilitypairwise_model.py,score_difference(~177)В
predict_similarity_by_chunksлокальная переменнаяsame_probability(~211) — это P(class ==same_label), не «разность» и не dissimilarity.Не переименовано (косметика, поведение то же):
aggregate_similarity_to_class_proba(similarity, ...)— аргумент по-прежнемуsimilarity, по смыслу это матрица P(same)._predict_encoded_proba: локальноsimilarity = predict_similarity_by_chunks(...)(~185).Regression — training target
pair_target = left - anchordelta_left_minus_anchor = left - anchorpairwise_core.py,build_regression_pairs(~166)return anchor - leftdelta_left_minus_anchor = left - anchorpairwise_model.py,pair_output(~60–63)3. Regression sign convention
left - anchorСтатус: выполнено, active path и legacy выровнены
Формула:
Где зафиксировано:
build_regression_pairspairwise_core.py~166predict_regression_by_chunks(anchor_target + deltas)pairwise_core.py~233–234_build_pair_features_numpy(left - anchors)pairwise_core.py~282pair_outputpairwise_model.py~60–63Удалено из тестов: старый
test_pair_outputс ожиданиемanchor - left(y2 - y1); заменён наtest_regression_pair_target_is_left_minus_anchor.4.
pair_target_semanticsв diagnosticsСтатус: выполнено
Добавлено:
_pair_target_semantics(task)pairwise_core.pytaskв_pair_diagnosticspairwise_core.pytask="classification"вbuild_classification_pairspairwise_core.pytask="regression"вbuild_regression_pairspairwise_core.py"pair_target_semantics"в return diagnosticspairwise_core.pyЦепочка до внешнего API:
Для classification:
{ "task": "classification", "same_label": 0, "different_label": 1, "target_type": "dissimilarity", "target_formula": "int(left_class != anchor_class)", "inference_output": "same_probability" }** Для regression:**
{ "task": "regression", "delta_sign": "left_minus_anchor", "target_formula": "target_left - target_anchor", "inference_reconstruction": "anchor_target + predicted_delta" }pair_diagnostics кладётся в PairwiseBatch.diagnostics на этапе построения пар,
источник pairwise_core.py.
В pairwise_model.py: в fit к batch‑диагностике добавляются runtime‑поля модели (diagnostics).
Опционально доработать: нет типизированного контракта диагностики, оставлены TODO для PairwiseBatch.diagnostics, _pair_diagnostics, и в обоих fit. Сейчас это dict.
Тесты:
test_pair_target_semantics_is_reported_in_diagnostics— core (test_pairwise_learning_core.py)test_pair_target_semantics_is_reported_in_diagnostics_classifier/_regressor— estimator (test_pdl.py,TestPDLDiagnostics)5. Модуль
pairwise_transform.pyвыведены в legacylegacy_pairwise_transform.pydeprecatedDeprecationWarningпри созданииPDCDataTransformerиSampleWeightstransformтеперь явно бросает NotImplementedError вместо падения на неинициализированномpreprocessing_fitпомечает объект как fitted через_legacy_fit_complete_fitпри отсутствии preprocessing_y_ (getattr)import warningsиimport sklearn.metrics(раньше SampleWeights ссылался на неимпортированный модуль)test_pdl_transform.pylegacy_pairwise_transformtransform; добавленtest_transform_raises_not_implementedpytest.warns(DeprecationWarning, ...)6. Тесты на deterministic toy arrays
Статус: выполнено
tests/unit/core/models/test_pdl.pytest_regression_pair_target_is_left_minus_anchorTestPairwiseDifferenceEstimatorpair_output:[0, -2, 2, 0]test_classification_pair_target_semantics_same_is_zero_current_contractTestPairwiseDifferenceEstimatorpair_output_difference:[0, 0, 1]test_pair_output_differenceTestPairwiseDifferenceEstimatortest_predict_same_probability_uses_same_label_columnTestPDLContractspredict_probatest_predict_same_probability_falls_back_to_hard_predictionsTestPDLContractspredictбезpredict_probatest_pair_target_semantics_is_reported_in_diagnostics_classifierTestPDLDiagnosticsClassifier.fittest_pair_target_semantics_is_reported_in_diagnostics_regressorTestPDLDiagnosticsRegressor.fitЗаглушки
_PairProbaStub,_HardLabelStubвместоMagicMock.tests/unit/core/models/test_pairwise_learning_core.pytest_classification_pair_target_semantics_same_is_zero_current_contractbuild_classification_pairs→[0, 0, 1]test_pair_target_semantics_is_reported_in_diagnosticsbatch.diagnosticsclf + regtest_predict_same_probability_uses_same_label_column_predict_same_probabilityна уровне coretest_regression_pair_target_uses_left_minus_anchor_sign_conventionОпционально следовало бы когда-нибудь сделать:
classification_data/regression_data используют np.random.rand без фиксированного сидирования numpy (сид есть только в train_test_split)
для воспроизводимости где-нибудь в фикстурах зафиксировать.
8. Импорты
«Добавить недостающие imports».
import warnings присутствует (legacy_pairwise_transform.py:12) это был исходный баг из Issue 2 (использование warnings.catch_warnings() без импорта).