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
|
@@ -277,12 +276,7 @@ class KMeans(BaseTransformer):
|
|
277
276
|
)
|
278
277
|
return selected_cols
|
279
278
|
|
280
|
-
|
281
|
-
project=_PROJECT,
|
282
|
-
subproject=_SUBPROJECT,
|
283
|
-
custom_tags=dict([("autogen", True)]),
|
284
|
-
)
|
285
|
-
def fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "KMeans":
|
279
|
+
def _fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "KMeans":
|
286
280
|
"""Compute k-means clustering
|
287
281
|
For more details on this function, see [sklearn.cluster.KMeans.fit]
|
288
282
|
(https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans.fit)
|
@@ -309,12 +303,14 @@ class KMeans(BaseTransformer):
|
|
309
303
|
|
310
304
|
self._snowpark_cols = dataset.select(self.input_cols).columns
|
311
305
|
|
312
|
-
|
306
|
+
# If we are already in a stored procedure, no need to kick off another one.
|
313
307
|
if SNOWML_SPROC_ENV in os.environ:
|
314
308
|
statement_params = telemetry.get_function_usage_statement_params(
|
315
309
|
project=_PROJECT,
|
316
310
|
subproject=_SUBPROJECT,
|
317
|
-
function_name=telemetry.get_statement_params_full_func_name(
|
311
|
+
function_name=telemetry.get_statement_params_full_func_name(
|
312
|
+
inspect.currentframe(), KMeans.__class__.__name__
|
313
|
+
),
|
318
314
|
api_calls=[Session.call],
|
319
315
|
custom_tags=dict([("autogen", True)]) if self._autogenerated else None,
|
320
316
|
)
|
@@ -335,7 +331,7 @@ class KMeans(BaseTransformer):
|
|
335
331
|
)
|
336
332
|
self._sklearn_object = model_trainer.train()
|
337
333
|
self._is_fitted = True
|
338
|
-
self.
|
334
|
+
self._generate_model_signatures(dataset)
|
339
335
|
return self
|
340
336
|
|
341
337
|
def _batch_inference_validate_snowpark(
|
@@ -411,7 +407,9 @@ class KMeans(BaseTransformer):
|
|
411
407
|
# when it is classifier, infer the datatype from label columns
|
412
408
|
if expected_type_inferred == "" and 'predict' in self.model_signatures:
|
413
409
|
# Batch inference takes a single expected output column type. Use the first columns type for now.
|
414
|
-
label_cols_signatures = [
|
410
|
+
label_cols_signatures = [
|
411
|
+
row for row in self.model_signatures['predict'].outputs if row.name in self.output_cols
|
412
|
+
]
|
415
413
|
if len(label_cols_signatures) == 0:
|
416
414
|
error_str = f"Output columns {self.output_cols} do not match model signatures {self.model_signatures['predict'].outputs}."
|
417
415
|
raise exceptions.SnowflakeMLException(
|
@@ -419,25 +417,22 @@ class KMeans(BaseTransformer):
|
|
419
417
|
original_exception=ValueError(error_str),
|
420
418
|
)
|
421
419
|
|
422
|
-
expected_type_inferred = convert_sp_to_sf_type(
|
423
|
-
label_cols_signatures[0].as_snowpark_type()
|
424
|
-
)
|
420
|
+
expected_type_inferred = convert_sp_to_sf_type(label_cols_signatures[0].as_snowpark_type())
|
425
421
|
|
426
422
|
self._deps = self._batch_inference_validate_snowpark(dataset=dataset, inference_method=inference_method)
|
427
|
-
assert isinstance(
|
423
|
+
assert isinstance(
|
424
|
+
dataset._session, Session
|
425
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
428
426
|
|
429
427
|
transform_kwargs = dict(
|
430
|
-
session
|
431
|
-
dependencies
|
432
|
-
drop_input_cols
|
433
|
-
expected_output_cols_type
|
428
|
+
session=dataset._session,
|
429
|
+
dependencies=self._deps,
|
430
|
+
drop_input_cols=self._drop_input_cols,
|
431
|
+
expected_output_cols_type=expected_type_inferred,
|
434
432
|
)
|
435
433
|
|
436
434
|
elif isinstance(dataset, pd.DataFrame):
|
437
|
-
transform_kwargs = dict(
|
438
|
-
snowpark_input_cols = self._snowpark_cols,
|
439
|
-
drop_input_cols = self._drop_input_cols
|
440
|
-
)
|
435
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
441
436
|
|
442
437
|
transform_handlers = ModelTransformerBuilder.build(
|
443
438
|
dataset=dataset,
|
@@ -479,7 +474,7 @@ class KMeans(BaseTransformer):
|
|
479
474
|
Transformed dataset.
|
480
475
|
"""
|
481
476
|
super()._check_dataset_type(dataset)
|
482
|
-
inference_method="transform"
|
477
|
+
inference_method = "transform"
|
483
478
|
|
484
479
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
485
480
|
# are specific to the type of dataset used.
|
@@ -516,17 +511,14 @@ class KMeans(BaseTransformer):
|
|
516
511
|
assert isinstance(dataset._session, Session) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
517
512
|
|
518
513
|
transform_kwargs = dict(
|
519
|
-
session
|
520
|
-
dependencies
|
521
|
-
drop_input_cols
|
522
|
-
expected_output_cols_type
|
514
|
+
session=dataset._session,
|
515
|
+
dependencies=self._deps,
|
516
|
+
drop_input_cols=self._drop_input_cols,
|
517
|
+
expected_output_cols_type=expected_dtype,
|
523
518
|
)
|
524
519
|
|
525
520
|
elif isinstance(dataset, pd.DataFrame):
|
526
|
-
transform_kwargs = dict(
|
527
|
-
snowpark_input_cols = self._snowpark_cols,
|
528
|
-
drop_input_cols = self._drop_input_cols
|
529
|
-
)
|
521
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
530
522
|
|
531
523
|
transform_handlers = ModelTransformerBuilder.build(
|
532
524
|
dataset=dataset,
|
@@ -545,7 +537,11 @@ class KMeans(BaseTransformer):
|
|
545
537
|
return output_df
|
546
538
|
|
547
539
|
@available_if(original_estimator_has_callable("fit_predict")) # type: ignore[misc]
|
548
|
-
def fit_predict(
|
540
|
+
def fit_predict(
|
541
|
+
self,
|
542
|
+
dataset: Union[DataFrame, pd.DataFrame],
|
543
|
+
output_cols_prefix: str = "fit_predict_",
|
544
|
+
) -> Union[DataFrame, pd.DataFrame]:
|
549
545
|
""" Compute cluster centers and predict cluster index for each sample
|
550
546
|
For more details on this function, see [sklearn.cluster.KMeans.fit_predict]
|
551
547
|
(https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans.fit_predict)
|
@@ -572,7 +568,9 @@ class KMeans(BaseTransformer):
|
|
572
568
|
)
|
573
569
|
output_result, fitted_estimator = model_trainer.train_fit_predict(
|
574
570
|
drop_input_cols=self._drop_input_cols,
|
575
|
-
expected_output_cols_list=
|
571
|
+
expected_output_cols_list=(
|
572
|
+
self.output_cols if self.output_cols else self._get_output_column_names(output_cols_prefix)
|
573
|
+
),
|
576
574
|
)
|
577
575
|
self._sklearn_object = fitted_estimator
|
578
576
|
self._is_fitted = True
|
@@ -589,6 +587,62 @@ class KMeans(BaseTransformer):
|
|
589
587
|
assert self._sklearn_object is not None
|
590
588
|
return self._sklearn_object.embedding_
|
591
589
|
|
590
|
+
|
591
|
+
def _get_output_column_names(self, output_cols_prefix: str, output_cols: Optional[List[str]] = None) -> List[str]:
|
592
|
+
""" Returns the list of output columns for predict_proba(), decision_function(), etc.. functions.
|
593
|
+
Returns a list with output_cols_prefix as the only element if the estimator is not a classifier.
|
594
|
+
"""
|
595
|
+
output_cols_prefix = identifier.resolve_identifier(output_cols_prefix)
|
596
|
+
# The following condition is introduced for kneighbors methods, and not used in other methods
|
597
|
+
if output_cols:
|
598
|
+
output_cols = [
|
599
|
+
identifier.concat_names([output_cols_prefix, identifier.resolve_identifier(c)])
|
600
|
+
for c in output_cols
|
601
|
+
]
|
602
|
+
elif getattr(self._sklearn_object, "classes_", None) is None:
|
603
|
+
output_cols = [output_cols_prefix]
|
604
|
+
elif self._sklearn_object is not None:
|
605
|
+
classes = self._sklearn_object.classes_
|
606
|
+
if isinstance(classes, numpy.ndarray):
|
607
|
+
output_cols = [f'{output_cols_prefix}{str(c)}' for c in classes.tolist()]
|
608
|
+
elif isinstance(classes, list) and len(classes) > 0 and isinstance(classes[0], numpy.ndarray):
|
609
|
+
# If the estimator is a multioutput estimator, classes_ will be a list of ndarrays.
|
610
|
+
output_cols = []
|
611
|
+
for i, cl in enumerate(classes):
|
612
|
+
# For binary classification, there is only one output column for each class
|
613
|
+
# ndarray as the two classes are complementary.
|
614
|
+
if len(cl) == 2:
|
615
|
+
output_cols.append(f'{output_cols_prefix}{i}_{cl[0]}')
|
616
|
+
else:
|
617
|
+
output_cols.extend([
|
618
|
+
f'{output_cols_prefix}{i}_{c}' for c in cl.tolist()
|
619
|
+
])
|
620
|
+
else:
|
621
|
+
output_cols = []
|
622
|
+
|
623
|
+
# Make sure column names are valid snowflake identifiers.
|
624
|
+
assert output_cols is not None # Make MyPy happy
|
625
|
+
rv = [identifier.rename_to_valid_snowflake_identifier(c) for c in output_cols]
|
626
|
+
|
627
|
+
return rv
|
628
|
+
|
629
|
+
def _align_expected_output_names(
|
630
|
+
self, method: str, dataset: DataFrame, expected_output_cols_list: List[str], output_cols_prefix: str
|
631
|
+
) -> List[str]:
|
632
|
+
# in case the inferred output column names dimension is different
|
633
|
+
# we use one line of snowpark dataframe and put it into sklearn estimator using pandas
|
634
|
+
output_df_pd = getattr(self, method)(dataset.limit(1).to_pandas(), output_cols_prefix)
|
635
|
+
output_df_columns = list(output_df_pd.columns)
|
636
|
+
output_df_columns_set: Set[str] = set(output_df_columns) - set(dataset.columns)
|
637
|
+
if self.sample_weight_col:
|
638
|
+
output_df_columns_set -= set(self.sample_weight_col)
|
639
|
+
# if the dimension of inferred output column names is correct; use it
|
640
|
+
if len(expected_output_cols_list) == len(output_df_columns_set):
|
641
|
+
return expected_output_cols_list
|
642
|
+
# otherwise, use the sklearn estimator's output
|
643
|
+
else:
|
644
|
+
return sorted(list(output_df_columns_set), key=lambda x: output_df_columns.index(x))
|
645
|
+
|
592
646
|
@available_if(original_estimator_has_callable("predict_proba")) # type: ignore[misc]
|
593
647
|
@telemetry.send_api_usage_telemetry(
|
594
648
|
project=_PROJECT,
|
@@ -619,24 +673,28 @@ class KMeans(BaseTransformer):
|
|
619
673
|
# are specific to the type of dataset used.
|
620
674
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
621
675
|
|
676
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
677
|
+
|
622
678
|
if isinstance(dataset, DataFrame):
|
623
679
|
self._deps = self._batch_inference_validate_snowpark(
|
624
680
|
dataset=dataset,
|
625
681
|
inference_method=inference_method,
|
626
682
|
)
|
627
|
-
assert isinstance(
|
683
|
+
assert isinstance(
|
684
|
+
dataset._session, Session
|
685
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
628
686
|
transform_kwargs = dict(
|
629
687
|
session=dataset._session,
|
630
688
|
dependencies=self._deps,
|
631
|
-
drop_input_cols
|
689
|
+
drop_input_cols=self._drop_input_cols,
|
632
690
|
expected_output_cols_type="float",
|
633
691
|
)
|
692
|
+
expected_output_cols = self._align_expected_output_names(
|
693
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
694
|
+
)
|
634
695
|
|
635
696
|
elif isinstance(dataset, pd.DataFrame):
|
636
|
-
transform_kwargs = dict(
|
637
|
-
snowpark_input_cols = self._snowpark_cols,
|
638
|
-
drop_input_cols = self._drop_input_cols
|
639
|
-
)
|
697
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
640
698
|
|
641
699
|
transform_handlers = ModelTransformerBuilder.build(
|
642
700
|
dataset=dataset,
|
@@ -648,7 +706,7 @@ class KMeans(BaseTransformer):
|
|
648
706
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
649
707
|
inference_method=inference_method,
|
650
708
|
input_cols=self.input_cols,
|
651
|
-
expected_output_cols=
|
709
|
+
expected_output_cols=expected_output_cols,
|
652
710
|
**transform_kwargs
|
653
711
|
)
|
654
712
|
return output_df
|
@@ -678,7 +736,8 @@ class KMeans(BaseTransformer):
|
|
678
736
|
Output dataset with log probability of the sample for each class in the model.
|
679
737
|
"""
|
680
738
|
super()._check_dataset_type(dataset)
|
681
|
-
inference_method="predict_log_proba"
|
739
|
+
inference_method = "predict_log_proba"
|
740
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
682
741
|
|
683
742
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
684
743
|
# are specific to the type of dataset used.
|
@@ -689,18 +748,20 @@ class KMeans(BaseTransformer):
|
|
689
748
|
dataset=dataset,
|
690
749
|
inference_method=inference_method,
|
691
750
|
)
|
692
|
-
assert isinstance(
|
751
|
+
assert isinstance(
|
752
|
+
dataset._session, Session
|
753
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
693
754
|
transform_kwargs = dict(
|
694
755
|
session=dataset._session,
|
695
756
|
dependencies=self._deps,
|
696
|
-
drop_input_cols
|
757
|
+
drop_input_cols=self._drop_input_cols,
|
697
758
|
expected_output_cols_type="float",
|
698
759
|
)
|
760
|
+
expected_output_cols = self._align_expected_output_names(
|
761
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
762
|
+
)
|
699
763
|
elif isinstance(dataset, pd.DataFrame):
|
700
|
-
transform_kwargs = dict(
|
701
|
-
snowpark_input_cols = self._snowpark_cols,
|
702
|
-
drop_input_cols = self._drop_input_cols
|
703
|
-
)
|
764
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
704
765
|
|
705
766
|
transform_handlers = ModelTransformerBuilder.build(
|
706
767
|
dataset=dataset,
|
@@ -713,7 +774,7 @@ class KMeans(BaseTransformer):
|
|
713
774
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
714
775
|
inference_method=inference_method,
|
715
776
|
input_cols=self.input_cols,
|
716
|
-
expected_output_cols=
|
777
|
+
expected_output_cols=expected_output_cols,
|
717
778
|
**transform_kwargs
|
718
779
|
)
|
719
780
|
return output_df
|
@@ -739,30 +800,34 @@ class KMeans(BaseTransformer):
|
|
739
800
|
Output dataset with results of the decision function for the samples in input dataset.
|
740
801
|
"""
|
741
802
|
super()._check_dataset_type(dataset)
|
742
|
-
inference_method="decision_function"
|
803
|
+
inference_method = "decision_function"
|
743
804
|
|
744
805
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
745
806
|
# are specific to the type of dataset used.
|
746
807
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
747
808
|
|
809
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
810
|
+
|
748
811
|
if isinstance(dataset, DataFrame):
|
749
812
|
self._deps = self._batch_inference_validate_snowpark(
|
750
813
|
dataset=dataset,
|
751
814
|
inference_method=inference_method,
|
752
815
|
)
|
753
|
-
assert isinstance(
|
816
|
+
assert isinstance(
|
817
|
+
dataset._session, Session
|
818
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
754
819
|
transform_kwargs = dict(
|
755
820
|
session=dataset._session,
|
756
821
|
dependencies=self._deps,
|
757
|
-
drop_input_cols
|
822
|
+
drop_input_cols=self._drop_input_cols,
|
758
823
|
expected_output_cols_type="float",
|
759
824
|
)
|
825
|
+
expected_output_cols = self._align_expected_output_names(
|
826
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
827
|
+
)
|
760
828
|
|
761
829
|
elif isinstance(dataset, pd.DataFrame):
|
762
|
-
transform_kwargs = dict(
|
763
|
-
snowpark_input_cols = self._snowpark_cols,
|
764
|
-
drop_input_cols = self._drop_input_cols
|
765
|
-
)
|
830
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
766
831
|
|
767
832
|
transform_handlers = ModelTransformerBuilder.build(
|
768
833
|
dataset=dataset,
|
@@ -775,7 +840,7 @@ class KMeans(BaseTransformer):
|
|
775
840
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
776
841
|
inference_method=inference_method,
|
777
842
|
input_cols=self.input_cols,
|
778
|
-
expected_output_cols=
|
843
|
+
expected_output_cols=expected_output_cols,
|
779
844
|
**transform_kwargs
|
780
845
|
)
|
781
846
|
return output_df
|
@@ -804,12 +869,14 @@ class KMeans(BaseTransformer):
|
|
804
869
|
Output dataset with probability of the sample for each class in the model.
|
805
870
|
"""
|
806
871
|
super()._check_dataset_type(dataset)
|
807
|
-
inference_method="score_samples"
|
872
|
+
inference_method = "score_samples"
|
808
873
|
|
809
874
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
810
875
|
# are specific to the type of dataset used.
|
811
876
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
812
877
|
|
878
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
879
|
+
|
813
880
|
if isinstance(dataset, DataFrame):
|
814
881
|
self._deps = self._batch_inference_validate_snowpark(
|
815
882
|
dataset=dataset,
|
@@ -822,6 +889,9 @@ class KMeans(BaseTransformer):
|
|
822
889
|
drop_input_cols = self._drop_input_cols,
|
823
890
|
expected_output_cols_type="float",
|
824
891
|
)
|
892
|
+
expected_output_cols = self._align_expected_output_names(
|
893
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
894
|
+
)
|
825
895
|
|
826
896
|
elif isinstance(dataset, pd.DataFrame):
|
827
897
|
transform_kwargs = dict(
|
@@ -840,7 +910,7 @@ class KMeans(BaseTransformer):
|
|
840
910
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
841
911
|
inference_method=inference_method,
|
842
912
|
input_cols=self.input_cols,
|
843
|
-
expected_output_cols=
|
913
|
+
expected_output_cols=expected_output_cols,
|
844
914
|
**transform_kwargs
|
845
915
|
)
|
846
916
|
return output_df
|
@@ -987,50 +1057,84 @@ class KMeans(BaseTransformer):
|
|
987
1057
|
)
|
988
1058
|
return output_df
|
989
1059
|
|
1060
|
+
|
1061
|
+
|
1062
|
+
def to_sklearn(self) -> Any:
|
1063
|
+
"""Get sklearn.cluster.KMeans object.
|
1064
|
+
"""
|
1065
|
+
if self._sklearn_object is None:
|
1066
|
+
self._sklearn_object = self._create_sklearn_object()
|
1067
|
+
return self._sklearn_object
|
1068
|
+
|
1069
|
+
def to_xgboost(self) -> Any:
|
1070
|
+
raise exceptions.SnowflakeMLException(
|
1071
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1072
|
+
original_exception=AttributeError(
|
1073
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1074
|
+
"to_xgboost()",
|
1075
|
+
"to_sklearn()"
|
1076
|
+
)
|
1077
|
+
),
|
1078
|
+
)
|
1079
|
+
|
1080
|
+
def to_lightgbm(self) -> Any:
|
1081
|
+
raise exceptions.SnowflakeMLException(
|
1082
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1083
|
+
original_exception=AttributeError(
|
1084
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1085
|
+
"to_lightgbm()",
|
1086
|
+
"to_sklearn()"
|
1087
|
+
)
|
1088
|
+
),
|
1089
|
+
)
|
990
1090
|
|
991
|
-
def
|
1091
|
+
def _get_dependencies(self) -> List[str]:
|
1092
|
+
return self._deps
|
1093
|
+
|
1094
|
+
|
1095
|
+
def _generate_model_signatures(self, dataset: Union[DataFrame, pd.DataFrame]) -> None:
|
992
1096
|
self._model_signature_dict = dict()
|
993
1097
|
|
994
1098
|
PROB_FUNCTIONS = ["predict_log_proba", "predict_proba", "decision_function"]
|
995
1099
|
|
996
|
-
inputs = list(_infer_signature(dataset[self.input_cols], "input"))
|
1100
|
+
inputs = list(_infer_signature(dataset[self.input_cols], "input", use_snowflake_identifiers=True))
|
997
1101
|
outputs: List[BaseFeatureSpec] = []
|
998
1102
|
if hasattr(self, "predict"):
|
999
1103
|
# keep mypy happy
|
1000
|
-
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
1104
|
+
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
1001
1105
|
# For classifier, the type of predict is the same as the type of label
|
1002
|
-
if self._sklearn_object._estimator_type ==
|
1003
|
-
|
1106
|
+
if self._sklearn_object._estimator_type == "classifier":
|
1107
|
+
# label columns is the desired type for output
|
1004
1108
|
outputs = list(_infer_signature(dataset[self.label_cols], "output", use_snowflake_identifiers=True))
|
1005
1109
|
# rename the output columns
|
1006
1110
|
outputs = list(model_signature_utils.rename_features(outputs, self.output_cols))
|
1007
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
1008
|
-
|
1009
|
-
|
1111
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1112
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1113
|
+
)
|
1010
1114
|
# For mixture models that use the density mixin, `predict` returns the argmax of the log prob.
|
1011
1115
|
# For outlier models, returns -1 for outliers and 1 for inliers.
|
1012
|
-
# Clusterer returns int64 cluster labels.
|
1116
|
+
# Clusterer returns int64 cluster labels.
|
1013
1117
|
elif self._sklearn_object._estimator_type in ["DensityEstimator", "clusterer", "outlier_detector"]:
|
1014
1118
|
outputs = [FeatureSpec(dtype=DataType.INT64, name=c) for c in self.output_cols]
|
1015
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
1016
|
-
|
1017
|
-
|
1018
|
-
|
1119
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1120
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1121
|
+
)
|
1122
|
+
|
1019
1123
|
# For regressor, the type of predict is float64
|
1020
|
-
elif self._sklearn_object._estimator_type ==
|
1124
|
+
elif self._sklearn_object._estimator_type == "regressor":
|
1021
1125
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in self.output_cols]
|
1022
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
1023
|
-
|
1024
|
-
|
1025
|
-
|
1126
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1127
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1128
|
+
)
|
1129
|
+
|
1026
1130
|
for prob_func in PROB_FUNCTIONS:
|
1027
1131
|
if hasattr(self, prob_func):
|
1028
1132
|
output_cols_prefix: str = f"{prob_func}_"
|
1029
1133
|
output_column_names = self._get_output_column_names(output_cols_prefix)
|
1030
1134
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in output_column_names]
|
1031
|
-
self._model_signature_dict[prob_func] = ModelSignature(
|
1032
|
-
|
1033
|
-
|
1135
|
+
self._model_signature_dict[prob_func] = ModelSignature(
|
1136
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1137
|
+
)
|
1034
1138
|
|
1035
1139
|
# Output signature names may still need to be renamed, since they were not created with `_infer_signature`.
|
1036
1140
|
items = list(self._model_signature_dict.items())
|
@@ -1043,10 +1147,10 @@ class KMeans(BaseTransformer):
|
|
1043
1147
|
"""Returns model signature of current class.
|
1044
1148
|
|
1045
1149
|
Raises:
|
1046
|
-
|
1150
|
+
SnowflakeMLException: If estimator is not fitted, then model signature cannot be inferred
|
1047
1151
|
|
1048
1152
|
Returns:
|
1049
|
-
Dict
|
1153
|
+
Dict with each method and its input output signature
|
1050
1154
|
"""
|
1051
1155
|
if self._model_signature_dict is None:
|
1052
1156
|
raise exceptions.SnowflakeMLException(
|
@@ -1054,35 +1158,3 @@ class KMeans(BaseTransformer):
|
|
1054
1158
|
original_exception=RuntimeError("Estimator not fitted before accessing property model_signatures!"),
|
1055
1159
|
)
|
1056
1160
|
return self._model_signature_dict
|
1057
|
-
|
1058
|
-
def to_sklearn(self) -> Any:
|
1059
|
-
"""Get sklearn.cluster.KMeans object.
|
1060
|
-
"""
|
1061
|
-
if self._sklearn_object is None:
|
1062
|
-
self._sklearn_object = self._create_sklearn_object()
|
1063
|
-
return self._sklearn_object
|
1064
|
-
|
1065
|
-
def to_xgboost(self) -> Any:
|
1066
|
-
raise exceptions.SnowflakeMLException(
|
1067
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1068
|
-
original_exception=AttributeError(
|
1069
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1070
|
-
"to_xgboost()",
|
1071
|
-
"to_sklearn()"
|
1072
|
-
)
|
1073
|
-
),
|
1074
|
-
)
|
1075
|
-
|
1076
|
-
def to_lightgbm(self) -> Any:
|
1077
|
-
raise exceptions.SnowflakeMLException(
|
1078
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1079
|
-
original_exception=AttributeError(
|
1080
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1081
|
-
"to_lightgbm()",
|
1082
|
-
"to_sklearn()"
|
1083
|
-
)
|
1084
|
-
),
|
1085
|
-
)
|
1086
|
-
|
1087
|
-
def _get_dependencies(self) -> List[str]:
|
1088
|
-
return self._deps
|