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
|
@@ -208,12 +207,7 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
208
207
|
)
|
209
208
|
return selected_cols
|
210
209
|
|
211
|
-
|
212
|
-
project=_PROJECT,
|
213
|
-
subproject=_SUBPROJECT,
|
214
|
-
custom_tags=dict([("autogen", True)]),
|
215
|
-
)
|
216
|
-
def fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "SkewedChi2Sampler":
|
210
|
+
def _fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "SkewedChi2Sampler":
|
217
211
|
"""Fit the model with X
|
218
212
|
For more details on this function, see [sklearn.kernel_approximation.SkewedChi2Sampler.fit]
|
219
213
|
(https://scikit-learn.org/stable/modules/generated/sklearn.kernel_approximation.SkewedChi2Sampler.html#sklearn.kernel_approximation.SkewedChi2Sampler.fit)
|
@@ -240,12 +234,14 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
240
234
|
|
241
235
|
self._snowpark_cols = dataset.select(self.input_cols).columns
|
242
236
|
|
243
|
-
|
237
|
+
# If we are already in a stored procedure, no need to kick off another one.
|
244
238
|
if SNOWML_SPROC_ENV in os.environ:
|
245
239
|
statement_params = telemetry.get_function_usage_statement_params(
|
246
240
|
project=_PROJECT,
|
247
241
|
subproject=_SUBPROJECT,
|
248
|
-
function_name=telemetry.get_statement_params_full_func_name(
|
242
|
+
function_name=telemetry.get_statement_params_full_func_name(
|
243
|
+
inspect.currentframe(), SkewedChi2Sampler.__class__.__name__
|
244
|
+
),
|
249
245
|
api_calls=[Session.call],
|
250
246
|
custom_tags=dict([("autogen", True)]) if self._autogenerated else None,
|
251
247
|
)
|
@@ -266,7 +262,7 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
266
262
|
)
|
267
263
|
self._sklearn_object = model_trainer.train()
|
268
264
|
self._is_fitted = True
|
269
|
-
self.
|
265
|
+
self._generate_model_signatures(dataset)
|
270
266
|
return self
|
271
267
|
|
272
268
|
def _batch_inference_validate_snowpark(
|
@@ -340,7 +336,9 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
340
336
|
# when it is classifier, infer the datatype from label columns
|
341
337
|
if expected_type_inferred == "" and 'predict' in self.model_signatures:
|
342
338
|
# Batch inference takes a single expected output column type. Use the first columns type for now.
|
343
|
-
label_cols_signatures = [
|
339
|
+
label_cols_signatures = [
|
340
|
+
row for row in self.model_signatures['predict'].outputs if row.name in self.output_cols
|
341
|
+
]
|
344
342
|
if len(label_cols_signatures) == 0:
|
345
343
|
error_str = f"Output columns {self.output_cols} do not match model signatures {self.model_signatures['predict'].outputs}."
|
346
344
|
raise exceptions.SnowflakeMLException(
|
@@ -348,25 +346,22 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
348
346
|
original_exception=ValueError(error_str),
|
349
347
|
)
|
350
348
|
|
351
|
-
expected_type_inferred = convert_sp_to_sf_type(
|
352
|
-
label_cols_signatures[0].as_snowpark_type()
|
353
|
-
)
|
349
|
+
expected_type_inferred = convert_sp_to_sf_type(label_cols_signatures[0].as_snowpark_type())
|
354
350
|
|
355
351
|
self._deps = self._batch_inference_validate_snowpark(dataset=dataset, inference_method=inference_method)
|
356
|
-
assert isinstance(
|
352
|
+
assert isinstance(
|
353
|
+
dataset._session, Session
|
354
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
357
355
|
|
358
356
|
transform_kwargs = dict(
|
359
|
-
session
|
360
|
-
dependencies
|
361
|
-
drop_input_cols
|
362
|
-
expected_output_cols_type
|
357
|
+
session=dataset._session,
|
358
|
+
dependencies=self._deps,
|
359
|
+
drop_input_cols=self._drop_input_cols,
|
360
|
+
expected_output_cols_type=expected_type_inferred,
|
363
361
|
)
|
364
362
|
|
365
363
|
elif isinstance(dataset, pd.DataFrame):
|
366
|
-
transform_kwargs = dict(
|
367
|
-
snowpark_input_cols = self._snowpark_cols,
|
368
|
-
drop_input_cols = self._drop_input_cols
|
369
|
-
)
|
364
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
370
365
|
|
371
366
|
transform_handlers = ModelTransformerBuilder.build(
|
372
367
|
dataset=dataset,
|
@@ -408,7 +403,7 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
408
403
|
Transformed dataset.
|
409
404
|
"""
|
410
405
|
super()._check_dataset_type(dataset)
|
411
|
-
inference_method="transform"
|
406
|
+
inference_method = "transform"
|
412
407
|
|
413
408
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
414
409
|
# are specific to the type of dataset used.
|
@@ -445,17 +440,14 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
445
440
|
assert isinstance(dataset._session, Session) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
446
441
|
|
447
442
|
transform_kwargs = dict(
|
448
|
-
session
|
449
|
-
dependencies
|
450
|
-
drop_input_cols
|
451
|
-
expected_output_cols_type
|
443
|
+
session=dataset._session,
|
444
|
+
dependencies=self._deps,
|
445
|
+
drop_input_cols=self._drop_input_cols,
|
446
|
+
expected_output_cols_type=expected_dtype,
|
452
447
|
)
|
453
448
|
|
454
449
|
elif isinstance(dataset, pd.DataFrame):
|
455
|
-
transform_kwargs = dict(
|
456
|
-
snowpark_input_cols = self._snowpark_cols,
|
457
|
-
drop_input_cols = self._drop_input_cols
|
458
|
-
)
|
450
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
459
451
|
|
460
452
|
transform_handlers = ModelTransformerBuilder.build(
|
461
453
|
dataset=dataset,
|
@@ -474,7 +466,11 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
474
466
|
return output_df
|
475
467
|
|
476
468
|
@available_if(original_estimator_has_callable("fit_predict")) # type: ignore[misc]
|
477
|
-
def fit_predict(
|
469
|
+
def fit_predict(
|
470
|
+
self,
|
471
|
+
dataset: Union[DataFrame, pd.DataFrame],
|
472
|
+
output_cols_prefix: str = "fit_predict_",
|
473
|
+
) -> Union[DataFrame, pd.DataFrame]:
|
478
474
|
""" Method not supported for this class.
|
479
475
|
|
480
476
|
|
@@ -499,7 +495,9 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
499
495
|
)
|
500
496
|
output_result, fitted_estimator = model_trainer.train_fit_predict(
|
501
497
|
drop_input_cols=self._drop_input_cols,
|
502
|
-
expected_output_cols_list=
|
498
|
+
expected_output_cols_list=(
|
499
|
+
self.output_cols if self.output_cols else self._get_output_column_names(output_cols_prefix)
|
500
|
+
),
|
503
501
|
)
|
504
502
|
self._sklearn_object = fitted_estimator
|
505
503
|
self._is_fitted = True
|
@@ -516,6 +514,62 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
516
514
|
assert self._sklearn_object is not None
|
517
515
|
return self._sklearn_object.embedding_
|
518
516
|
|
517
|
+
|
518
|
+
def _get_output_column_names(self, output_cols_prefix: str, output_cols: Optional[List[str]] = None) -> List[str]:
|
519
|
+
""" Returns the list of output columns for predict_proba(), decision_function(), etc.. functions.
|
520
|
+
Returns a list with output_cols_prefix as the only element if the estimator is not a classifier.
|
521
|
+
"""
|
522
|
+
output_cols_prefix = identifier.resolve_identifier(output_cols_prefix)
|
523
|
+
# The following condition is introduced for kneighbors methods, and not used in other methods
|
524
|
+
if output_cols:
|
525
|
+
output_cols = [
|
526
|
+
identifier.concat_names([output_cols_prefix, identifier.resolve_identifier(c)])
|
527
|
+
for c in output_cols
|
528
|
+
]
|
529
|
+
elif getattr(self._sklearn_object, "classes_", None) is None:
|
530
|
+
output_cols = [output_cols_prefix]
|
531
|
+
elif self._sklearn_object is not None:
|
532
|
+
classes = self._sklearn_object.classes_
|
533
|
+
if isinstance(classes, numpy.ndarray):
|
534
|
+
output_cols = [f'{output_cols_prefix}{str(c)}' for c in classes.tolist()]
|
535
|
+
elif isinstance(classes, list) and len(classes) > 0 and isinstance(classes[0], numpy.ndarray):
|
536
|
+
# If the estimator is a multioutput estimator, classes_ will be a list of ndarrays.
|
537
|
+
output_cols = []
|
538
|
+
for i, cl in enumerate(classes):
|
539
|
+
# For binary classification, there is only one output column for each class
|
540
|
+
# ndarray as the two classes are complementary.
|
541
|
+
if len(cl) == 2:
|
542
|
+
output_cols.append(f'{output_cols_prefix}{i}_{cl[0]}')
|
543
|
+
else:
|
544
|
+
output_cols.extend([
|
545
|
+
f'{output_cols_prefix}{i}_{c}' for c in cl.tolist()
|
546
|
+
])
|
547
|
+
else:
|
548
|
+
output_cols = []
|
549
|
+
|
550
|
+
# Make sure column names are valid snowflake identifiers.
|
551
|
+
assert output_cols is not None # Make MyPy happy
|
552
|
+
rv = [identifier.rename_to_valid_snowflake_identifier(c) for c in output_cols]
|
553
|
+
|
554
|
+
return rv
|
555
|
+
|
556
|
+
def _align_expected_output_names(
|
557
|
+
self, method: str, dataset: DataFrame, expected_output_cols_list: List[str], output_cols_prefix: str
|
558
|
+
) -> List[str]:
|
559
|
+
# in case the inferred output column names dimension is different
|
560
|
+
# we use one line of snowpark dataframe and put it into sklearn estimator using pandas
|
561
|
+
output_df_pd = getattr(self, method)(dataset.limit(1).to_pandas(), output_cols_prefix)
|
562
|
+
output_df_columns = list(output_df_pd.columns)
|
563
|
+
output_df_columns_set: Set[str] = set(output_df_columns) - set(dataset.columns)
|
564
|
+
if self.sample_weight_col:
|
565
|
+
output_df_columns_set -= set(self.sample_weight_col)
|
566
|
+
# if the dimension of inferred output column names is correct; use it
|
567
|
+
if len(expected_output_cols_list) == len(output_df_columns_set):
|
568
|
+
return expected_output_cols_list
|
569
|
+
# otherwise, use the sklearn estimator's output
|
570
|
+
else:
|
571
|
+
return sorted(list(output_df_columns_set), key=lambda x: output_df_columns.index(x))
|
572
|
+
|
519
573
|
@available_if(original_estimator_has_callable("predict_proba")) # type: ignore[misc]
|
520
574
|
@telemetry.send_api_usage_telemetry(
|
521
575
|
project=_PROJECT,
|
@@ -546,24 +600,28 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
546
600
|
# are specific to the type of dataset used.
|
547
601
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
548
602
|
|
603
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
604
|
+
|
549
605
|
if isinstance(dataset, DataFrame):
|
550
606
|
self._deps = self._batch_inference_validate_snowpark(
|
551
607
|
dataset=dataset,
|
552
608
|
inference_method=inference_method,
|
553
609
|
)
|
554
|
-
assert isinstance(
|
610
|
+
assert isinstance(
|
611
|
+
dataset._session, Session
|
612
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
555
613
|
transform_kwargs = dict(
|
556
614
|
session=dataset._session,
|
557
615
|
dependencies=self._deps,
|
558
|
-
drop_input_cols
|
616
|
+
drop_input_cols=self._drop_input_cols,
|
559
617
|
expected_output_cols_type="float",
|
560
618
|
)
|
619
|
+
expected_output_cols = self._align_expected_output_names(
|
620
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
621
|
+
)
|
561
622
|
|
562
623
|
elif isinstance(dataset, pd.DataFrame):
|
563
|
-
transform_kwargs = dict(
|
564
|
-
snowpark_input_cols = self._snowpark_cols,
|
565
|
-
drop_input_cols = self._drop_input_cols
|
566
|
-
)
|
624
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
567
625
|
|
568
626
|
transform_handlers = ModelTransformerBuilder.build(
|
569
627
|
dataset=dataset,
|
@@ -575,7 +633,7 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
575
633
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
576
634
|
inference_method=inference_method,
|
577
635
|
input_cols=self.input_cols,
|
578
|
-
expected_output_cols=
|
636
|
+
expected_output_cols=expected_output_cols,
|
579
637
|
**transform_kwargs
|
580
638
|
)
|
581
639
|
return output_df
|
@@ -605,7 +663,8 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
605
663
|
Output dataset with log probability of the sample for each class in the model.
|
606
664
|
"""
|
607
665
|
super()._check_dataset_type(dataset)
|
608
|
-
inference_method="predict_log_proba"
|
666
|
+
inference_method = "predict_log_proba"
|
667
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
609
668
|
|
610
669
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
611
670
|
# are specific to the type of dataset used.
|
@@ -616,18 +675,20 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
616
675
|
dataset=dataset,
|
617
676
|
inference_method=inference_method,
|
618
677
|
)
|
619
|
-
assert isinstance(
|
678
|
+
assert isinstance(
|
679
|
+
dataset._session, Session
|
680
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
620
681
|
transform_kwargs = dict(
|
621
682
|
session=dataset._session,
|
622
683
|
dependencies=self._deps,
|
623
|
-
drop_input_cols
|
684
|
+
drop_input_cols=self._drop_input_cols,
|
624
685
|
expected_output_cols_type="float",
|
625
686
|
)
|
687
|
+
expected_output_cols = self._align_expected_output_names(
|
688
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
689
|
+
)
|
626
690
|
elif isinstance(dataset, pd.DataFrame):
|
627
|
-
transform_kwargs = dict(
|
628
|
-
snowpark_input_cols = self._snowpark_cols,
|
629
|
-
drop_input_cols = self._drop_input_cols
|
630
|
-
)
|
691
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
631
692
|
|
632
693
|
transform_handlers = ModelTransformerBuilder.build(
|
633
694
|
dataset=dataset,
|
@@ -640,7 +701,7 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
640
701
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
641
702
|
inference_method=inference_method,
|
642
703
|
input_cols=self.input_cols,
|
643
|
-
expected_output_cols=
|
704
|
+
expected_output_cols=expected_output_cols,
|
644
705
|
**transform_kwargs
|
645
706
|
)
|
646
707
|
return output_df
|
@@ -666,30 +727,34 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
666
727
|
Output dataset with results of the decision function for the samples in input dataset.
|
667
728
|
"""
|
668
729
|
super()._check_dataset_type(dataset)
|
669
|
-
inference_method="decision_function"
|
730
|
+
inference_method = "decision_function"
|
670
731
|
|
671
732
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
672
733
|
# are specific to the type of dataset used.
|
673
734
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
674
735
|
|
736
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
737
|
+
|
675
738
|
if isinstance(dataset, DataFrame):
|
676
739
|
self._deps = self._batch_inference_validate_snowpark(
|
677
740
|
dataset=dataset,
|
678
741
|
inference_method=inference_method,
|
679
742
|
)
|
680
|
-
assert isinstance(
|
743
|
+
assert isinstance(
|
744
|
+
dataset._session, Session
|
745
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
681
746
|
transform_kwargs = dict(
|
682
747
|
session=dataset._session,
|
683
748
|
dependencies=self._deps,
|
684
|
-
drop_input_cols
|
749
|
+
drop_input_cols=self._drop_input_cols,
|
685
750
|
expected_output_cols_type="float",
|
686
751
|
)
|
752
|
+
expected_output_cols = self._align_expected_output_names(
|
753
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
754
|
+
)
|
687
755
|
|
688
756
|
elif isinstance(dataset, pd.DataFrame):
|
689
|
-
transform_kwargs = dict(
|
690
|
-
snowpark_input_cols = self._snowpark_cols,
|
691
|
-
drop_input_cols = self._drop_input_cols
|
692
|
-
)
|
757
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
693
758
|
|
694
759
|
transform_handlers = ModelTransformerBuilder.build(
|
695
760
|
dataset=dataset,
|
@@ -702,7 +767,7 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
702
767
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
703
768
|
inference_method=inference_method,
|
704
769
|
input_cols=self.input_cols,
|
705
|
-
expected_output_cols=
|
770
|
+
expected_output_cols=expected_output_cols,
|
706
771
|
**transform_kwargs
|
707
772
|
)
|
708
773
|
return output_df
|
@@ -731,12 +796,14 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
731
796
|
Output dataset with probability of the sample for each class in the model.
|
732
797
|
"""
|
733
798
|
super()._check_dataset_type(dataset)
|
734
|
-
inference_method="score_samples"
|
799
|
+
inference_method = "score_samples"
|
735
800
|
|
736
801
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
737
802
|
# are specific to the type of dataset used.
|
738
803
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
739
804
|
|
805
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
806
|
+
|
740
807
|
if isinstance(dataset, DataFrame):
|
741
808
|
self._deps = self._batch_inference_validate_snowpark(
|
742
809
|
dataset=dataset,
|
@@ -749,6 +816,9 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
749
816
|
drop_input_cols = self._drop_input_cols,
|
750
817
|
expected_output_cols_type="float",
|
751
818
|
)
|
819
|
+
expected_output_cols = self._align_expected_output_names(
|
820
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
821
|
+
)
|
752
822
|
|
753
823
|
elif isinstance(dataset, pd.DataFrame):
|
754
824
|
transform_kwargs = dict(
|
@@ -767,7 +837,7 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
767
837
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
768
838
|
inference_method=inference_method,
|
769
839
|
input_cols=self.input_cols,
|
770
|
-
expected_output_cols=
|
840
|
+
expected_output_cols=expected_output_cols,
|
771
841
|
**transform_kwargs
|
772
842
|
)
|
773
843
|
return output_df
|
@@ -912,50 +982,84 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
912
982
|
)
|
913
983
|
return output_df
|
914
984
|
|
985
|
+
|
986
|
+
|
987
|
+
def to_sklearn(self) -> Any:
|
988
|
+
"""Get sklearn.kernel_approximation.SkewedChi2Sampler object.
|
989
|
+
"""
|
990
|
+
if self._sklearn_object is None:
|
991
|
+
self._sklearn_object = self._create_sklearn_object()
|
992
|
+
return self._sklearn_object
|
993
|
+
|
994
|
+
def to_xgboost(self) -> Any:
|
995
|
+
raise exceptions.SnowflakeMLException(
|
996
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
997
|
+
original_exception=AttributeError(
|
998
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
999
|
+
"to_xgboost()",
|
1000
|
+
"to_sklearn()"
|
1001
|
+
)
|
1002
|
+
),
|
1003
|
+
)
|
1004
|
+
|
1005
|
+
def to_lightgbm(self) -> Any:
|
1006
|
+
raise exceptions.SnowflakeMLException(
|
1007
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1008
|
+
original_exception=AttributeError(
|
1009
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1010
|
+
"to_lightgbm()",
|
1011
|
+
"to_sklearn()"
|
1012
|
+
)
|
1013
|
+
),
|
1014
|
+
)
|
915
1015
|
|
916
|
-
def
|
1016
|
+
def _get_dependencies(self) -> List[str]:
|
1017
|
+
return self._deps
|
1018
|
+
|
1019
|
+
|
1020
|
+
def _generate_model_signatures(self, dataset: Union[DataFrame, pd.DataFrame]) -> None:
|
917
1021
|
self._model_signature_dict = dict()
|
918
1022
|
|
919
1023
|
PROB_FUNCTIONS = ["predict_log_proba", "predict_proba", "decision_function"]
|
920
1024
|
|
921
|
-
inputs = list(_infer_signature(dataset[self.input_cols], "input"))
|
1025
|
+
inputs = list(_infer_signature(dataset[self.input_cols], "input", use_snowflake_identifiers=True))
|
922
1026
|
outputs: List[BaseFeatureSpec] = []
|
923
1027
|
if hasattr(self, "predict"):
|
924
1028
|
# keep mypy happy
|
925
|
-
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
1029
|
+
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
926
1030
|
# For classifier, the type of predict is the same as the type of label
|
927
|
-
if self._sklearn_object._estimator_type ==
|
928
|
-
|
1031
|
+
if self._sklearn_object._estimator_type == "classifier":
|
1032
|
+
# label columns is the desired type for output
|
929
1033
|
outputs = list(_infer_signature(dataset[self.label_cols], "output", use_snowflake_identifiers=True))
|
930
1034
|
# rename the output columns
|
931
1035
|
outputs = list(model_signature_utils.rename_features(outputs, self.output_cols))
|
932
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
933
|
-
|
934
|
-
|
1036
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1037
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1038
|
+
)
|
935
1039
|
# For mixture models that use the density mixin, `predict` returns the argmax of the log prob.
|
936
1040
|
# For outlier models, returns -1 for outliers and 1 for inliers.
|
937
|
-
# Clusterer returns int64 cluster labels.
|
1041
|
+
# Clusterer returns int64 cluster labels.
|
938
1042
|
elif self._sklearn_object._estimator_type in ["DensityEstimator", "clusterer", "outlier_detector"]:
|
939
1043
|
outputs = [FeatureSpec(dtype=DataType.INT64, name=c) for c in self.output_cols]
|
940
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
941
|
-
|
942
|
-
|
943
|
-
|
1044
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1045
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1046
|
+
)
|
1047
|
+
|
944
1048
|
# For regressor, the type of predict is float64
|
945
|
-
elif self._sklearn_object._estimator_type ==
|
1049
|
+
elif self._sklearn_object._estimator_type == "regressor":
|
946
1050
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in self.output_cols]
|
947
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
948
|
-
|
949
|
-
|
950
|
-
|
1051
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1052
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1053
|
+
)
|
1054
|
+
|
951
1055
|
for prob_func in PROB_FUNCTIONS:
|
952
1056
|
if hasattr(self, prob_func):
|
953
1057
|
output_cols_prefix: str = f"{prob_func}_"
|
954
1058
|
output_column_names = self._get_output_column_names(output_cols_prefix)
|
955
1059
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in output_column_names]
|
956
|
-
self._model_signature_dict[prob_func] = ModelSignature(
|
957
|
-
|
958
|
-
|
1060
|
+
self._model_signature_dict[prob_func] = ModelSignature(
|
1061
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1062
|
+
)
|
959
1063
|
|
960
1064
|
# Output signature names may still need to be renamed, since they were not created with `_infer_signature`.
|
961
1065
|
items = list(self._model_signature_dict.items())
|
@@ -968,10 +1072,10 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
968
1072
|
"""Returns model signature of current class.
|
969
1073
|
|
970
1074
|
Raises:
|
971
|
-
|
1075
|
+
SnowflakeMLException: If estimator is not fitted, then model signature cannot be inferred
|
972
1076
|
|
973
1077
|
Returns:
|
974
|
-
Dict
|
1078
|
+
Dict with each method and its input output signature
|
975
1079
|
"""
|
976
1080
|
if self._model_signature_dict is None:
|
977
1081
|
raise exceptions.SnowflakeMLException(
|
@@ -979,35 +1083,3 @@ class SkewedChi2Sampler(BaseTransformer):
|
|
979
1083
|
original_exception=RuntimeError("Estimator not fitted before accessing property model_signatures!"),
|
980
1084
|
)
|
981
1085
|
return self._model_signature_dict
|
982
|
-
|
983
|
-
def to_sklearn(self) -> Any:
|
984
|
-
"""Get sklearn.kernel_approximation.SkewedChi2Sampler object.
|
985
|
-
"""
|
986
|
-
if self._sklearn_object is None:
|
987
|
-
self._sklearn_object = self._create_sklearn_object()
|
988
|
-
return self._sklearn_object
|
989
|
-
|
990
|
-
def to_xgboost(self) -> Any:
|
991
|
-
raise exceptions.SnowflakeMLException(
|
992
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
993
|
-
original_exception=AttributeError(
|
994
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
995
|
-
"to_xgboost()",
|
996
|
-
"to_sklearn()"
|
997
|
-
)
|
998
|
-
),
|
999
|
-
)
|
1000
|
-
|
1001
|
-
def to_lightgbm(self) -> Any:
|
1002
|
-
raise exceptions.SnowflakeMLException(
|
1003
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1004
|
-
original_exception=AttributeError(
|
1005
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1006
|
-
"to_lightgbm()",
|
1007
|
-
"to_sklearn()"
|
1008
|
-
)
|
1009
|
-
),
|
1010
|
-
)
|
1011
|
-
|
1012
|
-
def _get_dependencies(self) -> List[str]:
|
1013
|
-
return self._deps
|