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
|
@@ -199,12 +198,7 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
199
198
|
)
|
200
199
|
return selected_cols
|
201
200
|
|
202
|
-
|
203
|
-
project=_PROJECT,
|
204
|
-
subproject=_SUBPROJECT,
|
205
|
-
custom_tags=dict([("autogen", True)]),
|
206
|
-
)
|
207
|
-
def fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "AdditiveChi2Sampler":
|
201
|
+
def _fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "AdditiveChi2Sampler":
|
208
202
|
"""Only validates estimator's parameters
|
209
203
|
For more details on this function, see [sklearn.kernel_approximation.AdditiveChi2Sampler.fit]
|
210
204
|
(https://scikit-learn.org/stable/modules/generated/sklearn.kernel_approximation.AdditiveChi2Sampler.html#sklearn.kernel_approximation.AdditiveChi2Sampler.fit)
|
@@ -231,12 +225,14 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
231
225
|
|
232
226
|
self._snowpark_cols = dataset.select(self.input_cols).columns
|
233
227
|
|
234
|
-
|
228
|
+
# If we are already in a stored procedure, no need to kick off another one.
|
235
229
|
if SNOWML_SPROC_ENV in os.environ:
|
236
230
|
statement_params = telemetry.get_function_usage_statement_params(
|
237
231
|
project=_PROJECT,
|
238
232
|
subproject=_SUBPROJECT,
|
239
|
-
function_name=telemetry.get_statement_params_full_func_name(
|
233
|
+
function_name=telemetry.get_statement_params_full_func_name(
|
234
|
+
inspect.currentframe(), AdditiveChi2Sampler.__class__.__name__
|
235
|
+
),
|
240
236
|
api_calls=[Session.call],
|
241
237
|
custom_tags=dict([("autogen", True)]) if self._autogenerated else None,
|
242
238
|
)
|
@@ -257,7 +253,7 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
257
253
|
)
|
258
254
|
self._sklearn_object = model_trainer.train()
|
259
255
|
self._is_fitted = True
|
260
|
-
self.
|
256
|
+
self._generate_model_signatures(dataset)
|
261
257
|
return self
|
262
258
|
|
263
259
|
def _batch_inference_validate_snowpark(
|
@@ -331,7 +327,9 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
331
327
|
# when it is classifier, infer the datatype from label columns
|
332
328
|
if expected_type_inferred == "" and 'predict' in self.model_signatures:
|
333
329
|
# Batch inference takes a single expected output column type. Use the first columns type for now.
|
334
|
-
label_cols_signatures = [
|
330
|
+
label_cols_signatures = [
|
331
|
+
row for row in self.model_signatures['predict'].outputs if row.name in self.output_cols
|
332
|
+
]
|
335
333
|
if len(label_cols_signatures) == 0:
|
336
334
|
error_str = f"Output columns {self.output_cols} do not match model signatures {self.model_signatures['predict'].outputs}."
|
337
335
|
raise exceptions.SnowflakeMLException(
|
@@ -339,25 +337,22 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
339
337
|
original_exception=ValueError(error_str),
|
340
338
|
)
|
341
339
|
|
342
|
-
expected_type_inferred = convert_sp_to_sf_type(
|
343
|
-
label_cols_signatures[0].as_snowpark_type()
|
344
|
-
)
|
340
|
+
expected_type_inferred = convert_sp_to_sf_type(label_cols_signatures[0].as_snowpark_type())
|
345
341
|
|
346
342
|
self._deps = self._batch_inference_validate_snowpark(dataset=dataset, inference_method=inference_method)
|
347
|
-
assert isinstance(
|
343
|
+
assert isinstance(
|
344
|
+
dataset._session, Session
|
345
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
348
346
|
|
349
347
|
transform_kwargs = dict(
|
350
|
-
session
|
351
|
-
dependencies
|
352
|
-
drop_input_cols
|
353
|
-
expected_output_cols_type
|
348
|
+
session=dataset._session,
|
349
|
+
dependencies=self._deps,
|
350
|
+
drop_input_cols=self._drop_input_cols,
|
351
|
+
expected_output_cols_type=expected_type_inferred,
|
354
352
|
)
|
355
353
|
|
356
354
|
elif isinstance(dataset, pd.DataFrame):
|
357
|
-
transform_kwargs = dict(
|
358
|
-
snowpark_input_cols = self._snowpark_cols,
|
359
|
-
drop_input_cols = self._drop_input_cols
|
360
|
-
)
|
355
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
361
356
|
|
362
357
|
transform_handlers = ModelTransformerBuilder.build(
|
363
358
|
dataset=dataset,
|
@@ -399,7 +394,7 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
399
394
|
Transformed dataset.
|
400
395
|
"""
|
401
396
|
super()._check_dataset_type(dataset)
|
402
|
-
inference_method="transform"
|
397
|
+
inference_method = "transform"
|
403
398
|
|
404
399
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
405
400
|
# are specific to the type of dataset used.
|
@@ -436,17 +431,14 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
436
431
|
assert isinstance(dataset._session, Session) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
437
432
|
|
438
433
|
transform_kwargs = dict(
|
439
|
-
session
|
440
|
-
dependencies
|
441
|
-
drop_input_cols
|
442
|
-
expected_output_cols_type
|
434
|
+
session=dataset._session,
|
435
|
+
dependencies=self._deps,
|
436
|
+
drop_input_cols=self._drop_input_cols,
|
437
|
+
expected_output_cols_type=expected_dtype,
|
443
438
|
)
|
444
439
|
|
445
440
|
elif isinstance(dataset, pd.DataFrame):
|
446
|
-
transform_kwargs = dict(
|
447
|
-
snowpark_input_cols = self._snowpark_cols,
|
448
|
-
drop_input_cols = self._drop_input_cols
|
449
|
-
)
|
441
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
450
442
|
|
451
443
|
transform_handlers = ModelTransformerBuilder.build(
|
452
444
|
dataset=dataset,
|
@@ -465,7 +457,11 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
465
457
|
return output_df
|
466
458
|
|
467
459
|
@available_if(original_estimator_has_callable("fit_predict")) # type: ignore[misc]
|
468
|
-
def fit_predict(
|
460
|
+
def fit_predict(
|
461
|
+
self,
|
462
|
+
dataset: Union[DataFrame, pd.DataFrame],
|
463
|
+
output_cols_prefix: str = "fit_predict_",
|
464
|
+
) -> Union[DataFrame, pd.DataFrame]:
|
469
465
|
""" Method not supported for this class.
|
470
466
|
|
471
467
|
|
@@ -490,7 +486,9 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
490
486
|
)
|
491
487
|
output_result, fitted_estimator = model_trainer.train_fit_predict(
|
492
488
|
drop_input_cols=self._drop_input_cols,
|
493
|
-
expected_output_cols_list=
|
489
|
+
expected_output_cols_list=(
|
490
|
+
self.output_cols if self.output_cols else self._get_output_column_names(output_cols_prefix)
|
491
|
+
),
|
494
492
|
)
|
495
493
|
self._sklearn_object = fitted_estimator
|
496
494
|
self._is_fitted = True
|
@@ -507,6 +505,62 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
507
505
|
assert self._sklearn_object is not None
|
508
506
|
return self._sklearn_object.embedding_
|
509
507
|
|
508
|
+
|
509
|
+
def _get_output_column_names(self, output_cols_prefix: str, output_cols: Optional[List[str]] = None) -> List[str]:
|
510
|
+
""" Returns the list of output columns for predict_proba(), decision_function(), etc.. functions.
|
511
|
+
Returns a list with output_cols_prefix as the only element if the estimator is not a classifier.
|
512
|
+
"""
|
513
|
+
output_cols_prefix = identifier.resolve_identifier(output_cols_prefix)
|
514
|
+
# The following condition is introduced for kneighbors methods, and not used in other methods
|
515
|
+
if output_cols:
|
516
|
+
output_cols = [
|
517
|
+
identifier.concat_names([output_cols_prefix, identifier.resolve_identifier(c)])
|
518
|
+
for c in output_cols
|
519
|
+
]
|
520
|
+
elif getattr(self._sklearn_object, "classes_", None) is None:
|
521
|
+
output_cols = [output_cols_prefix]
|
522
|
+
elif self._sklearn_object is not None:
|
523
|
+
classes = self._sklearn_object.classes_
|
524
|
+
if isinstance(classes, numpy.ndarray):
|
525
|
+
output_cols = [f'{output_cols_prefix}{str(c)}' for c in classes.tolist()]
|
526
|
+
elif isinstance(classes, list) and len(classes) > 0 and isinstance(classes[0], numpy.ndarray):
|
527
|
+
# If the estimator is a multioutput estimator, classes_ will be a list of ndarrays.
|
528
|
+
output_cols = []
|
529
|
+
for i, cl in enumerate(classes):
|
530
|
+
# For binary classification, there is only one output column for each class
|
531
|
+
# ndarray as the two classes are complementary.
|
532
|
+
if len(cl) == 2:
|
533
|
+
output_cols.append(f'{output_cols_prefix}{i}_{cl[0]}')
|
534
|
+
else:
|
535
|
+
output_cols.extend([
|
536
|
+
f'{output_cols_prefix}{i}_{c}' for c in cl.tolist()
|
537
|
+
])
|
538
|
+
else:
|
539
|
+
output_cols = []
|
540
|
+
|
541
|
+
# Make sure column names are valid snowflake identifiers.
|
542
|
+
assert output_cols is not None # Make MyPy happy
|
543
|
+
rv = [identifier.rename_to_valid_snowflake_identifier(c) for c in output_cols]
|
544
|
+
|
545
|
+
return rv
|
546
|
+
|
547
|
+
def _align_expected_output_names(
|
548
|
+
self, method: str, dataset: DataFrame, expected_output_cols_list: List[str], output_cols_prefix: str
|
549
|
+
) -> List[str]:
|
550
|
+
# in case the inferred output column names dimension is different
|
551
|
+
# we use one line of snowpark dataframe and put it into sklearn estimator using pandas
|
552
|
+
output_df_pd = getattr(self, method)(dataset.limit(1).to_pandas(), output_cols_prefix)
|
553
|
+
output_df_columns = list(output_df_pd.columns)
|
554
|
+
output_df_columns_set: Set[str] = set(output_df_columns) - set(dataset.columns)
|
555
|
+
if self.sample_weight_col:
|
556
|
+
output_df_columns_set -= set(self.sample_weight_col)
|
557
|
+
# if the dimension of inferred output column names is correct; use it
|
558
|
+
if len(expected_output_cols_list) == len(output_df_columns_set):
|
559
|
+
return expected_output_cols_list
|
560
|
+
# otherwise, use the sklearn estimator's output
|
561
|
+
else:
|
562
|
+
return sorted(list(output_df_columns_set), key=lambda x: output_df_columns.index(x))
|
563
|
+
|
510
564
|
@available_if(original_estimator_has_callable("predict_proba")) # type: ignore[misc]
|
511
565
|
@telemetry.send_api_usage_telemetry(
|
512
566
|
project=_PROJECT,
|
@@ -537,24 +591,28 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
537
591
|
# are specific to the type of dataset used.
|
538
592
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
539
593
|
|
594
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
595
|
+
|
540
596
|
if isinstance(dataset, DataFrame):
|
541
597
|
self._deps = self._batch_inference_validate_snowpark(
|
542
598
|
dataset=dataset,
|
543
599
|
inference_method=inference_method,
|
544
600
|
)
|
545
|
-
assert isinstance(
|
601
|
+
assert isinstance(
|
602
|
+
dataset._session, Session
|
603
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
546
604
|
transform_kwargs = dict(
|
547
605
|
session=dataset._session,
|
548
606
|
dependencies=self._deps,
|
549
|
-
drop_input_cols
|
607
|
+
drop_input_cols=self._drop_input_cols,
|
550
608
|
expected_output_cols_type="float",
|
551
609
|
)
|
610
|
+
expected_output_cols = self._align_expected_output_names(
|
611
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
612
|
+
)
|
552
613
|
|
553
614
|
elif isinstance(dataset, pd.DataFrame):
|
554
|
-
transform_kwargs = dict(
|
555
|
-
snowpark_input_cols = self._snowpark_cols,
|
556
|
-
drop_input_cols = self._drop_input_cols
|
557
|
-
)
|
615
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
558
616
|
|
559
617
|
transform_handlers = ModelTransformerBuilder.build(
|
560
618
|
dataset=dataset,
|
@@ -566,7 +624,7 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
566
624
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
567
625
|
inference_method=inference_method,
|
568
626
|
input_cols=self.input_cols,
|
569
|
-
expected_output_cols=
|
627
|
+
expected_output_cols=expected_output_cols,
|
570
628
|
**transform_kwargs
|
571
629
|
)
|
572
630
|
return output_df
|
@@ -596,7 +654,8 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
596
654
|
Output dataset with log probability of the sample for each class in the model.
|
597
655
|
"""
|
598
656
|
super()._check_dataset_type(dataset)
|
599
|
-
inference_method="predict_log_proba"
|
657
|
+
inference_method = "predict_log_proba"
|
658
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
600
659
|
|
601
660
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
602
661
|
# are specific to the type of dataset used.
|
@@ -607,18 +666,20 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
607
666
|
dataset=dataset,
|
608
667
|
inference_method=inference_method,
|
609
668
|
)
|
610
|
-
assert isinstance(
|
669
|
+
assert isinstance(
|
670
|
+
dataset._session, Session
|
671
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
611
672
|
transform_kwargs = dict(
|
612
673
|
session=dataset._session,
|
613
674
|
dependencies=self._deps,
|
614
|
-
drop_input_cols
|
675
|
+
drop_input_cols=self._drop_input_cols,
|
615
676
|
expected_output_cols_type="float",
|
616
677
|
)
|
678
|
+
expected_output_cols = self._align_expected_output_names(
|
679
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
680
|
+
)
|
617
681
|
elif isinstance(dataset, pd.DataFrame):
|
618
|
-
transform_kwargs = dict(
|
619
|
-
snowpark_input_cols = self._snowpark_cols,
|
620
|
-
drop_input_cols = self._drop_input_cols
|
621
|
-
)
|
682
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
622
683
|
|
623
684
|
transform_handlers = ModelTransformerBuilder.build(
|
624
685
|
dataset=dataset,
|
@@ -631,7 +692,7 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
631
692
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
632
693
|
inference_method=inference_method,
|
633
694
|
input_cols=self.input_cols,
|
634
|
-
expected_output_cols=
|
695
|
+
expected_output_cols=expected_output_cols,
|
635
696
|
**transform_kwargs
|
636
697
|
)
|
637
698
|
return output_df
|
@@ -657,30 +718,34 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
657
718
|
Output dataset with results of the decision function for the samples in input dataset.
|
658
719
|
"""
|
659
720
|
super()._check_dataset_type(dataset)
|
660
|
-
inference_method="decision_function"
|
721
|
+
inference_method = "decision_function"
|
661
722
|
|
662
723
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
663
724
|
# are specific to the type of dataset used.
|
664
725
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
665
726
|
|
727
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
728
|
+
|
666
729
|
if isinstance(dataset, DataFrame):
|
667
730
|
self._deps = self._batch_inference_validate_snowpark(
|
668
731
|
dataset=dataset,
|
669
732
|
inference_method=inference_method,
|
670
733
|
)
|
671
|
-
assert isinstance(
|
734
|
+
assert isinstance(
|
735
|
+
dataset._session, Session
|
736
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
672
737
|
transform_kwargs = dict(
|
673
738
|
session=dataset._session,
|
674
739
|
dependencies=self._deps,
|
675
|
-
drop_input_cols
|
740
|
+
drop_input_cols=self._drop_input_cols,
|
676
741
|
expected_output_cols_type="float",
|
677
742
|
)
|
743
|
+
expected_output_cols = self._align_expected_output_names(
|
744
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
745
|
+
)
|
678
746
|
|
679
747
|
elif isinstance(dataset, pd.DataFrame):
|
680
|
-
transform_kwargs = dict(
|
681
|
-
snowpark_input_cols = self._snowpark_cols,
|
682
|
-
drop_input_cols = self._drop_input_cols
|
683
|
-
)
|
748
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
684
749
|
|
685
750
|
transform_handlers = ModelTransformerBuilder.build(
|
686
751
|
dataset=dataset,
|
@@ -693,7 +758,7 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
693
758
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
694
759
|
inference_method=inference_method,
|
695
760
|
input_cols=self.input_cols,
|
696
|
-
expected_output_cols=
|
761
|
+
expected_output_cols=expected_output_cols,
|
697
762
|
**transform_kwargs
|
698
763
|
)
|
699
764
|
return output_df
|
@@ -722,12 +787,14 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
722
787
|
Output dataset with probability of the sample for each class in the model.
|
723
788
|
"""
|
724
789
|
super()._check_dataset_type(dataset)
|
725
|
-
inference_method="score_samples"
|
790
|
+
inference_method = "score_samples"
|
726
791
|
|
727
792
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
728
793
|
# are specific to the type of dataset used.
|
729
794
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
730
795
|
|
796
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
797
|
+
|
731
798
|
if isinstance(dataset, DataFrame):
|
732
799
|
self._deps = self._batch_inference_validate_snowpark(
|
733
800
|
dataset=dataset,
|
@@ -740,6 +807,9 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
740
807
|
drop_input_cols = self._drop_input_cols,
|
741
808
|
expected_output_cols_type="float",
|
742
809
|
)
|
810
|
+
expected_output_cols = self._align_expected_output_names(
|
811
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
812
|
+
)
|
743
813
|
|
744
814
|
elif isinstance(dataset, pd.DataFrame):
|
745
815
|
transform_kwargs = dict(
|
@@ -758,7 +828,7 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
758
828
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
759
829
|
inference_method=inference_method,
|
760
830
|
input_cols=self.input_cols,
|
761
|
-
expected_output_cols=
|
831
|
+
expected_output_cols=expected_output_cols,
|
762
832
|
**transform_kwargs
|
763
833
|
)
|
764
834
|
return output_df
|
@@ -903,50 +973,84 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
903
973
|
)
|
904
974
|
return output_df
|
905
975
|
|
976
|
+
|
977
|
+
|
978
|
+
def to_sklearn(self) -> Any:
|
979
|
+
"""Get sklearn.kernel_approximation.AdditiveChi2Sampler object.
|
980
|
+
"""
|
981
|
+
if self._sklearn_object is None:
|
982
|
+
self._sklearn_object = self._create_sklearn_object()
|
983
|
+
return self._sklearn_object
|
984
|
+
|
985
|
+
def to_xgboost(self) -> Any:
|
986
|
+
raise exceptions.SnowflakeMLException(
|
987
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
988
|
+
original_exception=AttributeError(
|
989
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
990
|
+
"to_xgboost()",
|
991
|
+
"to_sklearn()"
|
992
|
+
)
|
993
|
+
),
|
994
|
+
)
|
995
|
+
|
996
|
+
def to_lightgbm(self) -> Any:
|
997
|
+
raise exceptions.SnowflakeMLException(
|
998
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
999
|
+
original_exception=AttributeError(
|
1000
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1001
|
+
"to_lightgbm()",
|
1002
|
+
"to_sklearn()"
|
1003
|
+
)
|
1004
|
+
),
|
1005
|
+
)
|
906
1006
|
|
907
|
-
def
|
1007
|
+
def _get_dependencies(self) -> List[str]:
|
1008
|
+
return self._deps
|
1009
|
+
|
1010
|
+
|
1011
|
+
def _generate_model_signatures(self, dataset: Union[DataFrame, pd.DataFrame]) -> None:
|
908
1012
|
self._model_signature_dict = dict()
|
909
1013
|
|
910
1014
|
PROB_FUNCTIONS = ["predict_log_proba", "predict_proba", "decision_function"]
|
911
1015
|
|
912
|
-
inputs = list(_infer_signature(dataset[self.input_cols], "input"))
|
1016
|
+
inputs = list(_infer_signature(dataset[self.input_cols], "input", use_snowflake_identifiers=True))
|
913
1017
|
outputs: List[BaseFeatureSpec] = []
|
914
1018
|
if hasattr(self, "predict"):
|
915
1019
|
# keep mypy happy
|
916
|
-
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
1020
|
+
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
917
1021
|
# For classifier, the type of predict is the same as the type of label
|
918
|
-
if self._sklearn_object._estimator_type ==
|
919
|
-
|
1022
|
+
if self._sklearn_object._estimator_type == "classifier":
|
1023
|
+
# label columns is the desired type for output
|
920
1024
|
outputs = list(_infer_signature(dataset[self.label_cols], "output", use_snowflake_identifiers=True))
|
921
1025
|
# rename the output columns
|
922
1026
|
outputs = list(model_signature_utils.rename_features(outputs, self.output_cols))
|
923
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
924
|
-
|
925
|
-
|
1027
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1028
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1029
|
+
)
|
926
1030
|
# For mixture models that use the density mixin, `predict` returns the argmax of the log prob.
|
927
1031
|
# For outlier models, returns -1 for outliers and 1 for inliers.
|
928
|
-
# Clusterer returns int64 cluster labels.
|
1032
|
+
# Clusterer returns int64 cluster labels.
|
929
1033
|
elif self._sklearn_object._estimator_type in ["DensityEstimator", "clusterer", "outlier_detector"]:
|
930
1034
|
outputs = [FeatureSpec(dtype=DataType.INT64, name=c) for c in self.output_cols]
|
931
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
932
|
-
|
933
|
-
|
934
|
-
|
1035
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1036
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1037
|
+
)
|
1038
|
+
|
935
1039
|
# For regressor, the type of predict is float64
|
936
|
-
elif self._sklearn_object._estimator_type ==
|
1040
|
+
elif self._sklearn_object._estimator_type == "regressor":
|
937
1041
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in self.output_cols]
|
938
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
939
|
-
|
940
|
-
|
941
|
-
|
1042
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1043
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1044
|
+
)
|
1045
|
+
|
942
1046
|
for prob_func in PROB_FUNCTIONS:
|
943
1047
|
if hasattr(self, prob_func):
|
944
1048
|
output_cols_prefix: str = f"{prob_func}_"
|
945
1049
|
output_column_names = self._get_output_column_names(output_cols_prefix)
|
946
1050
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in output_column_names]
|
947
|
-
self._model_signature_dict[prob_func] = ModelSignature(
|
948
|
-
|
949
|
-
|
1051
|
+
self._model_signature_dict[prob_func] = ModelSignature(
|
1052
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1053
|
+
)
|
950
1054
|
|
951
1055
|
# Output signature names may still need to be renamed, since they were not created with `_infer_signature`.
|
952
1056
|
items = list(self._model_signature_dict.items())
|
@@ -959,10 +1063,10 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
959
1063
|
"""Returns model signature of current class.
|
960
1064
|
|
961
1065
|
Raises:
|
962
|
-
|
1066
|
+
SnowflakeMLException: If estimator is not fitted, then model signature cannot be inferred
|
963
1067
|
|
964
1068
|
Returns:
|
965
|
-
Dict
|
1069
|
+
Dict with each method and its input output signature
|
966
1070
|
"""
|
967
1071
|
if self._model_signature_dict is None:
|
968
1072
|
raise exceptions.SnowflakeMLException(
|
@@ -970,35 +1074,3 @@ class AdditiveChi2Sampler(BaseTransformer):
|
|
970
1074
|
original_exception=RuntimeError("Estimator not fitted before accessing property model_signatures!"),
|
971
1075
|
)
|
972
1076
|
return self._model_signature_dict
|
973
|
-
|
974
|
-
def to_sklearn(self) -> Any:
|
975
|
-
"""Get sklearn.kernel_approximation.AdditiveChi2Sampler object.
|
976
|
-
"""
|
977
|
-
if self._sklearn_object is None:
|
978
|
-
self._sklearn_object = self._create_sklearn_object()
|
979
|
-
return self._sklearn_object
|
980
|
-
|
981
|
-
def to_xgboost(self) -> Any:
|
982
|
-
raise exceptions.SnowflakeMLException(
|
983
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
984
|
-
original_exception=AttributeError(
|
985
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
986
|
-
"to_xgboost()",
|
987
|
-
"to_sklearn()"
|
988
|
-
)
|
989
|
-
),
|
990
|
-
)
|
991
|
-
|
992
|
-
def to_lightgbm(self) -> Any:
|
993
|
-
raise exceptions.SnowflakeMLException(
|
994
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
995
|
-
original_exception=AttributeError(
|
996
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
997
|
-
"to_lightgbm()",
|
998
|
-
"to_sklearn()"
|
999
|
-
)
|
1000
|
-
),
|
1001
|
-
)
|
1002
|
-
|
1003
|
-
def _get_dependencies(self) -> List[str]:
|
1004
|
-
return self._deps
|