snowflake-ml-python 1.3.1__py3-none-any.whl → 1.4.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- snowflake/ml/_internal/env_utils.py +11 -1
- snowflake/ml/_internal/human_readable_id/adjectives.txt +128 -0
- snowflake/ml/_internal/human_readable_id/animals.txt +128 -0
- snowflake/ml/_internal/human_readable_id/hrid_generator.py +40 -0
- snowflake/ml/_internal/human_readable_id/hrid_generator_base.py +135 -0
- snowflake/ml/_internal/utils/formatting.py +1 -1
- snowflake/ml/_internal/utils/identifier.py +3 -1
- snowflake/ml/_internal/utils/sql_identifier.py +2 -6
- snowflake/ml/feature_store/feature_store.py +166 -184
- snowflake/ml/feature_store/feature_view.py +12 -24
- snowflake/ml/fileset/sfcfs.py +56 -50
- snowflake/ml/fileset/stage_fs.py +48 -13
- snowflake/ml/model/_client/model/model_version_impl.py +6 -49
- snowflake/ml/model/_client/ops/model_ops.py +78 -29
- snowflake/ml/model/_client/sql/model.py +23 -2
- snowflake/ml/model/_client/sql/model_version.py +22 -1
- snowflake/ml/model/_deploy_client/image_builds/server_image_builder.py +1 -3
- snowflake/ml/model/_deploy_client/snowservice/deploy.py +5 -2
- snowflake/ml/model/_model_composer/model_composer.py +7 -5
- snowflake/ml/model/_model_composer/model_manifest/model_manifest.py +19 -54
- snowflake/ml/model/_model_composer/model_manifest/model_manifest_schema.py +8 -1
- snowflake/ml/model/_model_composer/model_method/infer_table_function.py_template +1 -1
- snowflake/ml/model/_model_composer/model_method/model_method.py +6 -10
- snowflake/ml/model/_packager/model_handlers/catboost.py +206 -0
- snowflake/ml/model/_packager/model_handlers/lightgbm.py +218 -0
- snowflake/ml/model/_packager/model_handlers/sklearn.py +3 -0
- snowflake/ml/model/_packager/model_handlers/snowmlmodel.py +13 -1
- snowflake/ml/model/_packager/model_handlers/xgboost.py +1 -1
- snowflake/ml/model/_packager/model_meta/_core_requirements.py +1 -1
- snowflake/ml/model/_packager/model_meta/model_meta.py +36 -6
- snowflake/ml/model/_packager/model_meta/model_meta_schema.py +20 -1
- snowflake/ml/model/_packager/model_meta_migrator/migrator_plans.py +3 -1
- snowflake/ml/model/_packager/model_packager.py +2 -2
- snowflake/ml/model/{_model_composer/model_runtime/_runtime_requirements.py → _packager/model_runtime/_snowml_inference_alternative_requirements.py} +1 -1
- snowflake/ml/model/_packager/model_runtime/model_runtime.py +137 -0
- snowflake/ml/model/custom_model.py +3 -1
- snowflake/ml/model/type_hints.py +21 -2
- snowflake/ml/modeling/_internal/estimator_utils.py +16 -11
- snowflake/ml/modeling/_internal/local_implementations/pandas_handlers.py +4 -1
- snowflake/ml/modeling/_internal/model_specifications.py +3 -1
- snowflake/ml/modeling/_internal/snowpark_implementations/distributed_hpo_trainer.py +545 -0
- snowflake/ml/modeling/_internal/snowpark_implementations/snowpark_handlers.py +8 -5
- snowflake/ml/modeling/calibration/calibrated_classifier_cv.py +195 -123
- snowflake/ml/modeling/cluster/affinity_propagation.py +195 -123
- snowflake/ml/modeling/cluster/agglomerative_clustering.py +195 -123
- snowflake/ml/modeling/cluster/birch.py +195 -123
- snowflake/ml/modeling/cluster/bisecting_k_means.py +195 -123
- snowflake/ml/modeling/cluster/dbscan.py +195 -123
- snowflake/ml/modeling/cluster/feature_agglomeration.py +195 -123
- snowflake/ml/modeling/cluster/k_means.py +195 -123
- snowflake/ml/modeling/cluster/mean_shift.py +195 -123
- snowflake/ml/modeling/cluster/mini_batch_k_means.py +195 -123
- snowflake/ml/modeling/cluster/optics.py +195 -123
- snowflake/ml/modeling/cluster/spectral_biclustering.py +195 -123
- snowflake/ml/modeling/cluster/spectral_clustering.py +195 -123
- snowflake/ml/modeling/cluster/spectral_coclustering.py +195 -123
- snowflake/ml/modeling/compose/column_transformer.py +195 -123
- snowflake/ml/modeling/compose/transformed_target_regressor.py +195 -123
- snowflake/ml/modeling/covariance/elliptic_envelope.py +195 -123
- snowflake/ml/modeling/covariance/empirical_covariance.py +195 -123
- snowflake/ml/modeling/covariance/graphical_lasso.py +195 -123
- snowflake/ml/modeling/covariance/graphical_lasso_cv.py +195 -123
- snowflake/ml/modeling/covariance/ledoit_wolf.py +195 -123
- snowflake/ml/modeling/covariance/min_cov_det.py +195 -123
- snowflake/ml/modeling/covariance/oas.py +195 -123
- snowflake/ml/modeling/covariance/shrunk_covariance.py +195 -123
- snowflake/ml/modeling/decomposition/dictionary_learning.py +195 -123
- snowflake/ml/modeling/decomposition/factor_analysis.py +195 -123
- snowflake/ml/modeling/decomposition/fast_ica.py +195 -123
- snowflake/ml/modeling/decomposition/incremental_pca.py +195 -123
- snowflake/ml/modeling/decomposition/kernel_pca.py +195 -123
- snowflake/ml/modeling/decomposition/mini_batch_dictionary_learning.py +195 -123
- snowflake/ml/modeling/decomposition/mini_batch_sparse_pca.py +195 -123
- snowflake/ml/modeling/decomposition/pca.py +195 -123
- snowflake/ml/modeling/decomposition/sparse_pca.py +195 -123
- snowflake/ml/modeling/decomposition/truncated_svd.py +195 -123
- snowflake/ml/modeling/discriminant_analysis/linear_discriminant_analysis.py +195 -123
- snowflake/ml/modeling/discriminant_analysis/quadratic_discriminant_analysis.py +195 -123
- snowflake/ml/modeling/ensemble/ada_boost_classifier.py +195 -123
- snowflake/ml/modeling/ensemble/ada_boost_regressor.py +195 -123
- snowflake/ml/modeling/ensemble/bagging_classifier.py +195 -123
- snowflake/ml/modeling/ensemble/bagging_regressor.py +195 -123
- snowflake/ml/modeling/ensemble/extra_trees_classifier.py +195 -123
- snowflake/ml/modeling/ensemble/extra_trees_regressor.py +195 -123
- snowflake/ml/modeling/ensemble/gradient_boosting_classifier.py +195 -123
- snowflake/ml/modeling/ensemble/gradient_boosting_regressor.py +195 -123
- snowflake/ml/modeling/ensemble/hist_gradient_boosting_classifier.py +195 -123
- snowflake/ml/modeling/ensemble/hist_gradient_boosting_regressor.py +195 -123
- snowflake/ml/modeling/ensemble/isolation_forest.py +195 -123
- snowflake/ml/modeling/ensemble/random_forest_classifier.py +195 -123
- snowflake/ml/modeling/ensemble/random_forest_regressor.py +195 -123
- snowflake/ml/modeling/ensemble/stacking_regressor.py +195 -123
- snowflake/ml/modeling/ensemble/voting_classifier.py +195 -123
- snowflake/ml/modeling/ensemble/voting_regressor.py +195 -123
- snowflake/ml/modeling/feature_selection/generic_univariate_select.py +195 -123
- snowflake/ml/modeling/feature_selection/select_fdr.py +195 -123
- snowflake/ml/modeling/feature_selection/select_fpr.py +195 -123
- snowflake/ml/modeling/feature_selection/select_fwe.py +195 -123
- snowflake/ml/modeling/feature_selection/select_k_best.py +195 -123
- snowflake/ml/modeling/feature_selection/select_percentile.py +195 -123
- snowflake/ml/modeling/feature_selection/sequential_feature_selector.py +195 -123
- snowflake/ml/modeling/feature_selection/variance_threshold.py +195 -123
- snowflake/ml/modeling/framework/_utils.py +8 -1
- snowflake/ml/modeling/framework/base.py +24 -6
- snowflake/ml/modeling/gaussian_process/gaussian_process_classifier.py +195 -123
- snowflake/ml/modeling/gaussian_process/gaussian_process_regressor.py +195 -123
- snowflake/ml/modeling/impute/iterative_imputer.py +195 -123
- snowflake/ml/modeling/impute/knn_imputer.py +195 -123
- snowflake/ml/modeling/impute/missing_indicator.py +195 -123
- snowflake/ml/modeling/impute/simple_imputer.py +4 -15
- snowflake/ml/modeling/kernel_approximation/additive_chi2_sampler.py +195 -123
- snowflake/ml/modeling/kernel_approximation/nystroem.py +195 -123
- snowflake/ml/modeling/kernel_approximation/polynomial_count_sketch.py +195 -123
- snowflake/ml/modeling/kernel_approximation/rbf_sampler.py +195 -123
- snowflake/ml/modeling/kernel_approximation/skewed_chi2_sampler.py +195 -123
- snowflake/ml/modeling/kernel_ridge/kernel_ridge.py +195 -123
- snowflake/ml/modeling/lightgbm/lgbm_classifier.py +198 -125
- snowflake/ml/modeling/lightgbm/lgbm_regressor.py +198 -125
- snowflake/ml/modeling/linear_model/ard_regression.py +195 -123
- snowflake/ml/modeling/linear_model/bayesian_ridge.py +195 -123
- snowflake/ml/modeling/linear_model/elastic_net.py +195 -123
- snowflake/ml/modeling/linear_model/elastic_net_cv.py +195 -123
- snowflake/ml/modeling/linear_model/gamma_regressor.py +195 -123
- snowflake/ml/modeling/linear_model/huber_regressor.py +195 -123
- snowflake/ml/modeling/linear_model/lars.py +195 -123
- snowflake/ml/modeling/linear_model/lars_cv.py +195 -123
- snowflake/ml/modeling/linear_model/lasso.py +195 -123
- snowflake/ml/modeling/linear_model/lasso_cv.py +195 -123
- snowflake/ml/modeling/linear_model/lasso_lars.py +195 -123
- snowflake/ml/modeling/linear_model/lasso_lars_cv.py +195 -123
- snowflake/ml/modeling/linear_model/lasso_lars_ic.py +195 -123
- snowflake/ml/modeling/linear_model/linear_regression.py +195 -123
- snowflake/ml/modeling/linear_model/logistic_regression.py +195 -123
- snowflake/ml/modeling/linear_model/logistic_regression_cv.py +195 -123
- snowflake/ml/modeling/linear_model/multi_task_elastic_net.py +195 -123
- snowflake/ml/modeling/linear_model/multi_task_elastic_net_cv.py +195 -123
- snowflake/ml/modeling/linear_model/multi_task_lasso.py +195 -123
- snowflake/ml/modeling/linear_model/multi_task_lasso_cv.py +195 -123
- snowflake/ml/modeling/linear_model/orthogonal_matching_pursuit.py +195 -123
- snowflake/ml/modeling/linear_model/passive_aggressive_classifier.py +195 -123
- snowflake/ml/modeling/linear_model/passive_aggressive_regressor.py +195 -123
- snowflake/ml/modeling/linear_model/perceptron.py +195 -123
- snowflake/ml/modeling/linear_model/poisson_regressor.py +195 -123
- snowflake/ml/modeling/linear_model/ransac_regressor.py +195 -123
- snowflake/ml/modeling/linear_model/ridge.py +195 -123
- snowflake/ml/modeling/linear_model/ridge_classifier.py +195 -123
- snowflake/ml/modeling/linear_model/ridge_classifier_cv.py +195 -123
- snowflake/ml/modeling/linear_model/ridge_cv.py +195 -123
- snowflake/ml/modeling/linear_model/sgd_classifier.py +195 -123
- snowflake/ml/modeling/linear_model/sgd_one_class_svm.py +195 -123
- snowflake/ml/modeling/linear_model/sgd_regressor.py +195 -123
- snowflake/ml/modeling/linear_model/theil_sen_regressor.py +195 -123
- snowflake/ml/modeling/linear_model/tweedie_regressor.py +195 -123
- snowflake/ml/modeling/manifold/isomap.py +195 -123
- snowflake/ml/modeling/manifold/mds.py +195 -123
- snowflake/ml/modeling/manifold/spectral_embedding.py +195 -123
- snowflake/ml/modeling/manifold/tsne.py +195 -123
- snowflake/ml/modeling/mixture/bayesian_gaussian_mixture.py +195 -123
- snowflake/ml/modeling/mixture/gaussian_mixture.py +195 -123
- snowflake/ml/modeling/model_selection/grid_search_cv.py +42 -18
- snowflake/ml/modeling/model_selection/randomized_search_cv.py +42 -18
- snowflake/ml/modeling/multiclass/one_vs_one_classifier.py +195 -123
- snowflake/ml/modeling/multiclass/one_vs_rest_classifier.py +195 -123
- snowflake/ml/modeling/multiclass/output_code_classifier.py +195 -123
- snowflake/ml/modeling/naive_bayes/bernoulli_nb.py +195 -123
- snowflake/ml/modeling/naive_bayes/categorical_nb.py +195 -123
- snowflake/ml/modeling/naive_bayes/complement_nb.py +195 -123
- snowflake/ml/modeling/naive_bayes/gaussian_nb.py +195 -123
- snowflake/ml/modeling/naive_bayes/multinomial_nb.py +195 -123
- snowflake/ml/modeling/neighbors/k_neighbors_classifier.py +195 -123
- snowflake/ml/modeling/neighbors/k_neighbors_regressor.py +195 -123
- snowflake/ml/modeling/neighbors/kernel_density.py +195 -123
- snowflake/ml/modeling/neighbors/local_outlier_factor.py +195 -123
- snowflake/ml/modeling/neighbors/nearest_centroid.py +195 -123
- snowflake/ml/modeling/neighbors/nearest_neighbors.py +195 -123
- snowflake/ml/modeling/neighbors/neighborhood_components_analysis.py +195 -123
- snowflake/ml/modeling/neighbors/radius_neighbors_classifier.py +195 -123
- snowflake/ml/modeling/neighbors/radius_neighbors_regressor.py +195 -123
- snowflake/ml/modeling/neural_network/bernoulli_rbm.py +195 -123
- snowflake/ml/modeling/neural_network/mlp_classifier.py +195 -123
- snowflake/ml/modeling/neural_network/mlp_regressor.py +195 -123
- snowflake/ml/modeling/pipeline/pipeline.py +4 -4
- snowflake/ml/modeling/preprocessing/binarizer.py +1 -5
- snowflake/ml/modeling/preprocessing/k_bins_discretizer.py +1 -5
- snowflake/ml/modeling/preprocessing/label_encoder.py +1 -5
- snowflake/ml/modeling/preprocessing/max_abs_scaler.py +1 -5
- snowflake/ml/modeling/preprocessing/min_max_scaler.py +10 -12
- snowflake/ml/modeling/preprocessing/normalizer.py +1 -5
- snowflake/ml/modeling/preprocessing/one_hot_encoder.py +1 -5
- snowflake/ml/modeling/preprocessing/ordinal_encoder.py +1 -5
- snowflake/ml/modeling/preprocessing/polynomial_features.py +195 -123
- snowflake/ml/modeling/preprocessing/robust_scaler.py +1 -5
- snowflake/ml/modeling/preprocessing/standard_scaler.py +11 -11
- snowflake/ml/modeling/semi_supervised/label_propagation.py +195 -123
- snowflake/ml/modeling/semi_supervised/label_spreading.py +195 -123
- snowflake/ml/modeling/svm/linear_svc.py +195 -123
- snowflake/ml/modeling/svm/linear_svr.py +195 -123
- snowflake/ml/modeling/svm/nu_svc.py +195 -123
- snowflake/ml/modeling/svm/nu_svr.py +195 -123
- snowflake/ml/modeling/svm/svc.py +195 -123
- snowflake/ml/modeling/svm/svr.py +195 -123
- snowflake/ml/modeling/tree/decision_tree_classifier.py +195 -123
- snowflake/ml/modeling/tree/decision_tree_regressor.py +195 -123
- snowflake/ml/modeling/tree/extra_tree_classifier.py +195 -123
- snowflake/ml/modeling/tree/extra_tree_regressor.py +195 -123
- snowflake/ml/modeling/xgboost/xgb_classifier.py +195 -123
- snowflake/ml/modeling/xgboost/xgb_regressor.py +195 -123
- snowflake/ml/modeling/xgboost/xgbrf_classifier.py +195 -123
- snowflake/ml/modeling/xgboost/xgbrf_regressor.py +195 -123
- snowflake/ml/registry/_manager/model_manager.py +5 -1
- snowflake/ml/registry/model_registry.py +99 -26
- snowflake/ml/registry/registry.py +3 -2
- snowflake/ml/version.py +1 -1
- {snowflake_ml_python-1.3.1.dist-info → snowflake_ml_python-1.4.1.dist-info}/METADATA +94 -55
- {snowflake_ml_python-1.3.1.dist-info → snowflake_ml_python-1.4.1.dist-info}/RECORD +218 -212
- snowflake/ml/model/_model_composer/model_runtime/model_runtime.py +0 -97
- {snowflake_ml_python-1.3.1.dist-info → snowflake_ml_python-1.4.1.dist-info}/LICENSE.txt +0 -0
- {snowflake_ml_python-1.3.1.dist-info → snowflake_ml_python-1.4.1.dist-info}/WHEEL +0 -0
- {snowflake_ml_python-1.3.1.dist-info → snowflake_ml_python-1.4.1.dist-info}/top_level.txt +0 -0
@@ -33,6 +33,15 @@ from snowflake.ml.modeling._internal.transformer_protocols import (
|
|
33
33
|
BatchInferenceKwargsTypedDict,
|
34
34
|
ScoreKwargsTypedDict
|
35
35
|
)
|
36
|
+
from snowflake.ml.model._signatures import utils as model_signature_utils
|
37
|
+
from snowflake.ml.model.model_signature import (
|
38
|
+
BaseFeatureSpec,
|
39
|
+
DataType,
|
40
|
+
FeatureSpec,
|
41
|
+
ModelSignature,
|
42
|
+
_infer_signature,
|
43
|
+
_rename_signature_with_snowflake_identifiers,
|
44
|
+
)
|
36
45
|
|
37
46
|
from snowflake.ml.modeling._internal.model_transformer_builder import ModelTransformerBuilder
|
38
47
|
|
@@ -43,16 +52,6 @@ from snowflake.ml.modeling._internal.estimator_utils import (
|
|
43
52
|
validate_sklearn_args,
|
44
53
|
)
|
45
54
|
|
46
|
-
from snowflake.ml.model.model_signature import (
|
47
|
-
DataType,
|
48
|
-
FeatureSpec,
|
49
|
-
ModelSignature,
|
50
|
-
_infer_signature,
|
51
|
-
_rename_signature_with_snowflake_identifiers,
|
52
|
-
BaseFeatureSpec,
|
53
|
-
)
|
54
|
-
from snowflake.ml.model._signatures import utils as model_signature_utils
|
55
|
-
|
56
55
|
_PROJECT = "ModelDevelopment"
|
57
56
|
# Derive subproject from module name by removing "sklearn"
|
58
57
|
# and converting module name from underscore to CamelCase
|
@@ -314,12 +313,7 @@ class DictionaryLearning(BaseTransformer):
|
|
314
313
|
)
|
315
314
|
return selected_cols
|
316
315
|
|
317
|
-
|
318
|
-
project=_PROJECT,
|
319
|
-
subproject=_SUBPROJECT,
|
320
|
-
custom_tags=dict([("autogen", True)]),
|
321
|
-
)
|
322
|
-
def fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "DictionaryLearning":
|
316
|
+
def _fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "DictionaryLearning":
|
323
317
|
"""Fit the model from data in X
|
324
318
|
For more details on this function, see [sklearn.decomposition.DictionaryLearning.fit]
|
325
319
|
(https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.DictionaryLearning.html#sklearn.decomposition.DictionaryLearning.fit)
|
@@ -346,12 +340,14 @@ class DictionaryLearning(BaseTransformer):
|
|
346
340
|
|
347
341
|
self._snowpark_cols = dataset.select(self.input_cols).columns
|
348
342
|
|
349
|
-
|
343
|
+
# If we are already in a stored procedure, no need to kick off another one.
|
350
344
|
if SNOWML_SPROC_ENV in os.environ:
|
351
345
|
statement_params = telemetry.get_function_usage_statement_params(
|
352
346
|
project=_PROJECT,
|
353
347
|
subproject=_SUBPROJECT,
|
354
|
-
function_name=telemetry.get_statement_params_full_func_name(
|
348
|
+
function_name=telemetry.get_statement_params_full_func_name(
|
349
|
+
inspect.currentframe(), DictionaryLearning.__class__.__name__
|
350
|
+
),
|
355
351
|
api_calls=[Session.call],
|
356
352
|
custom_tags=dict([("autogen", True)]) if self._autogenerated else None,
|
357
353
|
)
|
@@ -372,7 +368,7 @@ class DictionaryLearning(BaseTransformer):
|
|
372
368
|
)
|
373
369
|
self._sklearn_object = model_trainer.train()
|
374
370
|
self._is_fitted = True
|
375
|
-
self.
|
371
|
+
self._generate_model_signatures(dataset)
|
376
372
|
return self
|
377
373
|
|
378
374
|
def _batch_inference_validate_snowpark(
|
@@ -446,7 +442,9 @@ class DictionaryLearning(BaseTransformer):
|
|
446
442
|
# when it is classifier, infer the datatype from label columns
|
447
443
|
if expected_type_inferred == "" and 'predict' in self.model_signatures:
|
448
444
|
# Batch inference takes a single expected output column type. Use the first columns type for now.
|
449
|
-
label_cols_signatures = [
|
445
|
+
label_cols_signatures = [
|
446
|
+
row for row in self.model_signatures['predict'].outputs if row.name in self.output_cols
|
447
|
+
]
|
450
448
|
if len(label_cols_signatures) == 0:
|
451
449
|
error_str = f"Output columns {self.output_cols} do not match model signatures {self.model_signatures['predict'].outputs}."
|
452
450
|
raise exceptions.SnowflakeMLException(
|
@@ -454,25 +452,22 @@ class DictionaryLearning(BaseTransformer):
|
|
454
452
|
original_exception=ValueError(error_str),
|
455
453
|
)
|
456
454
|
|
457
|
-
expected_type_inferred = convert_sp_to_sf_type(
|
458
|
-
label_cols_signatures[0].as_snowpark_type()
|
459
|
-
)
|
455
|
+
expected_type_inferred = convert_sp_to_sf_type(label_cols_signatures[0].as_snowpark_type())
|
460
456
|
|
461
457
|
self._deps = self._batch_inference_validate_snowpark(dataset=dataset, inference_method=inference_method)
|
462
|
-
assert isinstance(
|
458
|
+
assert isinstance(
|
459
|
+
dataset._session, Session
|
460
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
463
461
|
|
464
462
|
transform_kwargs = dict(
|
465
|
-
session
|
466
|
-
dependencies
|
467
|
-
drop_input_cols
|
468
|
-
expected_output_cols_type
|
463
|
+
session=dataset._session,
|
464
|
+
dependencies=self._deps,
|
465
|
+
drop_input_cols=self._drop_input_cols,
|
466
|
+
expected_output_cols_type=expected_type_inferred,
|
469
467
|
)
|
470
468
|
|
471
469
|
elif isinstance(dataset, pd.DataFrame):
|
472
|
-
transform_kwargs = dict(
|
473
|
-
snowpark_input_cols = self._snowpark_cols,
|
474
|
-
drop_input_cols = self._drop_input_cols
|
475
|
-
)
|
470
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
476
471
|
|
477
472
|
transform_handlers = ModelTransformerBuilder.build(
|
478
473
|
dataset=dataset,
|
@@ -514,7 +509,7 @@ class DictionaryLearning(BaseTransformer):
|
|
514
509
|
Transformed dataset.
|
515
510
|
"""
|
516
511
|
super()._check_dataset_type(dataset)
|
517
|
-
inference_method="transform"
|
512
|
+
inference_method = "transform"
|
518
513
|
|
519
514
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
520
515
|
# are specific to the type of dataset used.
|
@@ -551,17 +546,14 @@ class DictionaryLearning(BaseTransformer):
|
|
551
546
|
assert isinstance(dataset._session, Session) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
552
547
|
|
553
548
|
transform_kwargs = dict(
|
554
|
-
session
|
555
|
-
dependencies
|
556
|
-
drop_input_cols
|
557
|
-
expected_output_cols_type
|
549
|
+
session=dataset._session,
|
550
|
+
dependencies=self._deps,
|
551
|
+
drop_input_cols=self._drop_input_cols,
|
552
|
+
expected_output_cols_type=expected_dtype,
|
558
553
|
)
|
559
554
|
|
560
555
|
elif isinstance(dataset, pd.DataFrame):
|
561
|
-
transform_kwargs = dict(
|
562
|
-
snowpark_input_cols = self._snowpark_cols,
|
563
|
-
drop_input_cols = self._drop_input_cols
|
564
|
-
)
|
556
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
565
557
|
|
566
558
|
transform_handlers = ModelTransformerBuilder.build(
|
567
559
|
dataset=dataset,
|
@@ -580,7 +572,11 @@ class DictionaryLearning(BaseTransformer):
|
|
580
572
|
return output_df
|
581
573
|
|
582
574
|
@available_if(original_estimator_has_callable("fit_predict")) # type: ignore[misc]
|
583
|
-
def fit_predict(
|
575
|
+
def fit_predict(
|
576
|
+
self,
|
577
|
+
dataset: Union[DataFrame, pd.DataFrame],
|
578
|
+
output_cols_prefix: str = "fit_predict_",
|
579
|
+
) -> Union[DataFrame, pd.DataFrame]:
|
584
580
|
""" Method not supported for this class.
|
585
581
|
|
586
582
|
|
@@ -605,7 +601,9 @@ class DictionaryLearning(BaseTransformer):
|
|
605
601
|
)
|
606
602
|
output_result, fitted_estimator = model_trainer.train_fit_predict(
|
607
603
|
drop_input_cols=self._drop_input_cols,
|
608
|
-
expected_output_cols_list=
|
604
|
+
expected_output_cols_list=(
|
605
|
+
self.output_cols if self.output_cols else self._get_output_column_names(output_cols_prefix)
|
606
|
+
),
|
609
607
|
)
|
610
608
|
self._sklearn_object = fitted_estimator
|
611
609
|
self._is_fitted = True
|
@@ -622,6 +620,62 @@ class DictionaryLearning(BaseTransformer):
|
|
622
620
|
assert self._sklearn_object is not None
|
623
621
|
return self._sklearn_object.embedding_
|
624
622
|
|
623
|
+
|
624
|
+
def _get_output_column_names(self, output_cols_prefix: str, output_cols: Optional[List[str]] = None) -> List[str]:
|
625
|
+
""" Returns the list of output columns for predict_proba(), decision_function(), etc.. functions.
|
626
|
+
Returns a list with output_cols_prefix as the only element if the estimator is not a classifier.
|
627
|
+
"""
|
628
|
+
output_cols_prefix = identifier.resolve_identifier(output_cols_prefix)
|
629
|
+
# The following condition is introduced for kneighbors methods, and not used in other methods
|
630
|
+
if output_cols:
|
631
|
+
output_cols = [
|
632
|
+
identifier.concat_names([output_cols_prefix, identifier.resolve_identifier(c)])
|
633
|
+
for c in output_cols
|
634
|
+
]
|
635
|
+
elif getattr(self._sklearn_object, "classes_", None) is None:
|
636
|
+
output_cols = [output_cols_prefix]
|
637
|
+
elif self._sklearn_object is not None:
|
638
|
+
classes = self._sklearn_object.classes_
|
639
|
+
if isinstance(classes, numpy.ndarray):
|
640
|
+
output_cols = [f'{output_cols_prefix}{str(c)}' for c in classes.tolist()]
|
641
|
+
elif isinstance(classes, list) and len(classes) > 0 and isinstance(classes[0], numpy.ndarray):
|
642
|
+
# If the estimator is a multioutput estimator, classes_ will be a list of ndarrays.
|
643
|
+
output_cols = []
|
644
|
+
for i, cl in enumerate(classes):
|
645
|
+
# For binary classification, there is only one output column for each class
|
646
|
+
# ndarray as the two classes are complementary.
|
647
|
+
if len(cl) == 2:
|
648
|
+
output_cols.append(f'{output_cols_prefix}{i}_{cl[0]}')
|
649
|
+
else:
|
650
|
+
output_cols.extend([
|
651
|
+
f'{output_cols_prefix}{i}_{c}' for c in cl.tolist()
|
652
|
+
])
|
653
|
+
else:
|
654
|
+
output_cols = []
|
655
|
+
|
656
|
+
# Make sure column names are valid snowflake identifiers.
|
657
|
+
assert output_cols is not None # Make MyPy happy
|
658
|
+
rv = [identifier.rename_to_valid_snowflake_identifier(c) for c in output_cols]
|
659
|
+
|
660
|
+
return rv
|
661
|
+
|
662
|
+
def _align_expected_output_names(
|
663
|
+
self, method: str, dataset: DataFrame, expected_output_cols_list: List[str], output_cols_prefix: str
|
664
|
+
) -> List[str]:
|
665
|
+
# in case the inferred output column names dimension is different
|
666
|
+
# we use one line of snowpark dataframe and put it into sklearn estimator using pandas
|
667
|
+
output_df_pd = getattr(self, method)(dataset.limit(1).to_pandas(), output_cols_prefix)
|
668
|
+
output_df_columns = list(output_df_pd.columns)
|
669
|
+
output_df_columns_set: Set[str] = set(output_df_columns) - set(dataset.columns)
|
670
|
+
if self.sample_weight_col:
|
671
|
+
output_df_columns_set -= set(self.sample_weight_col)
|
672
|
+
# if the dimension of inferred output column names is correct; use it
|
673
|
+
if len(expected_output_cols_list) == len(output_df_columns_set):
|
674
|
+
return expected_output_cols_list
|
675
|
+
# otherwise, use the sklearn estimator's output
|
676
|
+
else:
|
677
|
+
return sorted(list(output_df_columns_set), key=lambda x: output_df_columns.index(x))
|
678
|
+
|
625
679
|
@available_if(original_estimator_has_callable("predict_proba")) # type: ignore[misc]
|
626
680
|
@telemetry.send_api_usage_telemetry(
|
627
681
|
project=_PROJECT,
|
@@ -652,24 +706,28 @@ class DictionaryLearning(BaseTransformer):
|
|
652
706
|
# are specific to the type of dataset used.
|
653
707
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
654
708
|
|
709
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
710
|
+
|
655
711
|
if isinstance(dataset, DataFrame):
|
656
712
|
self._deps = self._batch_inference_validate_snowpark(
|
657
713
|
dataset=dataset,
|
658
714
|
inference_method=inference_method,
|
659
715
|
)
|
660
|
-
assert isinstance(
|
716
|
+
assert isinstance(
|
717
|
+
dataset._session, Session
|
718
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
661
719
|
transform_kwargs = dict(
|
662
720
|
session=dataset._session,
|
663
721
|
dependencies=self._deps,
|
664
|
-
drop_input_cols
|
722
|
+
drop_input_cols=self._drop_input_cols,
|
665
723
|
expected_output_cols_type="float",
|
666
724
|
)
|
725
|
+
expected_output_cols = self._align_expected_output_names(
|
726
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
727
|
+
)
|
667
728
|
|
668
729
|
elif isinstance(dataset, pd.DataFrame):
|
669
|
-
transform_kwargs = dict(
|
670
|
-
snowpark_input_cols = self._snowpark_cols,
|
671
|
-
drop_input_cols = self._drop_input_cols
|
672
|
-
)
|
730
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
673
731
|
|
674
732
|
transform_handlers = ModelTransformerBuilder.build(
|
675
733
|
dataset=dataset,
|
@@ -681,7 +739,7 @@ class DictionaryLearning(BaseTransformer):
|
|
681
739
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
682
740
|
inference_method=inference_method,
|
683
741
|
input_cols=self.input_cols,
|
684
|
-
expected_output_cols=
|
742
|
+
expected_output_cols=expected_output_cols,
|
685
743
|
**transform_kwargs
|
686
744
|
)
|
687
745
|
return output_df
|
@@ -711,7 +769,8 @@ class DictionaryLearning(BaseTransformer):
|
|
711
769
|
Output dataset with log probability of the sample for each class in the model.
|
712
770
|
"""
|
713
771
|
super()._check_dataset_type(dataset)
|
714
|
-
inference_method="predict_log_proba"
|
772
|
+
inference_method = "predict_log_proba"
|
773
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
715
774
|
|
716
775
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
717
776
|
# are specific to the type of dataset used.
|
@@ -722,18 +781,20 @@ class DictionaryLearning(BaseTransformer):
|
|
722
781
|
dataset=dataset,
|
723
782
|
inference_method=inference_method,
|
724
783
|
)
|
725
|
-
assert isinstance(
|
784
|
+
assert isinstance(
|
785
|
+
dataset._session, Session
|
786
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
726
787
|
transform_kwargs = dict(
|
727
788
|
session=dataset._session,
|
728
789
|
dependencies=self._deps,
|
729
|
-
drop_input_cols
|
790
|
+
drop_input_cols=self._drop_input_cols,
|
730
791
|
expected_output_cols_type="float",
|
731
792
|
)
|
793
|
+
expected_output_cols = self._align_expected_output_names(
|
794
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
795
|
+
)
|
732
796
|
elif isinstance(dataset, pd.DataFrame):
|
733
|
-
transform_kwargs = dict(
|
734
|
-
snowpark_input_cols = self._snowpark_cols,
|
735
|
-
drop_input_cols = self._drop_input_cols
|
736
|
-
)
|
797
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
737
798
|
|
738
799
|
transform_handlers = ModelTransformerBuilder.build(
|
739
800
|
dataset=dataset,
|
@@ -746,7 +807,7 @@ class DictionaryLearning(BaseTransformer):
|
|
746
807
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
747
808
|
inference_method=inference_method,
|
748
809
|
input_cols=self.input_cols,
|
749
|
-
expected_output_cols=
|
810
|
+
expected_output_cols=expected_output_cols,
|
750
811
|
**transform_kwargs
|
751
812
|
)
|
752
813
|
return output_df
|
@@ -772,30 +833,34 @@ class DictionaryLearning(BaseTransformer):
|
|
772
833
|
Output dataset with results of the decision function for the samples in input dataset.
|
773
834
|
"""
|
774
835
|
super()._check_dataset_type(dataset)
|
775
|
-
inference_method="decision_function"
|
836
|
+
inference_method = "decision_function"
|
776
837
|
|
777
838
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
778
839
|
# are specific to the type of dataset used.
|
779
840
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
780
841
|
|
842
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
843
|
+
|
781
844
|
if isinstance(dataset, DataFrame):
|
782
845
|
self._deps = self._batch_inference_validate_snowpark(
|
783
846
|
dataset=dataset,
|
784
847
|
inference_method=inference_method,
|
785
848
|
)
|
786
|
-
assert isinstance(
|
849
|
+
assert isinstance(
|
850
|
+
dataset._session, Session
|
851
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
787
852
|
transform_kwargs = dict(
|
788
853
|
session=dataset._session,
|
789
854
|
dependencies=self._deps,
|
790
|
-
drop_input_cols
|
855
|
+
drop_input_cols=self._drop_input_cols,
|
791
856
|
expected_output_cols_type="float",
|
792
857
|
)
|
858
|
+
expected_output_cols = self._align_expected_output_names(
|
859
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
860
|
+
)
|
793
861
|
|
794
862
|
elif isinstance(dataset, pd.DataFrame):
|
795
|
-
transform_kwargs = dict(
|
796
|
-
snowpark_input_cols = self._snowpark_cols,
|
797
|
-
drop_input_cols = self._drop_input_cols
|
798
|
-
)
|
863
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
799
864
|
|
800
865
|
transform_handlers = ModelTransformerBuilder.build(
|
801
866
|
dataset=dataset,
|
@@ -808,7 +873,7 @@ class DictionaryLearning(BaseTransformer):
|
|
808
873
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
809
874
|
inference_method=inference_method,
|
810
875
|
input_cols=self.input_cols,
|
811
|
-
expected_output_cols=
|
876
|
+
expected_output_cols=expected_output_cols,
|
812
877
|
**transform_kwargs
|
813
878
|
)
|
814
879
|
return output_df
|
@@ -837,12 +902,14 @@ class DictionaryLearning(BaseTransformer):
|
|
837
902
|
Output dataset with probability of the sample for each class in the model.
|
838
903
|
"""
|
839
904
|
super()._check_dataset_type(dataset)
|
840
|
-
inference_method="score_samples"
|
905
|
+
inference_method = "score_samples"
|
841
906
|
|
842
907
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
843
908
|
# are specific to the type of dataset used.
|
844
909
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
845
910
|
|
911
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
912
|
+
|
846
913
|
if isinstance(dataset, DataFrame):
|
847
914
|
self._deps = self._batch_inference_validate_snowpark(
|
848
915
|
dataset=dataset,
|
@@ -855,6 +922,9 @@ class DictionaryLearning(BaseTransformer):
|
|
855
922
|
drop_input_cols = self._drop_input_cols,
|
856
923
|
expected_output_cols_type="float",
|
857
924
|
)
|
925
|
+
expected_output_cols = self._align_expected_output_names(
|
926
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
927
|
+
)
|
858
928
|
|
859
929
|
elif isinstance(dataset, pd.DataFrame):
|
860
930
|
transform_kwargs = dict(
|
@@ -873,7 +943,7 @@ class DictionaryLearning(BaseTransformer):
|
|
873
943
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
874
944
|
inference_method=inference_method,
|
875
945
|
input_cols=self.input_cols,
|
876
|
-
expected_output_cols=
|
946
|
+
expected_output_cols=expected_output_cols,
|
877
947
|
**transform_kwargs
|
878
948
|
)
|
879
949
|
return output_df
|
@@ -1018,50 +1088,84 @@ class DictionaryLearning(BaseTransformer):
|
|
1018
1088
|
)
|
1019
1089
|
return output_df
|
1020
1090
|
|
1091
|
+
|
1092
|
+
|
1093
|
+
def to_sklearn(self) -> Any:
|
1094
|
+
"""Get sklearn.decomposition.DictionaryLearning object.
|
1095
|
+
"""
|
1096
|
+
if self._sklearn_object is None:
|
1097
|
+
self._sklearn_object = self._create_sklearn_object()
|
1098
|
+
return self._sklearn_object
|
1099
|
+
|
1100
|
+
def to_xgboost(self) -> Any:
|
1101
|
+
raise exceptions.SnowflakeMLException(
|
1102
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1103
|
+
original_exception=AttributeError(
|
1104
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1105
|
+
"to_xgboost()",
|
1106
|
+
"to_sklearn()"
|
1107
|
+
)
|
1108
|
+
),
|
1109
|
+
)
|
1110
|
+
|
1111
|
+
def to_lightgbm(self) -> Any:
|
1112
|
+
raise exceptions.SnowflakeMLException(
|
1113
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1114
|
+
original_exception=AttributeError(
|
1115
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1116
|
+
"to_lightgbm()",
|
1117
|
+
"to_sklearn()"
|
1118
|
+
)
|
1119
|
+
),
|
1120
|
+
)
|
1021
1121
|
|
1022
|
-
def
|
1122
|
+
def _get_dependencies(self) -> List[str]:
|
1123
|
+
return self._deps
|
1124
|
+
|
1125
|
+
|
1126
|
+
def _generate_model_signatures(self, dataset: Union[DataFrame, pd.DataFrame]) -> None:
|
1023
1127
|
self._model_signature_dict = dict()
|
1024
1128
|
|
1025
1129
|
PROB_FUNCTIONS = ["predict_log_proba", "predict_proba", "decision_function"]
|
1026
1130
|
|
1027
|
-
inputs = list(_infer_signature(dataset[self.input_cols], "input"))
|
1131
|
+
inputs = list(_infer_signature(dataset[self.input_cols], "input", use_snowflake_identifiers=True))
|
1028
1132
|
outputs: List[BaseFeatureSpec] = []
|
1029
1133
|
if hasattr(self, "predict"):
|
1030
1134
|
# keep mypy happy
|
1031
|
-
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
1135
|
+
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
1032
1136
|
# For classifier, the type of predict is the same as the type of label
|
1033
|
-
if self._sklearn_object._estimator_type ==
|
1034
|
-
|
1137
|
+
if self._sklearn_object._estimator_type == "classifier":
|
1138
|
+
# label columns is the desired type for output
|
1035
1139
|
outputs = list(_infer_signature(dataset[self.label_cols], "output", use_snowflake_identifiers=True))
|
1036
1140
|
# rename the output columns
|
1037
1141
|
outputs = list(model_signature_utils.rename_features(outputs, self.output_cols))
|
1038
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
1039
|
-
|
1040
|
-
|
1142
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1143
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1144
|
+
)
|
1041
1145
|
# For mixture models that use the density mixin, `predict` returns the argmax of the log prob.
|
1042
1146
|
# For outlier models, returns -1 for outliers and 1 for inliers.
|
1043
|
-
# Clusterer returns int64 cluster labels.
|
1147
|
+
# Clusterer returns int64 cluster labels.
|
1044
1148
|
elif self._sklearn_object._estimator_type in ["DensityEstimator", "clusterer", "outlier_detector"]:
|
1045
1149
|
outputs = [FeatureSpec(dtype=DataType.INT64, name=c) for c in self.output_cols]
|
1046
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
1047
|
-
|
1048
|
-
|
1049
|
-
|
1150
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1151
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1152
|
+
)
|
1153
|
+
|
1050
1154
|
# For regressor, the type of predict is float64
|
1051
|
-
elif self._sklearn_object._estimator_type ==
|
1155
|
+
elif self._sklearn_object._estimator_type == "regressor":
|
1052
1156
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in self.output_cols]
|
1053
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
1054
|
-
|
1055
|
-
|
1056
|
-
|
1157
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1158
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1159
|
+
)
|
1160
|
+
|
1057
1161
|
for prob_func in PROB_FUNCTIONS:
|
1058
1162
|
if hasattr(self, prob_func):
|
1059
1163
|
output_cols_prefix: str = f"{prob_func}_"
|
1060
1164
|
output_column_names = self._get_output_column_names(output_cols_prefix)
|
1061
1165
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in output_column_names]
|
1062
|
-
self._model_signature_dict[prob_func] = ModelSignature(
|
1063
|
-
|
1064
|
-
|
1166
|
+
self._model_signature_dict[prob_func] = ModelSignature(
|
1167
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1168
|
+
)
|
1065
1169
|
|
1066
1170
|
# Output signature names may still need to be renamed, since they were not created with `_infer_signature`.
|
1067
1171
|
items = list(self._model_signature_dict.items())
|
@@ -1074,10 +1178,10 @@ class DictionaryLearning(BaseTransformer):
|
|
1074
1178
|
"""Returns model signature of current class.
|
1075
1179
|
|
1076
1180
|
Raises:
|
1077
|
-
|
1181
|
+
SnowflakeMLException: If estimator is not fitted, then model signature cannot be inferred
|
1078
1182
|
|
1079
1183
|
Returns:
|
1080
|
-
Dict
|
1184
|
+
Dict with each method and its input output signature
|
1081
1185
|
"""
|
1082
1186
|
if self._model_signature_dict is None:
|
1083
1187
|
raise exceptions.SnowflakeMLException(
|
@@ -1085,35 +1189,3 @@ class DictionaryLearning(BaseTransformer):
|
|
1085
1189
|
original_exception=RuntimeError("Estimator not fitted before accessing property model_signatures!"),
|
1086
1190
|
)
|
1087
1191
|
return self._model_signature_dict
|
1088
|
-
|
1089
|
-
def to_sklearn(self) -> Any:
|
1090
|
-
"""Get sklearn.decomposition.DictionaryLearning object.
|
1091
|
-
"""
|
1092
|
-
if self._sklearn_object is None:
|
1093
|
-
self._sklearn_object = self._create_sklearn_object()
|
1094
|
-
return self._sklearn_object
|
1095
|
-
|
1096
|
-
def to_xgboost(self) -> Any:
|
1097
|
-
raise exceptions.SnowflakeMLException(
|
1098
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1099
|
-
original_exception=AttributeError(
|
1100
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1101
|
-
"to_xgboost()",
|
1102
|
-
"to_sklearn()"
|
1103
|
-
)
|
1104
|
-
),
|
1105
|
-
)
|
1106
|
-
|
1107
|
-
def to_lightgbm(self) -> Any:
|
1108
|
-
raise exceptions.SnowflakeMLException(
|
1109
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1110
|
-
original_exception=AttributeError(
|
1111
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1112
|
-
"to_lightgbm()",
|
1113
|
-
"to_sklearn()"
|
1114
|
-
)
|
1115
|
-
),
|
1116
|
-
)
|
1117
|
-
|
1118
|
-
def _get_dependencies(self) -> List[str]:
|
1119
|
-
return self._deps
|