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
|
@@ -387,12 +386,7 @@ class MLPClassifier(BaseTransformer):
|
|
387
386
|
)
|
388
387
|
return selected_cols
|
389
388
|
|
390
|
-
|
391
|
-
project=_PROJECT,
|
392
|
-
subproject=_SUBPROJECT,
|
393
|
-
custom_tags=dict([("autogen", True)]),
|
394
|
-
)
|
395
|
-
def fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "MLPClassifier":
|
389
|
+
def _fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "MLPClassifier":
|
396
390
|
"""Fit the model to data matrix X and target(s) y
|
397
391
|
For more details on this function, see [sklearn.neural_network.MLPClassifier.fit]
|
398
392
|
(https://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPClassifier.html#sklearn.neural_network.MLPClassifier.fit)
|
@@ -419,12 +413,14 @@ class MLPClassifier(BaseTransformer):
|
|
419
413
|
|
420
414
|
self._snowpark_cols = dataset.select(self.input_cols).columns
|
421
415
|
|
422
|
-
|
416
|
+
# If we are already in a stored procedure, no need to kick off another one.
|
423
417
|
if SNOWML_SPROC_ENV in os.environ:
|
424
418
|
statement_params = telemetry.get_function_usage_statement_params(
|
425
419
|
project=_PROJECT,
|
426
420
|
subproject=_SUBPROJECT,
|
427
|
-
function_name=telemetry.get_statement_params_full_func_name(
|
421
|
+
function_name=telemetry.get_statement_params_full_func_name(
|
422
|
+
inspect.currentframe(), MLPClassifier.__class__.__name__
|
423
|
+
),
|
428
424
|
api_calls=[Session.call],
|
429
425
|
custom_tags=dict([("autogen", True)]) if self._autogenerated else None,
|
430
426
|
)
|
@@ -445,7 +441,7 @@ class MLPClassifier(BaseTransformer):
|
|
445
441
|
)
|
446
442
|
self._sklearn_object = model_trainer.train()
|
447
443
|
self._is_fitted = True
|
448
|
-
self.
|
444
|
+
self._generate_model_signatures(dataset)
|
449
445
|
return self
|
450
446
|
|
451
447
|
def _batch_inference_validate_snowpark(
|
@@ -521,7 +517,9 @@ class MLPClassifier(BaseTransformer):
|
|
521
517
|
# when it is classifier, infer the datatype from label columns
|
522
518
|
if expected_type_inferred == "" and 'predict' in self.model_signatures:
|
523
519
|
# Batch inference takes a single expected output column type. Use the first columns type for now.
|
524
|
-
label_cols_signatures = [
|
520
|
+
label_cols_signatures = [
|
521
|
+
row for row in self.model_signatures['predict'].outputs if row.name in self.output_cols
|
522
|
+
]
|
525
523
|
if len(label_cols_signatures) == 0:
|
526
524
|
error_str = f"Output columns {self.output_cols} do not match model signatures {self.model_signatures['predict'].outputs}."
|
527
525
|
raise exceptions.SnowflakeMLException(
|
@@ -529,25 +527,22 @@ class MLPClassifier(BaseTransformer):
|
|
529
527
|
original_exception=ValueError(error_str),
|
530
528
|
)
|
531
529
|
|
532
|
-
expected_type_inferred = convert_sp_to_sf_type(
|
533
|
-
label_cols_signatures[0].as_snowpark_type()
|
534
|
-
)
|
530
|
+
expected_type_inferred = convert_sp_to_sf_type(label_cols_signatures[0].as_snowpark_type())
|
535
531
|
|
536
532
|
self._deps = self._batch_inference_validate_snowpark(dataset=dataset, inference_method=inference_method)
|
537
|
-
assert isinstance(
|
533
|
+
assert isinstance(
|
534
|
+
dataset._session, Session
|
535
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
538
536
|
|
539
537
|
transform_kwargs = dict(
|
540
|
-
session
|
541
|
-
dependencies
|
542
|
-
drop_input_cols
|
543
|
-
expected_output_cols_type
|
538
|
+
session=dataset._session,
|
539
|
+
dependencies=self._deps,
|
540
|
+
drop_input_cols=self._drop_input_cols,
|
541
|
+
expected_output_cols_type=expected_type_inferred,
|
544
542
|
)
|
545
543
|
|
546
544
|
elif isinstance(dataset, pd.DataFrame):
|
547
|
-
transform_kwargs = dict(
|
548
|
-
snowpark_input_cols = self._snowpark_cols,
|
549
|
-
drop_input_cols = self._drop_input_cols
|
550
|
-
)
|
545
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
551
546
|
|
552
547
|
transform_handlers = ModelTransformerBuilder.build(
|
553
548
|
dataset=dataset,
|
@@ -587,7 +582,7 @@ class MLPClassifier(BaseTransformer):
|
|
587
582
|
Transformed dataset.
|
588
583
|
"""
|
589
584
|
super()._check_dataset_type(dataset)
|
590
|
-
inference_method="transform"
|
585
|
+
inference_method = "transform"
|
591
586
|
|
592
587
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
593
588
|
# are specific to the type of dataset used.
|
@@ -624,17 +619,14 @@ class MLPClassifier(BaseTransformer):
|
|
624
619
|
assert isinstance(dataset._session, Session) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
625
620
|
|
626
621
|
transform_kwargs = dict(
|
627
|
-
session
|
628
|
-
dependencies
|
629
|
-
drop_input_cols
|
630
|
-
expected_output_cols_type
|
622
|
+
session=dataset._session,
|
623
|
+
dependencies=self._deps,
|
624
|
+
drop_input_cols=self._drop_input_cols,
|
625
|
+
expected_output_cols_type=expected_dtype,
|
631
626
|
)
|
632
627
|
|
633
628
|
elif isinstance(dataset, pd.DataFrame):
|
634
|
-
transform_kwargs = dict(
|
635
|
-
snowpark_input_cols = self._snowpark_cols,
|
636
|
-
drop_input_cols = self._drop_input_cols
|
637
|
-
)
|
629
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
638
630
|
|
639
631
|
transform_handlers = ModelTransformerBuilder.build(
|
640
632
|
dataset=dataset,
|
@@ -653,7 +645,11 @@ class MLPClassifier(BaseTransformer):
|
|
653
645
|
return output_df
|
654
646
|
|
655
647
|
@available_if(original_estimator_has_callable("fit_predict")) # type: ignore[misc]
|
656
|
-
def fit_predict(
|
648
|
+
def fit_predict(
|
649
|
+
self,
|
650
|
+
dataset: Union[DataFrame, pd.DataFrame],
|
651
|
+
output_cols_prefix: str = "fit_predict_",
|
652
|
+
) -> Union[DataFrame, pd.DataFrame]:
|
657
653
|
""" Method not supported for this class.
|
658
654
|
|
659
655
|
|
@@ -678,7 +674,9 @@ class MLPClassifier(BaseTransformer):
|
|
678
674
|
)
|
679
675
|
output_result, fitted_estimator = model_trainer.train_fit_predict(
|
680
676
|
drop_input_cols=self._drop_input_cols,
|
681
|
-
expected_output_cols_list=
|
677
|
+
expected_output_cols_list=(
|
678
|
+
self.output_cols if self.output_cols else self._get_output_column_names(output_cols_prefix)
|
679
|
+
),
|
682
680
|
)
|
683
681
|
self._sklearn_object = fitted_estimator
|
684
682
|
self._is_fitted = True
|
@@ -695,6 +693,62 @@ class MLPClassifier(BaseTransformer):
|
|
695
693
|
assert self._sklearn_object is not None
|
696
694
|
return self._sklearn_object.embedding_
|
697
695
|
|
696
|
+
|
697
|
+
def _get_output_column_names(self, output_cols_prefix: str, output_cols: Optional[List[str]] = None) -> List[str]:
|
698
|
+
""" Returns the list of output columns for predict_proba(), decision_function(), etc.. functions.
|
699
|
+
Returns a list with output_cols_prefix as the only element if the estimator is not a classifier.
|
700
|
+
"""
|
701
|
+
output_cols_prefix = identifier.resolve_identifier(output_cols_prefix)
|
702
|
+
# The following condition is introduced for kneighbors methods, and not used in other methods
|
703
|
+
if output_cols:
|
704
|
+
output_cols = [
|
705
|
+
identifier.concat_names([output_cols_prefix, identifier.resolve_identifier(c)])
|
706
|
+
for c in output_cols
|
707
|
+
]
|
708
|
+
elif getattr(self._sklearn_object, "classes_", None) is None:
|
709
|
+
output_cols = [output_cols_prefix]
|
710
|
+
elif self._sklearn_object is not None:
|
711
|
+
classes = self._sklearn_object.classes_
|
712
|
+
if isinstance(classes, numpy.ndarray):
|
713
|
+
output_cols = [f'{output_cols_prefix}{str(c)}' for c in classes.tolist()]
|
714
|
+
elif isinstance(classes, list) and len(classes) > 0 and isinstance(classes[0], numpy.ndarray):
|
715
|
+
# If the estimator is a multioutput estimator, classes_ will be a list of ndarrays.
|
716
|
+
output_cols = []
|
717
|
+
for i, cl in enumerate(classes):
|
718
|
+
# For binary classification, there is only one output column for each class
|
719
|
+
# ndarray as the two classes are complementary.
|
720
|
+
if len(cl) == 2:
|
721
|
+
output_cols.append(f'{output_cols_prefix}{i}_{cl[0]}')
|
722
|
+
else:
|
723
|
+
output_cols.extend([
|
724
|
+
f'{output_cols_prefix}{i}_{c}' for c in cl.tolist()
|
725
|
+
])
|
726
|
+
else:
|
727
|
+
output_cols = []
|
728
|
+
|
729
|
+
# Make sure column names are valid snowflake identifiers.
|
730
|
+
assert output_cols is not None # Make MyPy happy
|
731
|
+
rv = [identifier.rename_to_valid_snowflake_identifier(c) for c in output_cols]
|
732
|
+
|
733
|
+
return rv
|
734
|
+
|
735
|
+
def _align_expected_output_names(
|
736
|
+
self, method: str, dataset: DataFrame, expected_output_cols_list: List[str], output_cols_prefix: str
|
737
|
+
) -> List[str]:
|
738
|
+
# in case the inferred output column names dimension is different
|
739
|
+
# we use one line of snowpark dataframe and put it into sklearn estimator using pandas
|
740
|
+
output_df_pd = getattr(self, method)(dataset.limit(1).to_pandas(), output_cols_prefix)
|
741
|
+
output_df_columns = list(output_df_pd.columns)
|
742
|
+
output_df_columns_set: Set[str] = set(output_df_columns) - set(dataset.columns)
|
743
|
+
if self.sample_weight_col:
|
744
|
+
output_df_columns_set -= set(self.sample_weight_col)
|
745
|
+
# if the dimension of inferred output column names is correct; use it
|
746
|
+
if len(expected_output_cols_list) == len(output_df_columns_set):
|
747
|
+
return expected_output_cols_list
|
748
|
+
# otherwise, use the sklearn estimator's output
|
749
|
+
else:
|
750
|
+
return sorted(list(output_df_columns_set), key=lambda x: output_df_columns.index(x))
|
751
|
+
|
698
752
|
@available_if(original_estimator_has_callable("predict_proba")) # type: ignore[misc]
|
699
753
|
@telemetry.send_api_usage_telemetry(
|
700
754
|
project=_PROJECT,
|
@@ -727,24 +781,28 @@ class MLPClassifier(BaseTransformer):
|
|
727
781
|
# are specific to the type of dataset used.
|
728
782
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
729
783
|
|
784
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
785
|
+
|
730
786
|
if isinstance(dataset, DataFrame):
|
731
787
|
self._deps = self._batch_inference_validate_snowpark(
|
732
788
|
dataset=dataset,
|
733
789
|
inference_method=inference_method,
|
734
790
|
)
|
735
|
-
assert isinstance(
|
791
|
+
assert isinstance(
|
792
|
+
dataset._session, Session
|
793
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
736
794
|
transform_kwargs = dict(
|
737
795
|
session=dataset._session,
|
738
796
|
dependencies=self._deps,
|
739
|
-
drop_input_cols
|
797
|
+
drop_input_cols=self._drop_input_cols,
|
740
798
|
expected_output_cols_type="float",
|
741
799
|
)
|
800
|
+
expected_output_cols = self._align_expected_output_names(
|
801
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
802
|
+
)
|
742
803
|
|
743
804
|
elif isinstance(dataset, pd.DataFrame):
|
744
|
-
transform_kwargs = dict(
|
745
|
-
snowpark_input_cols = self._snowpark_cols,
|
746
|
-
drop_input_cols = self._drop_input_cols
|
747
|
-
)
|
805
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
748
806
|
|
749
807
|
transform_handlers = ModelTransformerBuilder.build(
|
750
808
|
dataset=dataset,
|
@@ -756,7 +814,7 @@ class MLPClassifier(BaseTransformer):
|
|
756
814
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
757
815
|
inference_method=inference_method,
|
758
816
|
input_cols=self.input_cols,
|
759
|
-
expected_output_cols=
|
817
|
+
expected_output_cols=expected_output_cols,
|
760
818
|
**transform_kwargs
|
761
819
|
)
|
762
820
|
return output_df
|
@@ -788,7 +846,8 @@ class MLPClassifier(BaseTransformer):
|
|
788
846
|
Output dataset with log probability of the sample for each class in the model.
|
789
847
|
"""
|
790
848
|
super()._check_dataset_type(dataset)
|
791
|
-
inference_method="predict_log_proba"
|
849
|
+
inference_method = "predict_log_proba"
|
850
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
792
851
|
|
793
852
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
794
853
|
# are specific to the type of dataset used.
|
@@ -799,18 +858,20 @@ class MLPClassifier(BaseTransformer):
|
|
799
858
|
dataset=dataset,
|
800
859
|
inference_method=inference_method,
|
801
860
|
)
|
802
|
-
assert isinstance(
|
861
|
+
assert isinstance(
|
862
|
+
dataset._session, Session
|
863
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
803
864
|
transform_kwargs = dict(
|
804
865
|
session=dataset._session,
|
805
866
|
dependencies=self._deps,
|
806
|
-
drop_input_cols
|
867
|
+
drop_input_cols=self._drop_input_cols,
|
807
868
|
expected_output_cols_type="float",
|
808
869
|
)
|
870
|
+
expected_output_cols = self._align_expected_output_names(
|
871
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
872
|
+
)
|
809
873
|
elif isinstance(dataset, pd.DataFrame):
|
810
|
-
transform_kwargs = dict(
|
811
|
-
snowpark_input_cols = self._snowpark_cols,
|
812
|
-
drop_input_cols = self._drop_input_cols
|
813
|
-
)
|
874
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
814
875
|
|
815
876
|
transform_handlers = ModelTransformerBuilder.build(
|
816
877
|
dataset=dataset,
|
@@ -823,7 +884,7 @@ class MLPClassifier(BaseTransformer):
|
|
823
884
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
824
885
|
inference_method=inference_method,
|
825
886
|
input_cols=self.input_cols,
|
826
|
-
expected_output_cols=
|
887
|
+
expected_output_cols=expected_output_cols,
|
827
888
|
**transform_kwargs
|
828
889
|
)
|
829
890
|
return output_df
|
@@ -849,30 +910,34 @@ class MLPClassifier(BaseTransformer):
|
|
849
910
|
Output dataset with results of the decision function for the samples in input dataset.
|
850
911
|
"""
|
851
912
|
super()._check_dataset_type(dataset)
|
852
|
-
inference_method="decision_function"
|
913
|
+
inference_method = "decision_function"
|
853
914
|
|
854
915
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
855
916
|
# are specific to the type of dataset used.
|
856
917
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
857
918
|
|
919
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
920
|
+
|
858
921
|
if isinstance(dataset, DataFrame):
|
859
922
|
self._deps = self._batch_inference_validate_snowpark(
|
860
923
|
dataset=dataset,
|
861
924
|
inference_method=inference_method,
|
862
925
|
)
|
863
|
-
assert isinstance(
|
926
|
+
assert isinstance(
|
927
|
+
dataset._session, Session
|
928
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
864
929
|
transform_kwargs = dict(
|
865
930
|
session=dataset._session,
|
866
931
|
dependencies=self._deps,
|
867
|
-
drop_input_cols
|
932
|
+
drop_input_cols=self._drop_input_cols,
|
868
933
|
expected_output_cols_type="float",
|
869
934
|
)
|
935
|
+
expected_output_cols = self._align_expected_output_names(
|
936
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
937
|
+
)
|
870
938
|
|
871
939
|
elif isinstance(dataset, pd.DataFrame):
|
872
|
-
transform_kwargs = dict(
|
873
|
-
snowpark_input_cols = self._snowpark_cols,
|
874
|
-
drop_input_cols = self._drop_input_cols
|
875
|
-
)
|
940
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
876
941
|
|
877
942
|
transform_handlers = ModelTransformerBuilder.build(
|
878
943
|
dataset=dataset,
|
@@ -885,7 +950,7 @@ class MLPClassifier(BaseTransformer):
|
|
885
950
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
886
951
|
inference_method=inference_method,
|
887
952
|
input_cols=self.input_cols,
|
888
|
-
expected_output_cols=
|
953
|
+
expected_output_cols=expected_output_cols,
|
889
954
|
**transform_kwargs
|
890
955
|
)
|
891
956
|
return output_df
|
@@ -914,12 +979,14 @@ class MLPClassifier(BaseTransformer):
|
|
914
979
|
Output dataset with probability of the sample for each class in the model.
|
915
980
|
"""
|
916
981
|
super()._check_dataset_type(dataset)
|
917
|
-
inference_method="score_samples"
|
982
|
+
inference_method = "score_samples"
|
918
983
|
|
919
984
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
920
985
|
# are specific to the type of dataset used.
|
921
986
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
922
987
|
|
988
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
989
|
+
|
923
990
|
if isinstance(dataset, DataFrame):
|
924
991
|
self._deps = self._batch_inference_validate_snowpark(
|
925
992
|
dataset=dataset,
|
@@ -932,6 +999,9 @@ class MLPClassifier(BaseTransformer):
|
|
932
999
|
drop_input_cols = self._drop_input_cols,
|
933
1000
|
expected_output_cols_type="float",
|
934
1001
|
)
|
1002
|
+
expected_output_cols = self._align_expected_output_names(
|
1003
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
1004
|
+
)
|
935
1005
|
|
936
1006
|
elif isinstance(dataset, pd.DataFrame):
|
937
1007
|
transform_kwargs = dict(
|
@@ -950,7 +1020,7 @@ class MLPClassifier(BaseTransformer):
|
|
950
1020
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
951
1021
|
inference_method=inference_method,
|
952
1022
|
input_cols=self.input_cols,
|
953
|
-
expected_output_cols=
|
1023
|
+
expected_output_cols=expected_output_cols,
|
954
1024
|
**transform_kwargs
|
955
1025
|
)
|
956
1026
|
return output_df
|
@@ -1097,50 +1167,84 @@ class MLPClassifier(BaseTransformer):
|
|
1097
1167
|
)
|
1098
1168
|
return output_df
|
1099
1169
|
|
1170
|
+
|
1171
|
+
|
1172
|
+
def to_sklearn(self) -> Any:
|
1173
|
+
"""Get sklearn.neural_network.MLPClassifier object.
|
1174
|
+
"""
|
1175
|
+
if self._sklearn_object is None:
|
1176
|
+
self._sklearn_object = self._create_sklearn_object()
|
1177
|
+
return self._sklearn_object
|
1178
|
+
|
1179
|
+
def to_xgboost(self) -> Any:
|
1180
|
+
raise exceptions.SnowflakeMLException(
|
1181
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1182
|
+
original_exception=AttributeError(
|
1183
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1184
|
+
"to_xgboost()",
|
1185
|
+
"to_sklearn()"
|
1186
|
+
)
|
1187
|
+
),
|
1188
|
+
)
|
1189
|
+
|
1190
|
+
def to_lightgbm(self) -> Any:
|
1191
|
+
raise exceptions.SnowflakeMLException(
|
1192
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1193
|
+
original_exception=AttributeError(
|
1194
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1195
|
+
"to_lightgbm()",
|
1196
|
+
"to_sklearn()"
|
1197
|
+
)
|
1198
|
+
),
|
1199
|
+
)
|
1100
1200
|
|
1101
|
-
def
|
1201
|
+
def _get_dependencies(self) -> List[str]:
|
1202
|
+
return self._deps
|
1203
|
+
|
1204
|
+
|
1205
|
+
def _generate_model_signatures(self, dataset: Union[DataFrame, pd.DataFrame]) -> None:
|
1102
1206
|
self._model_signature_dict = dict()
|
1103
1207
|
|
1104
1208
|
PROB_FUNCTIONS = ["predict_log_proba", "predict_proba", "decision_function"]
|
1105
1209
|
|
1106
|
-
inputs = list(_infer_signature(dataset[self.input_cols], "input"))
|
1210
|
+
inputs = list(_infer_signature(dataset[self.input_cols], "input", use_snowflake_identifiers=True))
|
1107
1211
|
outputs: List[BaseFeatureSpec] = []
|
1108
1212
|
if hasattr(self, "predict"):
|
1109
1213
|
# keep mypy happy
|
1110
|
-
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
1214
|
+
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
1111
1215
|
# For classifier, the type of predict is the same as the type of label
|
1112
|
-
if self._sklearn_object._estimator_type ==
|
1113
|
-
|
1216
|
+
if self._sklearn_object._estimator_type == "classifier":
|
1217
|
+
# label columns is the desired type for output
|
1114
1218
|
outputs = list(_infer_signature(dataset[self.label_cols], "output", use_snowflake_identifiers=True))
|
1115
1219
|
# rename the output columns
|
1116
1220
|
outputs = list(model_signature_utils.rename_features(outputs, self.output_cols))
|
1117
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
1118
|
-
|
1119
|
-
|
1221
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1222
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1223
|
+
)
|
1120
1224
|
# For mixture models that use the density mixin, `predict` returns the argmax of the log prob.
|
1121
1225
|
# For outlier models, returns -1 for outliers and 1 for inliers.
|
1122
|
-
# Clusterer returns int64 cluster labels.
|
1226
|
+
# Clusterer returns int64 cluster labels.
|
1123
1227
|
elif self._sklearn_object._estimator_type in ["DensityEstimator", "clusterer", "outlier_detector"]:
|
1124
1228
|
outputs = [FeatureSpec(dtype=DataType.INT64, name=c) for c in self.output_cols]
|
1125
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
1126
|
-
|
1127
|
-
|
1128
|
-
|
1229
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1230
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1231
|
+
)
|
1232
|
+
|
1129
1233
|
# For regressor, the type of predict is float64
|
1130
|
-
elif self._sklearn_object._estimator_type ==
|
1234
|
+
elif self._sklearn_object._estimator_type == "regressor":
|
1131
1235
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in self.output_cols]
|
1132
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1236
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1237
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1238
|
+
)
|
1239
|
+
|
1136
1240
|
for prob_func in PROB_FUNCTIONS:
|
1137
1241
|
if hasattr(self, prob_func):
|
1138
1242
|
output_cols_prefix: str = f"{prob_func}_"
|
1139
1243
|
output_column_names = self._get_output_column_names(output_cols_prefix)
|
1140
1244
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in output_column_names]
|
1141
|
-
self._model_signature_dict[prob_func] = ModelSignature(
|
1142
|
-
|
1143
|
-
|
1245
|
+
self._model_signature_dict[prob_func] = ModelSignature(
|
1246
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1247
|
+
)
|
1144
1248
|
|
1145
1249
|
# Output signature names may still need to be renamed, since they were not created with `_infer_signature`.
|
1146
1250
|
items = list(self._model_signature_dict.items())
|
@@ -1153,10 +1257,10 @@ class MLPClassifier(BaseTransformer):
|
|
1153
1257
|
"""Returns model signature of current class.
|
1154
1258
|
|
1155
1259
|
Raises:
|
1156
|
-
|
1260
|
+
SnowflakeMLException: If estimator is not fitted, then model signature cannot be inferred
|
1157
1261
|
|
1158
1262
|
Returns:
|
1159
|
-
Dict
|
1263
|
+
Dict with each method and its input output signature
|
1160
1264
|
"""
|
1161
1265
|
if self._model_signature_dict is None:
|
1162
1266
|
raise exceptions.SnowflakeMLException(
|
@@ -1164,35 +1268,3 @@ class MLPClassifier(BaseTransformer):
|
|
1164
1268
|
original_exception=RuntimeError("Estimator not fitted before accessing property model_signatures!"),
|
1165
1269
|
)
|
1166
1270
|
return self._model_signature_dict
|
1167
|
-
|
1168
|
-
def to_sklearn(self) -> Any:
|
1169
|
-
"""Get sklearn.neural_network.MLPClassifier object.
|
1170
|
-
"""
|
1171
|
-
if self._sklearn_object is None:
|
1172
|
-
self._sklearn_object = self._create_sklearn_object()
|
1173
|
-
return self._sklearn_object
|
1174
|
-
|
1175
|
-
def to_xgboost(self) -> Any:
|
1176
|
-
raise exceptions.SnowflakeMLException(
|
1177
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1178
|
-
original_exception=AttributeError(
|
1179
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1180
|
-
"to_xgboost()",
|
1181
|
-
"to_sklearn()"
|
1182
|
-
)
|
1183
|
-
),
|
1184
|
-
)
|
1185
|
-
|
1186
|
-
def to_lightgbm(self) -> Any:
|
1187
|
-
raise exceptions.SnowflakeMLException(
|
1188
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1189
|
-
original_exception=AttributeError(
|
1190
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1191
|
-
"to_lightgbm()",
|
1192
|
-
"to_sklearn()"
|
1193
|
-
)
|
1194
|
-
),
|
1195
|
-
)
|
1196
|
-
|
1197
|
-
def _get_dependencies(self) -> List[str]:
|
1198
|
-
return self._deps
|