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
|
@@ -257,12 +256,7 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
257
256
|
)
|
258
257
|
return selected_cols
|
259
258
|
|
260
|
-
|
261
|
-
project=_PROJECT,
|
262
|
-
subproject=_SUBPROJECT,
|
263
|
-
custom_tags=dict([("autogen", True)]),
|
264
|
-
)
|
265
|
-
def fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "LinearDiscriminantAnalysis":
|
259
|
+
def _fit(self, dataset: Union[DataFrame, pd.DataFrame]) -> "LinearDiscriminantAnalysis":
|
266
260
|
"""Fit the Linear Discriminant Analysis model
|
267
261
|
For more details on this function, see [sklearn.discriminant_analysis.LinearDiscriminantAnalysis.fit]
|
268
262
|
(https://scikit-learn.org/stable/modules/generated/sklearn.discriminant_analysis.LinearDiscriminantAnalysis.html#sklearn.discriminant_analysis.LinearDiscriminantAnalysis.fit)
|
@@ -289,12 +283,14 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
289
283
|
|
290
284
|
self._snowpark_cols = dataset.select(self.input_cols).columns
|
291
285
|
|
292
|
-
|
286
|
+
# If we are already in a stored procedure, no need to kick off another one.
|
293
287
|
if SNOWML_SPROC_ENV in os.environ:
|
294
288
|
statement_params = telemetry.get_function_usage_statement_params(
|
295
289
|
project=_PROJECT,
|
296
290
|
subproject=_SUBPROJECT,
|
297
|
-
function_name=telemetry.get_statement_params_full_func_name(
|
291
|
+
function_name=telemetry.get_statement_params_full_func_name(
|
292
|
+
inspect.currentframe(), LinearDiscriminantAnalysis.__class__.__name__
|
293
|
+
),
|
298
294
|
api_calls=[Session.call],
|
299
295
|
custom_tags=dict([("autogen", True)]) if self._autogenerated else None,
|
300
296
|
)
|
@@ -315,7 +311,7 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
315
311
|
)
|
316
312
|
self._sklearn_object = model_trainer.train()
|
317
313
|
self._is_fitted = True
|
318
|
-
self.
|
314
|
+
self._generate_model_signatures(dataset)
|
319
315
|
return self
|
320
316
|
|
321
317
|
def _batch_inference_validate_snowpark(
|
@@ -391,7 +387,9 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
391
387
|
# when it is classifier, infer the datatype from label columns
|
392
388
|
if expected_type_inferred == "" and 'predict' in self.model_signatures:
|
393
389
|
# Batch inference takes a single expected output column type. Use the first columns type for now.
|
394
|
-
label_cols_signatures = [
|
390
|
+
label_cols_signatures = [
|
391
|
+
row for row in self.model_signatures['predict'].outputs if row.name in self.output_cols
|
392
|
+
]
|
395
393
|
if len(label_cols_signatures) == 0:
|
396
394
|
error_str = f"Output columns {self.output_cols} do not match model signatures {self.model_signatures['predict'].outputs}."
|
397
395
|
raise exceptions.SnowflakeMLException(
|
@@ -399,25 +397,22 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
399
397
|
original_exception=ValueError(error_str),
|
400
398
|
)
|
401
399
|
|
402
|
-
expected_type_inferred = convert_sp_to_sf_type(
|
403
|
-
label_cols_signatures[0].as_snowpark_type()
|
404
|
-
)
|
400
|
+
expected_type_inferred = convert_sp_to_sf_type(label_cols_signatures[0].as_snowpark_type())
|
405
401
|
|
406
402
|
self._deps = self._batch_inference_validate_snowpark(dataset=dataset, inference_method=inference_method)
|
407
|
-
assert isinstance(
|
403
|
+
assert isinstance(
|
404
|
+
dataset._session, Session
|
405
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
408
406
|
|
409
407
|
transform_kwargs = dict(
|
410
|
-
session
|
411
|
-
dependencies
|
412
|
-
drop_input_cols
|
413
|
-
expected_output_cols_type
|
408
|
+
session=dataset._session,
|
409
|
+
dependencies=self._deps,
|
410
|
+
drop_input_cols=self._drop_input_cols,
|
411
|
+
expected_output_cols_type=expected_type_inferred,
|
414
412
|
)
|
415
413
|
|
416
414
|
elif isinstance(dataset, pd.DataFrame):
|
417
|
-
transform_kwargs = dict(
|
418
|
-
snowpark_input_cols = self._snowpark_cols,
|
419
|
-
drop_input_cols = self._drop_input_cols
|
420
|
-
)
|
415
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
421
416
|
|
422
417
|
transform_handlers = ModelTransformerBuilder.build(
|
423
418
|
dataset=dataset,
|
@@ -459,7 +454,7 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
459
454
|
Transformed dataset.
|
460
455
|
"""
|
461
456
|
super()._check_dataset_type(dataset)
|
462
|
-
inference_method="transform"
|
457
|
+
inference_method = "transform"
|
463
458
|
|
464
459
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
465
460
|
# are specific to the type of dataset used.
|
@@ -496,17 +491,14 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
496
491
|
assert isinstance(dataset._session, Session) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
497
492
|
|
498
493
|
transform_kwargs = dict(
|
499
|
-
session
|
500
|
-
dependencies
|
501
|
-
drop_input_cols
|
502
|
-
expected_output_cols_type
|
494
|
+
session=dataset._session,
|
495
|
+
dependencies=self._deps,
|
496
|
+
drop_input_cols=self._drop_input_cols,
|
497
|
+
expected_output_cols_type=expected_dtype,
|
503
498
|
)
|
504
499
|
|
505
500
|
elif isinstance(dataset, pd.DataFrame):
|
506
|
-
transform_kwargs = dict(
|
507
|
-
snowpark_input_cols = self._snowpark_cols,
|
508
|
-
drop_input_cols = self._drop_input_cols
|
509
|
-
)
|
501
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
510
502
|
|
511
503
|
transform_handlers = ModelTransformerBuilder.build(
|
512
504
|
dataset=dataset,
|
@@ -525,7 +517,11 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
525
517
|
return output_df
|
526
518
|
|
527
519
|
@available_if(original_estimator_has_callable("fit_predict")) # type: ignore[misc]
|
528
|
-
def fit_predict(
|
520
|
+
def fit_predict(
|
521
|
+
self,
|
522
|
+
dataset: Union[DataFrame, pd.DataFrame],
|
523
|
+
output_cols_prefix: str = "fit_predict_",
|
524
|
+
) -> Union[DataFrame, pd.DataFrame]:
|
529
525
|
""" Method not supported for this class.
|
530
526
|
|
531
527
|
|
@@ -550,7 +546,9 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
550
546
|
)
|
551
547
|
output_result, fitted_estimator = model_trainer.train_fit_predict(
|
552
548
|
drop_input_cols=self._drop_input_cols,
|
553
|
-
expected_output_cols_list=
|
549
|
+
expected_output_cols_list=(
|
550
|
+
self.output_cols if self.output_cols else self._get_output_column_names(output_cols_prefix)
|
551
|
+
),
|
554
552
|
)
|
555
553
|
self._sklearn_object = fitted_estimator
|
556
554
|
self._is_fitted = True
|
@@ -567,6 +565,62 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
567
565
|
assert self._sklearn_object is not None
|
568
566
|
return self._sklearn_object.embedding_
|
569
567
|
|
568
|
+
|
569
|
+
def _get_output_column_names(self, output_cols_prefix: str, output_cols: Optional[List[str]] = None) -> List[str]:
|
570
|
+
""" Returns the list of output columns for predict_proba(), decision_function(), etc.. functions.
|
571
|
+
Returns a list with output_cols_prefix as the only element if the estimator is not a classifier.
|
572
|
+
"""
|
573
|
+
output_cols_prefix = identifier.resolve_identifier(output_cols_prefix)
|
574
|
+
# The following condition is introduced for kneighbors methods, and not used in other methods
|
575
|
+
if output_cols:
|
576
|
+
output_cols = [
|
577
|
+
identifier.concat_names([output_cols_prefix, identifier.resolve_identifier(c)])
|
578
|
+
for c in output_cols
|
579
|
+
]
|
580
|
+
elif getattr(self._sklearn_object, "classes_", None) is None:
|
581
|
+
output_cols = [output_cols_prefix]
|
582
|
+
elif self._sklearn_object is not None:
|
583
|
+
classes = self._sklearn_object.classes_
|
584
|
+
if isinstance(classes, numpy.ndarray):
|
585
|
+
output_cols = [f'{output_cols_prefix}{str(c)}' for c in classes.tolist()]
|
586
|
+
elif isinstance(classes, list) and len(classes) > 0 and isinstance(classes[0], numpy.ndarray):
|
587
|
+
# If the estimator is a multioutput estimator, classes_ will be a list of ndarrays.
|
588
|
+
output_cols = []
|
589
|
+
for i, cl in enumerate(classes):
|
590
|
+
# For binary classification, there is only one output column for each class
|
591
|
+
# ndarray as the two classes are complementary.
|
592
|
+
if len(cl) == 2:
|
593
|
+
output_cols.append(f'{output_cols_prefix}{i}_{cl[0]}')
|
594
|
+
else:
|
595
|
+
output_cols.extend([
|
596
|
+
f'{output_cols_prefix}{i}_{c}' for c in cl.tolist()
|
597
|
+
])
|
598
|
+
else:
|
599
|
+
output_cols = []
|
600
|
+
|
601
|
+
# Make sure column names are valid snowflake identifiers.
|
602
|
+
assert output_cols is not None # Make MyPy happy
|
603
|
+
rv = [identifier.rename_to_valid_snowflake_identifier(c) for c in output_cols]
|
604
|
+
|
605
|
+
return rv
|
606
|
+
|
607
|
+
def _align_expected_output_names(
|
608
|
+
self, method: str, dataset: DataFrame, expected_output_cols_list: List[str], output_cols_prefix: str
|
609
|
+
) -> List[str]:
|
610
|
+
# in case the inferred output column names dimension is different
|
611
|
+
# we use one line of snowpark dataframe and put it into sklearn estimator using pandas
|
612
|
+
output_df_pd = getattr(self, method)(dataset.limit(1).to_pandas(), output_cols_prefix)
|
613
|
+
output_df_columns = list(output_df_pd.columns)
|
614
|
+
output_df_columns_set: Set[str] = set(output_df_columns) - set(dataset.columns)
|
615
|
+
if self.sample_weight_col:
|
616
|
+
output_df_columns_set -= set(self.sample_weight_col)
|
617
|
+
# if the dimension of inferred output column names is correct; use it
|
618
|
+
if len(expected_output_cols_list) == len(output_df_columns_set):
|
619
|
+
return expected_output_cols_list
|
620
|
+
# otherwise, use the sklearn estimator's output
|
621
|
+
else:
|
622
|
+
return sorted(list(output_df_columns_set), key=lambda x: output_df_columns.index(x))
|
623
|
+
|
570
624
|
@available_if(original_estimator_has_callable("predict_proba")) # type: ignore[misc]
|
571
625
|
@telemetry.send_api_usage_telemetry(
|
572
626
|
project=_PROJECT,
|
@@ -599,24 +653,28 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
599
653
|
# are specific to the type of dataset used.
|
600
654
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
601
655
|
|
656
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
657
|
+
|
602
658
|
if isinstance(dataset, DataFrame):
|
603
659
|
self._deps = self._batch_inference_validate_snowpark(
|
604
660
|
dataset=dataset,
|
605
661
|
inference_method=inference_method,
|
606
662
|
)
|
607
|
-
assert isinstance(
|
663
|
+
assert isinstance(
|
664
|
+
dataset._session, Session
|
665
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
608
666
|
transform_kwargs = dict(
|
609
667
|
session=dataset._session,
|
610
668
|
dependencies=self._deps,
|
611
|
-
drop_input_cols
|
669
|
+
drop_input_cols=self._drop_input_cols,
|
612
670
|
expected_output_cols_type="float",
|
613
671
|
)
|
672
|
+
expected_output_cols = self._align_expected_output_names(
|
673
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
674
|
+
)
|
614
675
|
|
615
676
|
elif isinstance(dataset, pd.DataFrame):
|
616
|
-
transform_kwargs = dict(
|
617
|
-
snowpark_input_cols = self._snowpark_cols,
|
618
|
-
drop_input_cols = self._drop_input_cols
|
619
|
-
)
|
677
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
620
678
|
|
621
679
|
transform_handlers = ModelTransformerBuilder.build(
|
622
680
|
dataset=dataset,
|
@@ -628,7 +686,7 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
628
686
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
629
687
|
inference_method=inference_method,
|
630
688
|
input_cols=self.input_cols,
|
631
|
-
expected_output_cols=
|
689
|
+
expected_output_cols=expected_output_cols,
|
632
690
|
**transform_kwargs
|
633
691
|
)
|
634
692
|
return output_df
|
@@ -660,7 +718,8 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
660
718
|
Output dataset with log probability of the sample for each class in the model.
|
661
719
|
"""
|
662
720
|
super()._check_dataset_type(dataset)
|
663
|
-
inference_method="predict_log_proba"
|
721
|
+
inference_method = "predict_log_proba"
|
722
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
664
723
|
|
665
724
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
666
725
|
# are specific to the type of dataset used.
|
@@ -671,18 +730,20 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
671
730
|
dataset=dataset,
|
672
731
|
inference_method=inference_method,
|
673
732
|
)
|
674
|
-
assert isinstance(
|
733
|
+
assert isinstance(
|
734
|
+
dataset._session, Session
|
735
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
675
736
|
transform_kwargs = dict(
|
676
737
|
session=dataset._session,
|
677
738
|
dependencies=self._deps,
|
678
|
-
drop_input_cols
|
739
|
+
drop_input_cols=self._drop_input_cols,
|
679
740
|
expected_output_cols_type="float",
|
680
741
|
)
|
742
|
+
expected_output_cols = self._align_expected_output_names(
|
743
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
744
|
+
)
|
681
745
|
elif isinstance(dataset, pd.DataFrame):
|
682
|
-
transform_kwargs = dict(
|
683
|
-
snowpark_input_cols = self._snowpark_cols,
|
684
|
-
drop_input_cols = self._drop_input_cols
|
685
|
-
)
|
746
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
686
747
|
|
687
748
|
transform_handlers = ModelTransformerBuilder.build(
|
688
749
|
dataset=dataset,
|
@@ -695,7 +756,7 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
695
756
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
696
757
|
inference_method=inference_method,
|
697
758
|
input_cols=self.input_cols,
|
698
|
-
expected_output_cols=
|
759
|
+
expected_output_cols=expected_output_cols,
|
699
760
|
**transform_kwargs
|
700
761
|
)
|
701
762
|
return output_df
|
@@ -723,30 +784,34 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
723
784
|
Output dataset with results of the decision function for the samples in input dataset.
|
724
785
|
"""
|
725
786
|
super()._check_dataset_type(dataset)
|
726
|
-
inference_method="decision_function"
|
787
|
+
inference_method = "decision_function"
|
727
788
|
|
728
789
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
729
790
|
# are specific to the type of dataset used.
|
730
791
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
731
792
|
|
793
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
794
|
+
|
732
795
|
if isinstance(dataset, DataFrame):
|
733
796
|
self._deps = self._batch_inference_validate_snowpark(
|
734
797
|
dataset=dataset,
|
735
798
|
inference_method=inference_method,
|
736
799
|
)
|
737
|
-
assert isinstance(
|
800
|
+
assert isinstance(
|
801
|
+
dataset._session, Session
|
802
|
+
) # mypy does not recognize the check in _batch_inference_validate_snowpark()
|
738
803
|
transform_kwargs = dict(
|
739
804
|
session=dataset._session,
|
740
805
|
dependencies=self._deps,
|
741
|
-
drop_input_cols
|
806
|
+
drop_input_cols=self._drop_input_cols,
|
742
807
|
expected_output_cols_type="float",
|
743
808
|
)
|
809
|
+
expected_output_cols = self._align_expected_output_names(
|
810
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
811
|
+
)
|
744
812
|
|
745
813
|
elif isinstance(dataset, pd.DataFrame):
|
746
|
-
transform_kwargs = dict(
|
747
|
-
snowpark_input_cols = self._snowpark_cols,
|
748
|
-
drop_input_cols = self._drop_input_cols
|
749
|
-
)
|
814
|
+
transform_kwargs = dict(snowpark_input_cols=self._snowpark_cols, drop_input_cols=self._drop_input_cols)
|
750
815
|
|
751
816
|
transform_handlers = ModelTransformerBuilder.build(
|
752
817
|
dataset=dataset,
|
@@ -759,7 +824,7 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
759
824
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
760
825
|
inference_method=inference_method,
|
761
826
|
input_cols=self.input_cols,
|
762
|
-
expected_output_cols=
|
827
|
+
expected_output_cols=expected_output_cols,
|
763
828
|
**transform_kwargs
|
764
829
|
)
|
765
830
|
return output_df
|
@@ -788,12 +853,14 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
788
853
|
Output dataset with probability of the sample for each class in the model.
|
789
854
|
"""
|
790
855
|
super()._check_dataset_type(dataset)
|
791
|
-
inference_method="score_samples"
|
856
|
+
inference_method = "score_samples"
|
792
857
|
|
793
858
|
# This dictionary contains optional kwargs for batch inference. These kwargs
|
794
859
|
# are specific to the type of dataset used.
|
795
860
|
transform_kwargs: BatchInferenceKwargsTypedDict = dict()
|
796
861
|
|
862
|
+
expected_output_cols = self._get_output_column_names(output_cols_prefix)
|
863
|
+
|
797
864
|
if isinstance(dataset, DataFrame):
|
798
865
|
self._deps = self._batch_inference_validate_snowpark(
|
799
866
|
dataset=dataset,
|
@@ -806,6 +873,9 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
806
873
|
drop_input_cols = self._drop_input_cols,
|
807
874
|
expected_output_cols_type="float",
|
808
875
|
)
|
876
|
+
expected_output_cols = self._align_expected_output_names(
|
877
|
+
inference_method, dataset, expected_output_cols, output_cols_prefix
|
878
|
+
)
|
809
879
|
|
810
880
|
elif isinstance(dataset, pd.DataFrame):
|
811
881
|
transform_kwargs = dict(
|
@@ -824,7 +894,7 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
824
894
|
output_df: DATAFRAME_TYPE = transform_handlers.batch_inference(
|
825
895
|
inference_method=inference_method,
|
826
896
|
input_cols=self.input_cols,
|
827
|
-
expected_output_cols=
|
897
|
+
expected_output_cols=expected_output_cols,
|
828
898
|
**transform_kwargs
|
829
899
|
)
|
830
900
|
return output_df
|
@@ -971,50 +1041,84 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
971
1041
|
)
|
972
1042
|
return output_df
|
973
1043
|
|
1044
|
+
|
1045
|
+
|
1046
|
+
def to_sklearn(self) -> Any:
|
1047
|
+
"""Get sklearn.discriminant_analysis.LinearDiscriminantAnalysis object.
|
1048
|
+
"""
|
1049
|
+
if self._sklearn_object is None:
|
1050
|
+
self._sklearn_object = self._create_sklearn_object()
|
1051
|
+
return self._sklearn_object
|
1052
|
+
|
1053
|
+
def to_xgboost(self) -> Any:
|
1054
|
+
raise exceptions.SnowflakeMLException(
|
1055
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1056
|
+
original_exception=AttributeError(
|
1057
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1058
|
+
"to_xgboost()",
|
1059
|
+
"to_sklearn()"
|
1060
|
+
)
|
1061
|
+
),
|
1062
|
+
)
|
1063
|
+
|
1064
|
+
def to_lightgbm(self) -> Any:
|
1065
|
+
raise exceptions.SnowflakeMLException(
|
1066
|
+
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1067
|
+
original_exception=AttributeError(
|
1068
|
+
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1069
|
+
"to_lightgbm()",
|
1070
|
+
"to_sklearn()"
|
1071
|
+
)
|
1072
|
+
),
|
1073
|
+
)
|
974
1074
|
|
975
|
-
def
|
1075
|
+
def _get_dependencies(self) -> List[str]:
|
1076
|
+
return self._deps
|
1077
|
+
|
1078
|
+
|
1079
|
+
def _generate_model_signatures(self, dataset: Union[DataFrame, pd.DataFrame]) -> None:
|
976
1080
|
self._model_signature_dict = dict()
|
977
1081
|
|
978
1082
|
PROB_FUNCTIONS = ["predict_log_proba", "predict_proba", "decision_function"]
|
979
1083
|
|
980
|
-
inputs = list(_infer_signature(dataset[self.input_cols], "input"))
|
1084
|
+
inputs = list(_infer_signature(dataset[self.input_cols], "input", use_snowflake_identifiers=True))
|
981
1085
|
outputs: List[BaseFeatureSpec] = []
|
982
1086
|
if hasattr(self, "predict"):
|
983
1087
|
# keep mypy happy
|
984
|
-
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
1088
|
+
assert self._sklearn_object is not None and hasattr(self._sklearn_object, "_estimator_type")
|
985
1089
|
# For classifier, the type of predict is the same as the type of label
|
986
|
-
if self._sklearn_object._estimator_type ==
|
987
|
-
|
1090
|
+
if self._sklearn_object._estimator_type == "classifier":
|
1091
|
+
# label columns is the desired type for output
|
988
1092
|
outputs = list(_infer_signature(dataset[self.label_cols], "output", use_snowflake_identifiers=True))
|
989
1093
|
# rename the output columns
|
990
1094
|
outputs = list(model_signature_utils.rename_features(outputs, self.output_cols))
|
991
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
992
|
-
|
993
|
-
|
1095
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1096
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1097
|
+
)
|
994
1098
|
# For mixture models that use the density mixin, `predict` returns the argmax of the log prob.
|
995
1099
|
# For outlier models, returns -1 for outliers and 1 for inliers.
|
996
|
-
# Clusterer returns int64 cluster labels.
|
1100
|
+
# Clusterer returns int64 cluster labels.
|
997
1101
|
elif self._sklearn_object._estimator_type in ["DensityEstimator", "clusterer", "outlier_detector"]:
|
998
1102
|
outputs = [FeatureSpec(dtype=DataType.INT64, name=c) for c in self.output_cols]
|
999
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
1000
|
-
|
1001
|
-
|
1002
|
-
|
1103
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1104
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1105
|
+
)
|
1106
|
+
|
1003
1107
|
# For regressor, the type of predict is float64
|
1004
|
-
elif self._sklearn_object._estimator_type ==
|
1108
|
+
elif self._sklearn_object._estimator_type == "regressor":
|
1005
1109
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in self.output_cols]
|
1006
|
-
self._model_signature_dict["predict"] = ModelSignature(
|
1007
|
-
|
1008
|
-
|
1009
|
-
|
1110
|
+
self._model_signature_dict["predict"] = ModelSignature(
|
1111
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1112
|
+
)
|
1113
|
+
|
1010
1114
|
for prob_func in PROB_FUNCTIONS:
|
1011
1115
|
if hasattr(self, prob_func):
|
1012
1116
|
output_cols_prefix: str = f"{prob_func}_"
|
1013
1117
|
output_column_names = self._get_output_column_names(output_cols_prefix)
|
1014
1118
|
outputs = [FeatureSpec(dtype=DataType.DOUBLE, name=c) for c in output_column_names]
|
1015
|
-
self._model_signature_dict[prob_func] = ModelSignature(
|
1016
|
-
|
1017
|
-
|
1119
|
+
self._model_signature_dict[prob_func] = ModelSignature(
|
1120
|
+
inputs, ([] if self._drop_input_cols else inputs) + outputs
|
1121
|
+
)
|
1018
1122
|
|
1019
1123
|
# Output signature names may still need to be renamed, since they were not created with `_infer_signature`.
|
1020
1124
|
items = list(self._model_signature_dict.items())
|
@@ -1027,10 +1131,10 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
1027
1131
|
"""Returns model signature of current class.
|
1028
1132
|
|
1029
1133
|
Raises:
|
1030
|
-
|
1134
|
+
SnowflakeMLException: If estimator is not fitted, then model signature cannot be inferred
|
1031
1135
|
|
1032
1136
|
Returns:
|
1033
|
-
Dict
|
1137
|
+
Dict with each method and its input output signature
|
1034
1138
|
"""
|
1035
1139
|
if self._model_signature_dict is None:
|
1036
1140
|
raise exceptions.SnowflakeMLException(
|
@@ -1038,35 +1142,3 @@ class LinearDiscriminantAnalysis(BaseTransformer):
|
|
1038
1142
|
original_exception=RuntimeError("Estimator not fitted before accessing property model_signatures!"),
|
1039
1143
|
)
|
1040
1144
|
return self._model_signature_dict
|
1041
|
-
|
1042
|
-
def to_sklearn(self) -> Any:
|
1043
|
-
"""Get sklearn.discriminant_analysis.LinearDiscriminantAnalysis object.
|
1044
|
-
"""
|
1045
|
-
if self._sklearn_object is None:
|
1046
|
-
self._sklearn_object = self._create_sklearn_object()
|
1047
|
-
return self._sklearn_object
|
1048
|
-
|
1049
|
-
def to_xgboost(self) -> Any:
|
1050
|
-
raise exceptions.SnowflakeMLException(
|
1051
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1052
|
-
original_exception=AttributeError(
|
1053
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1054
|
-
"to_xgboost()",
|
1055
|
-
"to_sklearn()"
|
1056
|
-
)
|
1057
|
-
),
|
1058
|
-
)
|
1059
|
-
|
1060
|
-
def to_lightgbm(self) -> Any:
|
1061
|
-
raise exceptions.SnowflakeMLException(
|
1062
|
-
error_code=error_codes.METHOD_NOT_ALLOWED,
|
1063
|
-
original_exception=AttributeError(
|
1064
|
-
modeling_error_messages.UNSUPPORTED_MODEL_CONVERSION.format(
|
1065
|
-
"to_lightgbm()",
|
1066
|
-
"to_sklearn()"
|
1067
|
-
)
|
1068
|
-
),
|
1069
|
-
)
|
1070
|
-
|
1071
|
-
def _get_dependencies(self) -> List[str]:
|
1072
|
-
return self._deps
|