snowflake-ml-python 1.1.1__py3-none-any.whl → 1.1.2__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/cortex/_complete.py +1 -1
- snowflake/cortex/_extract_answer.py +1 -1
- snowflake/cortex/_sentiment.py +1 -1
- snowflake/cortex/_summarize.py +1 -1
- snowflake/cortex/_translate.py +1 -1
- snowflake/ml/_internal/env_utils.py +68 -6
- snowflake/ml/_internal/file_utils.py +34 -4
- snowflake/ml/_internal/telemetry.py +79 -91
- snowflake/ml/_internal/utils/retryable_http.py +16 -4
- snowflake/ml/_internal/utils/spcs_attribution_utils.py +122 -0
- snowflake/ml/dataset/dataset.py +1 -1
- snowflake/ml/model/_api.py +21 -14
- snowflake/ml/model/_client/model/model_impl.py +176 -0
- snowflake/ml/model/_client/model/model_method_info.py +19 -0
- snowflake/ml/model/_client/model/model_version_impl.py +291 -0
- snowflake/ml/model/_client/ops/metadata_ops.py +107 -0
- snowflake/ml/model/_client/ops/model_ops.py +308 -0
- snowflake/ml/model/_client/sql/model.py +75 -0
- snowflake/ml/model/_client/sql/model_version.py +213 -0
- snowflake/ml/model/_client/sql/stage.py +40 -0
- snowflake/ml/model/_deploy_client/image_builds/server_image_builder.py +3 -4
- snowflake/ml/model/_deploy_client/image_builds/templates/image_build_job_spec_template +24 -8
- snowflake/ml/model/_deploy_client/image_builds/templates/kaniko_shell_script_template +23 -0
- snowflake/ml/model/_deploy_client/snowservice/deploy.py +14 -2
- snowflake/ml/model/_deploy_client/utils/constants.py +1 -0
- snowflake/ml/model/_deploy_client/warehouse/deploy.py +2 -2
- snowflake/ml/model/_model_composer/model_composer.py +31 -9
- snowflake/ml/model/_model_composer/model_manifest/model_manifest.py +25 -10
- snowflake/ml/model/_model_composer/model_manifest/model_manifest_schema.py +2 -2
- snowflake/ml/model/_model_composer/model_method/infer_function.py_template +2 -1
- snowflake/ml/model/_model_composer/model_method/model_method.py +34 -3
- snowflake/ml/model/_model_composer/model_runtime/model_runtime.py +1 -1
- snowflake/ml/model/_packager/model_handlers/huggingface_pipeline.py +3 -1
- snowflake/ml/model/_packager/model_handlers/snowmlmodel.py +10 -28
- snowflake/ml/model/_packager/model_meta/model_meta.py +18 -16
- snowflake/ml/model/_signatures/snowpark_handler.py +1 -1
- snowflake/ml/model/model_signature.py +108 -53
- snowflake/ml/model/type_hints.py +1 -0
- snowflake/ml/modeling/_internal/distributed_hpo_trainer.py +554 -0
- snowflake/ml/modeling/_internal/estimator_protocols.py +1 -60
- snowflake/ml/modeling/_internal/model_specifications.py +146 -0
- snowflake/ml/modeling/_internal/model_trainer.py +13 -0
- snowflake/ml/modeling/_internal/model_trainer_builder.py +78 -0
- snowflake/ml/modeling/_internal/pandas_trainer.py +54 -0
- snowflake/ml/modeling/_internal/snowpark_handlers.py +6 -760
- snowflake/ml/modeling/_internal/snowpark_trainer.py +331 -0
- snowflake/ml/modeling/calibration/calibrated_classifier_cv.py +96 -124
- snowflake/ml/modeling/cluster/affinity_propagation.py +94 -124
- snowflake/ml/modeling/cluster/agglomerative_clustering.py +94 -124
- snowflake/ml/modeling/cluster/birch.py +94 -124
- snowflake/ml/modeling/cluster/bisecting_k_means.py +94 -124
- snowflake/ml/modeling/cluster/dbscan.py +94 -124
- snowflake/ml/modeling/cluster/feature_agglomeration.py +94 -124
- snowflake/ml/modeling/cluster/k_means.py +93 -124
- snowflake/ml/modeling/cluster/mean_shift.py +94 -124
- snowflake/ml/modeling/cluster/mini_batch_k_means.py +93 -124
- snowflake/ml/modeling/cluster/optics.py +94 -124
- snowflake/ml/modeling/cluster/spectral_biclustering.py +94 -124
- snowflake/ml/modeling/cluster/spectral_clustering.py +94 -124
- snowflake/ml/modeling/cluster/spectral_coclustering.py +94 -124
- snowflake/ml/modeling/compose/column_transformer.py +94 -124
- snowflake/ml/modeling/compose/transformed_target_regressor.py +96 -124
- snowflake/ml/modeling/covariance/elliptic_envelope.py +94 -124
- snowflake/ml/modeling/covariance/empirical_covariance.py +80 -110
- snowflake/ml/modeling/covariance/graphical_lasso.py +94 -124
- snowflake/ml/modeling/covariance/graphical_lasso_cv.py +94 -124
- snowflake/ml/modeling/covariance/ledoit_wolf.py +85 -115
- snowflake/ml/modeling/covariance/min_cov_det.py +94 -124
- snowflake/ml/modeling/covariance/oas.py +80 -110
- snowflake/ml/modeling/covariance/shrunk_covariance.py +84 -114
- snowflake/ml/modeling/decomposition/dictionary_learning.py +94 -124
- snowflake/ml/modeling/decomposition/factor_analysis.py +94 -124
- snowflake/ml/modeling/decomposition/fast_ica.py +94 -124
- snowflake/ml/modeling/decomposition/incremental_pca.py +94 -124
- snowflake/ml/modeling/decomposition/kernel_pca.py +94 -124
- snowflake/ml/modeling/decomposition/mini_batch_dictionary_learning.py +94 -124
- snowflake/ml/modeling/decomposition/mini_batch_sparse_pca.py +94 -124
- snowflake/ml/modeling/decomposition/pca.py +94 -124
- snowflake/ml/modeling/decomposition/sparse_pca.py +94 -124
- snowflake/ml/modeling/decomposition/truncated_svd.py +94 -124
- snowflake/ml/modeling/discriminant_analysis/linear_discriminant_analysis.py +96 -124
- snowflake/ml/modeling/discriminant_analysis/quadratic_discriminant_analysis.py +91 -119
- snowflake/ml/modeling/ensemble/ada_boost_classifier.py +96 -124
- snowflake/ml/modeling/ensemble/ada_boost_regressor.py +96 -124
- snowflake/ml/modeling/ensemble/bagging_classifier.py +96 -124
- snowflake/ml/modeling/ensemble/bagging_regressor.py +96 -124
- snowflake/ml/modeling/ensemble/extra_trees_classifier.py +96 -124
- snowflake/ml/modeling/ensemble/extra_trees_regressor.py +96 -124
- snowflake/ml/modeling/ensemble/gradient_boosting_classifier.py +96 -124
- snowflake/ml/modeling/ensemble/gradient_boosting_regressor.py +96 -124
- snowflake/ml/modeling/ensemble/hist_gradient_boosting_classifier.py +96 -124
- snowflake/ml/modeling/ensemble/hist_gradient_boosting_regressor.py +96 -124
- snowflake/ml/modeling/ensemble/isolation_forest.py +94 -124
- snowflake/ml/modeling/ensemble/random_forest_classifier.py +96 -124
- snowflake/ml/modeling/ensemble/random_forest_regressor.py +96 -124
- snowflake/ml/modeling/ensemble/stacking_regressor.py +96 -124
- snowflake/ml/modeling/ensemble/voting_classifier.py +96 -124
- snowflake/ml/modeling/ensemble/voting_regressor.py +91 -119
- snowflake/ml/modeling/feature_selection/generic_univariate_select.py +82 -110
- snowflake/ml/modeling/feature_selection/select_fdr.py +80 -108
- snowflake/ml/modeling/feature_selection/select_fpr.py +80 -108
- snowflake/ml/modeling/feature_selection/select_fwe.py +80 -108
- snowflake/ml/modeling/feature_selection/select_k_best.py +81 -109
- snowflake/ml/modeling/feature_selection/select_percentile.py +80 -108
- snowflake/ml/modeling/feature_selection/sequential_feature_selector.py +94 -124
- snowflake/ml/modeling/feature_selection/variance_threshold.py +76 -106
- snowflake/ml/modeling/framework/base.py +2 -2
- snowflake/ml/modeling/gaussian_process/gaussian_process_classifier.py +96 -124
- snowflake/ml/modeling/gaussian_process/gaussian_process_regressor.py +96 -124
- snowflake/ml/modeling/impute/iterative_imputer.py +94 -124
- snowflake/ml/modeling/impute/knn_imputer.py +94 -124
- snowflake/ml/modeling/impute/missing_indicator.py +94 -124
- snowflake/ml/modeling/impute/simple_imputer.py +1 -1
- snowflake/ml/modeling/kernel_approximation/additive_chi2_sampler.py +77 -107
- snowflake/ml/modeling/kernel_approximation/nystroem.py +94 -124
- snowflake/ml/modeling/kernel_approximation/polynomial_count_sketch.py +94 -124
- snowflake/ml/modeling/kernel_approximation/rbf_sampler.py +86 -116
- snowflake/ml/modeling/kernel_approximation/skewed_chi2_sampler.py +84 -114
- snowflake/ml/modeling/kernel_ridge/kernel_ridge.py +96 -124
- snowflake/ml/modeling/lightgbm/lgbm_classifier.py +71 -100
- snowflake/ml/modeling/lightgbm/lgbm_regressor.py +71 -100
- snowflake/ml/modeling/linear_model/ard_regression.py +96 -124
- snowflake/ml/modeling/linear_model/bayesian_ridge.py +96 -124
- snowflake/ml/modeling/linear_model/elastic_net.py +96 -124
- snowflake/ml/modeling/linear_model/elastic_net_cv.py +96 -124
- snowflake/ml/modeling/linear_model/gamma_regressor.py +96 -124
- snowflake/ml/modeling/linear_model/huber_regressor.py +96 -124
- snowflake/ml/modeling/linear_model/lars.py +96 -124
- snowflake/ml/modeling/linear_model/lars_cv.py +96 -124
- snowflake/ml/modeling/linear_model/lasso.py +96 -124
- snowflake/ml/modeling/linear_model/lasso_cv.py +96 -124
- snowflake/ml/modeling/linear_model/lasso_lars.py +96 -124
- snowflake/ml/modeling/linear_model/lasso_lars_cv.py +96 -124
- snowflake/ml/modeling/linear_model/lasso_lars_ic.py +96 -124
- snowflake/ml/modeling/linear_model/linear_regression.py +91 -119
- snowflake/ml/modeling/linear_model/logistic_regression.py +96 -124
- snowflake/ml/modeling/linear_model/logistic_regression_cv.py +96 -124
- snowflake/ml/modeling/linear_model/multi_task_elastic_net.py +96 -124
- snowflake/ml/modeling/linear_model/multi_task_elastic_net_cv.py +96 -124
- snowflake/ml/modeling/linear_model/multi_task_lasso.py +96 -124
- snowflake/ml/modeling/linear_model/multi_task_lasso_cv.py +96 -124
- snowflake/ml/modeling/linear_model/orthogonal_matching_pursuit.py +96 -124
- snowflake/ml/modeling/linear_model/passive_aggressive_classifier.py +96 -124
- snowflake/ml/modeling/linear_model/passive_aggressive_regressor.py +95 -124
- snowflake/ml/modeling/linear_model/perceptron.py +95 -124
- snowflake/ml/modeling/linear_model/poisson_regressor.py +96 -124
- snowflake/ml/modeling/linear_model/ransac_regressor.py +96 -124
- snowflake/ml/modeling/linear_model/ridge.py +96 -124
- snowflake/ml/modeling/linear_model/ridge_classifier.py +96 -124
- snowflake/ml/modeling/linear_model/ridge_classifier_cv.py +96 -124
- snowflake/ml/modeling/linear_model/ridge_cv.py +96 -124
- snowflake/ml/modeling/linear_model/sgd_classifier.py +96 -124
- snowflake/ml/modeling/linear_model/sgd_one_class_svm.py +94 -124
- snowflake/ml/modeling/linear_model/sgd_regressor.py +96 -124
- snowflake/ml/modeling/linear_model/theil_sen_regressor.py +96 -124
- snowflake/ml/modeling/linear_model/tweedie_regressor.py +96 -124
- snowflake/ml/modeling/manifold/isomap.py +94 -124
- snowflake/ml/modeling/manifold/mds.py +94 -124
- snowflake/ml/modeling/manifold/spectral_embedding.py +94 -124
- snowflake/ml/modeling/manifold/tsne.py +94 -124
- snowflake/ml/modeling/metrics/classification.py +187 -52
- snowflake/ml/modeling/metrics/correlation.py +4 -2
- snowflake/ml/modeling/metrics/covariance.py +7 -4
- snowflake/ml/modeling/metrics/ranking.py +32 -16
- snowflake/ml/modeling/metrics/regression.py +60 -32
- snowflake/ml/modeling/mixture/bayesian_gaussian_mixture.py +94 -124
- snowflake/ml/modeling/mixture/gaussian_mixture.py +94 -124
- snowflake/ml/modeling/model_selection/grid_search_cv.py +88 -138
- snowflake/ml/modeling/model_selection/randomized_search_cv.py +90 -144
- snowflake/ml/modeling/multiclass/one_vs_one_classifier.py +86 -114
- snowflake/ml/modeling/multiclass/one_vs_rest_classifier.py +93 -121
- snowflake/ml/modeling/multiclass/output_code_classifier.py +94 -122
- snowflake/ml/modeling/naive_bayes/bernoulli_nb.py +92 -120
- snowflake/ml/modeling/naive_bayes/categorical_nb.py +96 -124
- snowflake/ml/modeling/naive_bayes/complement_nb.py +92 -120
- snowflake/ml/modeling/naive_bayes/gaussian_nb.py +79 -107
- snowflake/ml/modeling/naive_bayes/multinomial_nb.py +88 -116
- snowflake/ml/modeling/neighbors/k_neighbors_classifier.py +96 -124
- snowflake/ml/modeling/neighbors/k_neighbors_regressor.py +96 -124
- snowflake/ml/modeling/neighbors/kernel_density.py +94 -124
- snowflake/ml/modeling/neighbors/local_outlier_factor.py +94 -124
- snowflake/ml/modeling/neighbors/nearest_centroid.py +89 -117
- snowflake/ml/modeling/neighbors/nearest_neighbors.py +94 -124
- snowflake/ml/modeling/neighbors/neighborhood_components_analysis.py +96 -124
- snowflake/ml/modeling/neighbors/radius_neighbors_classifier.py +96 -124
- snowflake/ml/modeling/neighbors/radius_neighbors_regressor.py +96 -124
- snowflake/ml/modeling/neural_network/bernoulli_rbm.py +94 -124
- snowflake/ml/modeling/neural_network/mlp_classifier.py +96 -124
- snowflake/ml/modeling/neural_network/mlp_regressor.py +96 -124
- snowflake/ml/modeling/parameters/disable_distributed_hpo.py +2 -6
- snowflake/ml/modeling/preprocessing/binarizer.py +14 -9
- snowflake/ml/modeling/preprocessing/k_bins_discretizer.py +0 -4
- snowflake/ml/modeling/preprocessing/label_encoder.py +21 -13
- snowflake/ml/modeling/preprocessing/max_abs_scaler.py +20 -14
- snowflake/ml/modeling/preprocessing/min_max_scaler.py +35 -19
- snowflake/ml/modeling/preprocessing/normalizer.py +6 -9
- snowflake/ml/modeling/preprocessing/one_hot_encoder.py +20 -13
- snowflake/ml/modeling/preprocessing/ordinal_encoder.py +25 -13
- snowflake/ml/modeling/preprocessing/polynomial_features.py +94 -124
- snowflake/ml/modeling/preprocessing/robust_scaler.py +28 -14
- snowflake/ml/modeling/preprocessing/standard_scaler.py +25 -13
- snowflake/ml/modeling/semi_supervised/label_propagation.py +96 -124
- snowflake/ml/modeling/semi_supervised/label_spreading.py +96 -124
- snowflake/ml/modeling/svm/linear_svc.py +96 -124
- snowflake/ml/modeling/svm/linear_svr.py +96 -124
- snowflake/ml/modeling/svm/nu_svc.py +96 -124
- snowflake/ml/modeling/svm/nu_svr.py +96 -124
- snowflake/ml/modeling/svm/svc.py +96 -124
- snowflake/ml/modeling/svm/svr.py +96 -124
- snowflake/ml/modeling/tree/decision_tree_classifier.py +96 -124
- snowflake/ml/modeling/tree/decision_tree_regressor.py +96 -124
- snowflake/ml/modeling/tree/extra_tree_classifier.py +96 -124
- snowflake/ml/modeling/tree/extra_tree_regressor.py +96 -124
- snowflake/ml/modeling/xgboost/xgb_classifier.py +96 -125
- snowflake/ml/modeling/xgboost/xgb_regressor.py +96 -125
- snowflake/ml/modeling/xgboost/xgbrf_classifier.py +96 -125
- snowflake/ml/modeling/xgboost/xgbrf_regressor.py +96 -125
- snowflake/ml/registry/model_registry.py +2 -0
- snowflake/ml/registry/registry.py +215 -0
- snowflake/ml/version.py +1 -1
- {snowflake_ml_python-1.1.1.dist-info → snowflake_ml_python-1.1.2.dist-info}/METADATA +21 -3
- snowflake_ml_python-1.1.2.dist-info/RECORD +347 -0
- snowflake_ml_python-1.1.1.dist-info/RECORD +0 -331
- {snowflake_ml_python-1.1.1.dist-info → snowflake_ml_python-1.1.2.dist-info}/WHEEL +0 -0
@@ -22,17 +22,19 @@ from sklearn.utils.metaestimators import available_if
|
|
22
22
|
from snowflake.ml.modeling.framework.base import BaseTransformer, _process_cols
|
23
23
|
from snowflake.ml._internal import telemetry
|
24
24
|
from snowflake.ml._internal.exceptions import error_codes, exceptions, modeling_error_messages
|
25
|
+
from snowflake.ml._internal.env_utils import SNOWML_SPROC_ENV
|
25
26
|
from snowflake.ml._internal.utils import pkg_version_utils, identifier
|
26
|
-
from snowflake.snowpark import DataFrame
|
27
|
+
from snowflake.snowpark import DataFrame, Session
|
27
28
|
from snowflake.snowpark._internal.type_utils import convert_sp_to_sf_type
|
28
29
|
from snowflake.ml.modeling._internal.snowpark_handlers import SnowparkHandlers as HandlersImpl
|
30
|
+
from snowflake.ml.modeling._internal.model_trainer_builder import ModelTrainerBuilder
|
31
|
+
from snowflake.ml.modeling._internal.model_trainer import ModelTrainer
|
29
32
|
from snowflake.ml.modeling._internal.estimator_utils import (
|
30
33
|
gather_dependencies,
|
31
34
|
original_estimator_has_callable,
|
32
35
|
transform_snowml_obj_to_sklearn_obj,
|
33
36
|
validate_sklearn_args,
|
34
37
|
)
|
35
|
-
from snowflake.ml.modeling._internal.snowpark_handlers import SklearnWrapperProvider
|
36
38
|
from snowflake.ml.modeling._internal.estimator_protocols import FitPredictHandlers
|
37
39
|
|
38
40
|
from snowflake.ml.model.model_signature import (
|
@@ -52,7 +54,6 @@ _PROJECT = "ModelDevelopment"
|
|
52
54
|
_SUBPROJECT = "".join([s.capitalize() for s in "sklearn.feature_selection".replace("sklearn.", "").split("_")])
|
53
55
|
|
54
56
|
|
55
|
-
|
56
57
|
class SequentialFeatureSelector(BaseTransformer):
|
57
58
|
r"""Transformer that performs Sequential Feature Selection
|
58
59
|
For more details on this class, see [sklearn.feature_selection.SequentialFeatureSelector]
|
@@ -60,6 +61,49 @@ class SequentialFeatureSelector(BaseTransformer):
|
|
60
61
|
|
61
62
|
Parameters
|
62
63
|
----------
|
64
|
+
|
65
|
+
input_cols: Optional[Union[str, List[str]]]
|
66
|
+
A string or list of strings representing column names that contain features.
|
67
|
+
If this parameter is not specified, all columns in the input DataFrame except
|
68
|
+
the columns specified by label_cols, sample_weight_col, and passthrough_cols
|
69
|
+
parameters are considered input columns. Input columns can also be set after
|
70
|
+
initialization with the `set_input_cols` method.
|
71
|
+
|
72
|
+
label_cols: Optional[Union[str, List[str]]]
|
73
|
+
This parameter is optional and will be ignored during fit. It is present here for API consistency by convention.
|
74
|
+
|
75
|
+
output_cols: Optional[Union[str, List[str]]]
|
76
|
+
A string or list of strings representing column names that will store the
|
77
|
+
output of predict and transform operations. The length of output_cols must
|
78
|
+
match the expected number of output columns from the specific predictor or
|
79
|
+
transformer class used.
|
80
|
+
If you omit this parameter, output column names are derived by adding an
|
81
|
+
OUTPUT_ prefix to the label column names for supervised estimators, or
|
82
|
+
OUTPUT_<IDX>for unsupervised estimators. These inferred output column names
|
83
|
+
work for predictors, but output_cols must be set explicitly for transformers.
|
84
|
+
In general, explicitly specifying output column names is clearer, especially
|
85
|
+
if you don’t specify the input column names.
|
86
|
+
To transform in place, pass the same names for input_cols and output_cols.
|
87
|
+
be set explicitly for transformers. Output columns can also be set after
|
88
|
+
initialization with the `set_output_cols` method.
|
89
|
+
|
90
|
+
sample_weight_col: Optional[str]
|
91
|
+
A string representing the column name containing the sample weights.
|
92
|
+
This argument is only required when working with weighted datasets. Sample
|
93
|
+
weight column can also be set after initialization with the
|
94
|
+
`set_sample_weight_col` method.
|
95
|
+
|
96
|
+
passthrough_cols: Optional[Union[str, List[str]]]
|
97
|
+
A string or a list of strings indicating column names to be excluded from any
|
98
|
+
operations (such as train, transform, or inference). These specified column(s)
|
99
|
+
will remain untouched throughout the process. This option is helpful in scenarios
|
100
|
+
requiring automatic input_cols inference, but need to avoid using specific
|
101
|
+
columns, like index columns, during training or inference. Passthrough columns
|
102
|
+
can also be set after initialization with the `set_passthrough_cols` method.
|
103
|
+
|
104
|
+
drop_input_cols: Optional[bool], default=False
|
105
|
+
If set, the response of predict(), transform() methods will not contain input columns.
|
106
|
+
|
63
107
|
estimator: estimator instance
|
64
108
|
An unfitted estimator.
|
65
109
|
|
@@ -119,42 +163,6 @@ class SequentialFeatureSelector(BaseTransformer):
|
|
119
163
|
``None`` means 1 unless in a :obj:`joblib.parallel_backend` context.
|
120
164
|
``-1`` means using all processors. See :term:`Glossary <n_jobs>`
|
121
165
|
for more details.
|
122
|
-
|
123
|
-
input_cols: Optional[Union[str, List[str]]]
|
124
|
-
A string or list of strings representing column names that contain features.
|
125
|
-
If this parameter is not specified, all columns in the input DataFrame except
|
126
|
-
the columns specified by label_cols, sample_weight_col, and passthrough_cols
|
127
|
-
parameters are considered input columns.
|
128
|
-
|
129
|
-
label_cols: Optional[Union[str, List[str]]]
|
130
|
-
A string or list of strings representing column names that contain labels.
|
131
|
-
This is a required param for estimators, as there is no way to infer these
|
132
|
-
columns. If this parameter is not specified, then object is fitted without
|
133
|
-
labels (like a transformer).
|
134
|
-
|
135
|
-
output_cols: Optional[Union[str, List[str]]]
|
136
|
-
A string or list of strings representing column names that will store the
|
137
|
-
output of predict and transform operations. The length of output_cols must
|
138
|
-
match the expected number of output columns from the specific estimator or
|
139
|
-
transformer class used.
|
140
|
-
If this parameter is not specified, output column names are derived by
|
141
|
-
adding an OUTPUT_ prefix to the label column names. These inferred output
|
142
|
-
column names work for estimator's predict() method, but output_cols must
|
143
|
-
be set explicitly for transformers.
|
144
|
-
|
145
|
-
sample_weight_col: Optional[str]
|
146
|
-
A string representing the column name containing the sample weights.
|
147
|
-
This argument is only required when working with weighted datasets.
|
148
|
-
|
149
|
-
passthrough_cols: Optional[Union[str, List[str]]]
|
150
|
-
A string or a list of strings indicating column names to be excluded from any
|
151
|
-
operations (such as train, transform, or inference). These specified column(s)
|
152
|
-
will remain untouched throughout the process. This option is helpful in scenarios
|
153
|
-
requiring automatic input_cols inference, but need to avoid using specific
|
154
|
-
columns, like index columns, during training or inference.
|
155
|
-
|
156
|
-
drop_input_cols: Optional[bool], default=False
|
157
|
-
If set, the response of predict(), transform() methods will not contain input columns.
|
158
166
|
"""
|
159
167
|
|
160
168
|
def __init__( # type: ignore[no-untyped-def]
|
@@ -182,7 +190,7 @@ class SequentialFeatureSelector(BaseTransformer):
|
|
182
190
|
self.set_passthrough_cols(passthrough_cols)
|
183
191
|
self.set_drop_input_cols(drop_input_cols)
|
184
192
|
self.set_sample_weight_col(sample_weight_col)
|
185
|
-
deps = set(
|
193
|
+
deps: Set[str] = set([f'numpy=={np.__version__}', f'scikit-learn=={sklearn.__version__}', f'cloudpickle=={cp.__version__}'])
|
186
194
|
deps = deps | gather_dependencies(estimator)
|
187
195
|
self._deps = list(deps)
|
188
196
|
estimator = transform_snowml_obj_to_sklearn_obj(estimator)
|
@@ -197,13 +205,14 @@ class SequentialFeatureSelector(BaseTransformer):
|
|
197
205
|
args=init_args,
|
198
206
|
klass=sklearn.feature_selection.SequentialFeatureSelector
|
199
207
|
)
|
200
|
-
self._sklearn_object = sklearn.feature_selection.SequentialFeatureSelector(
|
208
|
+
self._sklearn_object: Any = sklearn.feature_selection.SequentialFeatureSelector(
|
201
209
|
**cleaned_up_init_args,
|
202
210
|
)
|
203
211
|
self._model_signature_dict: Optional[Dict[str, ModelSignature]] = None
|
204
212
|
# If user used snowpark dataframe during fit, here it stores the snowpark input_cols, otherwise the processed input_cols
|
205
213
|
self._snowpark_cols: Optional[List[str]] = self.input_cols
|
206
|
-
self._handlers: FitPredictHandlers = HandlersImpl(class_name=SequentialFeatureSelector.__class__.__name__, subproject=_SUBPROJECT, autogenerated=True
|
214
|
+
self._handlers: FitPredictHandlers = HandlersImpl(class_name=SequentialFeatureSelector.__class__.__name__, subproject=_SUBPROJECT, autogenerated=True)
|
215
|
+
self._autogenerated = True
|
207
216
|
|
208
217
|
def _get_rand_id(self) -> str:
|
209
218
|
"""
|
@@ -259,54 +268,48 @@ class SequentialFeatureSelector(BaseTransformer):
|
|
259
268
|
self
|
260
269
|
"""
|
261
270
|
self._infer_input_output_cols(dataset)
|
262
|
-
if isinstance(dataset,
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
self.
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
271
|
+
if isinstance(dataset, DataFrame):
|
272
|
+
session = dataset._session
|
273
|
+
assert session is not None # keep mypy happy
|
274
|
+
# Validate that key package version in user workspace are supported in snowflake conda channel
|
275
|
+
# If customer doesn't have package in conda channel, replace the ones have the closest versions
|
276
|
+
self._deps = pkg_version_utils.get_valid_pkg_versions_supported_in_snowflake_conda_channel(
|
277
|
+
pkg_versions=self._get_dependencies(), session=session, subproject=_SUBPROJECT)
|
278
|
+
|
279
|
+
# Specify input columns so column pruning will be enforced
|
280
|
+
selected_cols = self._get_active_columns()
|
281
|
+
if len(selected_cols) > 0:
|
282
|
+
dataset = dataset.select(selected_cols)
|
283
|
+
|
284
|
+
self._snowpark_cols = dataset.select(self.input_cols).columns
|
285
|
+
|
286
|
+
# If we are already in a stored procedure, no need to kick off another one.
|
287
|
+
if SNOWML_SPROC_ENV in os.environ:
|
288
|
+
statement_params = telemetry.get_function_usage_statement_params(
|
289
|
+
project=_PROJECT,
|
290
|
+
subproject=_SUBPROJECT,
|
291
|
+
function_name=telemetry.get_statement_params_full_func_name(inspect.currentframe(), SequentialFeatureSelector.__class__.__name__),
|
292
|
+
api_calls=[Session.call],
|
293
|
+
custom_tags=dict([("autogen", True)]) if self._autogenerated else None,
|
294
|
+
)
|
295
|
+
pd_df: pd.DataFrame = dataset.to_pandas(statement_params=statement_params)
|
296
|
+
pd_df.columns = dataset.columns
|
297
|
+
dataset = pd_df
|
298
|
+
|
299
|
+
model_trainer = ModelTrainerBuilder.build(
|
300
|
+
estimator=self._sklearn_object,
|
301
|
+
dataset=dataset,
|
302
|
+
input_cols=self.input_cols,
|
303
|
+
label_cols=self.label_cols,
|
304
|
+
sample_weight_col=self.sample_weight_col,
|
305
|
+
autogenerated=self._autogenerated,
|
306
|
+
subproject=_SUBPROJECT
|
307
|
+
)
|
308
|
+
self._sklearn_object = model_trainer.train()
|
278
309
|
self._is_fitted = True
|
279
310
|
self._get_model_signatures(dataset)
|
280
311
|
return self
|
281
312
|
|
282
|
-
def _fit_snowpark(self, dataset: DataFrame) -> None:
|
283
|
-
session = dataset._session
|
284
|
-
assert session is not None # keep mypy happy
|
285
|
-
# Validate that key package version in user workspace are supported in snowflake conda channel
|
286
|
-
# If customer doesn't have package in conda channel, replace the ones have the closest versions
|
287
|
-
self._deps = pkg_version_utils.get_valid_pkg_versions_supported_in_snowflake_conda_channel(
|
288
|
-
pkg_versions=self._get_dependencies(), session=session, subproject=_SUBPROJECT)
|
289
|
-
|
290
|
-
# Specify input columns so column pruning will be enforced
|
291
|
-
selected_cols = self._get_active_columns()
|
292
|
-
if len(selected_cols) > 0:
|
293
|
-
dataset = dataset.select(selected_cols)
|
294
|
-
|
295
|
-
estimator = self._sklearn_object
|
296
|
-
assert estimator is not None # Keep mypy happy
|
297
|
-
|
298
|
-
self._snowpark_cols = dataset.select(self.input_cols).columns
|
299
|
-
|
300
|
-
self._sklearn_object = self._handlers.fit_snowpark(
|
301
|
-
dataset,
|
302
|
-
session,
|
303
|
-
estimator,
|
304
|
-
["snowflake-snowpark-python"] + self._get_dependencies(),
|
305
|
-
self.input_cols,
|
306
|
-
self.label_cols,
|
307
|
-
self.sample_weight_col,
|
308
|
-
)
|
309
|
-
|
310
313
|
def _get_pass_through_columns(self, dataset: DataFrame) -> List[str]:
|
311
314
|
if self._drop_input_cols:
|
312
315
|
return []
|
@@ -494,11 +497,6 @@ class SequentialFeatureSelector(BaseTransformer):
|
|
494
497
|
subproject=_SUBPROJECT,
|
495
498
|
custom_tags=dict([("autogen", True)]),
|
496
499
|
)
|
497
|
-
@telemetry.add_stmt_params_to_df(
|
498
|
-
project=_PROJECT,
|
499
|
-
subproject=_SUBPROJECT,
|
500
|
-
custom_tags=dict([("autogen", True)]),
|
501
|
-
)
|
502
500
|
def predict(self, dataset: Union[DataFrame, pd.DataFrame]) -> Union[DataFrame, pd.DataFrame]:
|
503
501
|
"""Method not supported for this class.
|
504
502
|
|
@@ -550,11 +548,6 @@ class SequentialFeatureSelector(BaseTransformer):
|
|
550
548
|
subproject=_SUBPROJECT,
|
551
549
|
custom_tags=dict([("autogen", True)]),
|
552
550
|
)
|
553
|
-
@telemetry.add_stmt_params_to_df(
|
554
|
-
project=_PROJECT,
|
555
|
-
subproject=_SUBPROJECT,
|
556
|
-
custom_tags=dict([("autogen", True)]),
|
557
|
-
)
|
558
551
|
def transform(self, dataset: Union[DataFrame, pd.DataFrame]) -> Union[DataFrame, pd.DataFrame]:
|
559
552
|
"""Reduce X to the selected features
|
560
553
|
For more details on this function, see [sklearn.feature_selection.SequentialFeatureSelector.transform]
|
@@ -613,7 +606,8 @@ class SequentialFeatureSelector(BaseTransformer):
|
|
613
606
|
if False:
|
614
607
|
self.fit(dataset)
|
615
608
|
assert self._sklearn_object is not None
|
616
|
-
|
609
|
+
labels : npt.NDArray[Any] = self._sklearn_object.labels_
|
610
|
+
return labels
|
617
611
|
else:
|
618
612
|
raise NotImplementedError
|
619
613
|
|
@@ -649,6 +643,7 @@ class SequentialFeatureSelector(BaseTransformer):
|
|
649
643
|
output_cols = []
|
650
644
|
|
651
645
|
# Make sure column names are valid snowflake identifiers.
|
646
|
+
assert output_cols is not None # Make MyPy happy
|
652
647
|
rv = [identifier.rename_to_valid_snowflake_identifier(c) for c in output_cols]
|
653
648
|
|
654
649
|
return rv
|
@@ -659,11 +654,6 @@ class SequentialFeatureSelector(BaseTransformer):
|
|
659
654
|
subproject=_SUBPROJECT,
|
660
655
|
custom_tags=dict([("autogen", True)]),
|
661
656
|
)
|
662
|
-
@telemetry.add_stmt_params_to_df(
|
663
|
-
project=_PROJECT,
|
664
|
-
subproject=_SUBPROJECT,
|
665
|
-
custom_tags=dict([("autogen", True)]),
|
666
|
-
)
|
667
657
|
def predict_proba(
|
668
658
|
self, dataset: Union[DataFrame, pd.DataFrame], output_cols_prefix: str = "predict_proba_"
|
669
659
|
) -> Union[DataFrame, pd.DataFrame]:
|
@@ -704,11 +694,6 @@ class SequentialFeatureSelector(BaseTransformer):
|
|
704
694
|
subproject=_SUBPROJECT,
|
705
695
|
custom_tags=dict([("autogen", True)]),
|
706
696
|
)
|
707
|
-
@telemetry.add_stmt_params_to_df(
|
708
|
-
project=_PROJECT,
|
709
|
-
subproject=_SUBPROJECT,
|
710
|
-
custom_tags=dict([("autogen", True)]),
|
711
|
-
)
|
712
697
|
def predict_log_proba(
|
713
698
|
self, dataset: Union[DataFrame, pd.DataFrame], output_cols_prefix: str = "predict_log_proba_"
|
714
699
|
) -> Union[DataFrame, pd.DataFrame]:
|
@@ -745,16 +730,6 @@ class SequentialFeatureSelector(BaseTransformer):
|
|
745
730
|
return output_df
|
746
731
|
|
747
732
|
@available_if(original_estimator_has_callable("decision_function")) # type: ignore[misc]
|
748
|
-
@telemetry.send_api_usage_telemetry(
|
749
|
-
project=_PROJECT,
|
750
|
-
subproject=_SUBPROJECT,
|
751
|
-
custom_tags=dict([("autogen", True)]),
|
752
|
-
)
|
753
|
-
@telemetry.add_stmt_params_to_df(
|
754
|
-
project=_PROJECT,
|
755
|
-
subproject=_SUBPROJECT,
|
756
|
-
custom_tags=dict([("autogen", True)]),
|
757
|
-
)
|
758
733
|
def decision_function(
|
759
734
|
self, dataset: Union[DataFrame, pd.DataFrame], output_cols_prefix: str = "decision_function_"
|
760
735
|
) -> Union[DataFrame, pd.DataFrame]:
|
@@ -853,11 +828,6 @@ class SequentialFeatureSelector(BaseTransformer):
|
|
853
828
|
subproject=_SUBPROJECT,
|
854
829
|
custom_tags=dict([("autogen", True)]),
|
855
830
|
)
|
856
|
-
@telemetry.add_stmt_params_to_df(
|
857
|
-
project=_PROJECT,
|
858
|
-
subproject=_SUBPROJECT,
|
859
|
-
custom_tags=dict([("autogen", True)]),
|
860
|
-
)
|
861
831
|
def kneighbors(
|
862
832
|
self,
|
863
833
|
dataset: Union[DataFrame, pd.DataFrame],
|
@@ -917,9 +887,9 @@ class SequentialFeatureSelector(BaseTransformer):
|
|
917
887
|
# For classifier, the type of predict is the same as the type of label
|
918
888
|
if self._sklearn_object._estimator_type == 'classifier':
|
919
889
|
# label columns is the desired type for output
|
920
|
-
outputs = _infer_signature(dataset[self.label_cols], "output", use_snowflake_identifiers=True)
|
890
|
+
outputs = list(_infer_signature(dataset[self.label_cols], "output", use_snowflake_identifiers=True))
|
921
891
|
# rename the output columns
|
922
|
-
outputs = model_signature_utils.rename_features(outputs, self.output_cols)
|
892
|
+
outputs = list(model_signature_utils.rename_features(outputs, self.output_cols))
|
923
893
|
self._model_signature_dict["predict"] = ModelSignature(inputs,
|
924
894
|
([] if self._drop_input_cols else inputs)
|
925
895
|
+ outputs)
|
@@ -22,17 +22,19 @@ from sklearn.utils.metaestimators import available_if
|
|
22
22
|
from snowflake.ml.modeling.framework.base import BaseTransformer, _process_cols
|
23
23
|
from snowflake.ml._internal import telemetry
|
24
24
|
from snowflake.ml._internal.exceptions import error_codes, exceptions, modeling_error_messages
|
25
|
+
from snowflake.ml._internal.env_utils import SNOWML_SPROC_ENV
|
25
26
|
from snowflake.ml._internal.utils import pkg_version_utils, identifier
|
26
|
-
from snowflake.snowpark import DataFrame
|
27
|
+
from snowflake.snowpark import DataFrame, Session
|
27
28
|
from snowflake.snowpark._internal.type_utils import convert_sp_to_sf_type
|
28
29
|
from snowflake.ml.modeling._internal.snowpark_handlers import SnowparkHandlers as HandlersImpl
|
30
|
+
from snowflake.ml.modeling._internal.model_trainer_builder import ModelTrainerBuilder
|
31
|
+
from snowflake.ml.modeling._internal.model_trainer import ModelTrainer
|
29
32
|
from snowflake.ml.modeling._internal.estimator_utils import (
|
30
33
|
gather_dependencies,
|
31
34
|
original_estimator_has_callable,
|
32
35
|
transform_snowml_obj_to_sklearn_obj,
|
33
36
|
validate_sklearn_args,
|
34
37
|
)
|
35
|
-
from snowflake.ml.modeling._internal.snowpark_handlers import SklearnWrapperProvider
|
36
38
|
from snowflake.ml.modeling._internal.estimator_protocols import FitPredictHandlers
|
37
39
|
|
38
40
|
from snowflake.ml.model.model_signature import (
|
@@ -52,7 +54,6 @@ _PROJECT = "ModelDevelopment"
|
|
52
54
|
_SUBPROJECT = "".join([s.capitalize() for s in "sklearn.feature_selection".replace("sklearn.", "").split("_")])
|
53
55
|
|
54
56
|
|
55
|
-
|
56
57
|
class VarianceThreshold(BaseTransformer):
|
57
58
|
r"""Feature selector that removes all low-variance features
|
58
59
|
For more details on this class, see [sklearn.feature_selection.VarianceThreshold]
|
@@ -60,46 +61,53 @@ class VarianceThreshold(BaseTransformer):
|
|
60
61
|
|
61
62
|
Parameters
|
62
63
|
----------
|
63
|
-
threshold: float, default=0
|
64
|
-
Features with a training-set variance lower than this threshold will
|
65
|
-
be removed. The default is to keep all features with non-zero variance,
|
66
|
-
i.e. remove the features that have the same value in all samples.
|
67
64
|
|
68
65
|
input_cols: Optional[Union[str, List[str]]]
|
69
66
|
A string or list of strings representing column names that contain features.
|
70
67
|
If this parameter is not specified, all columns in the input DataFrame except
|
71
68
|
the columns specified by label_cols, sample_weight_col, and passthrough_cols
|
72
|
-
parameters are considered input columns.
|
73
|
-
|
69
|
+
parameters are considered input columns. Input columns can also be set after
|
70
|
+
initialization with the `set_input_cols` method.
|
71
|
+
|
74
72
|
label_cols: Optional[Union[str, List[str]]]
|
75
|
-
|
76
|
-
|
77
|
-
columns. If this parameter is not specified, then object is fitted without
|
78
|
-
labels (like a transformer).
|
79
|
-
|
73
|
+
This parameter is optional and will be ignored during fit. It is present here for API consistency by convention.
|
74
|
+
|
80
75
|
output_cols: Optional[Union[str, List[str]]]
|
81
76
|
A string or list of strings representing column names that will store the
|
82
77
|
output of predict and transform operations. The length of output_cols must
|
83
|
-
match the expected number of output columns from the specific
|
78
|
+
match the expected number of output columns from the specific predictor or
|
84
79
|
transformer class used.
|
85
|
-
If this parameter
|
86
|
-
|
87
|
-
|
88
|
-
be set explicitly for transformers.
|
80
|
+
If you omit this parameter, output column names are derived by adding an
|
81
|
+
OUTPUT_ prefix to the label column names for supervised estimators, or
|
82
|
+
OUTPUT_<IDX>for unsupervised estimators. These inferred output column names
|
83
|
+
work for predictors, but output_cols must be set explicitly for transformers.
|
84
|
+
In general, explicitly specifying output column names is clearer, especially
|
85
|
+
if you don’t specify the input column names.
|
86
|
+
To transform in place, pass the same names for input_cols and output_cols.
|
87
|
+
be set explicitly for transformers. Output columns can also be set after
|
88
|
+
initialization with the `set_output_cols` method.
|
89
89
|
|
90
90
|
sample_weight_col: Optional[str]
|
91
91
|
A string representing the column name containing the sample weights.
|
92
|
-
This argument is only required when working with weighted datasets.
|
92
|
+
This argument is only required when working with weighted datasets. Sample
|
93
|
+
weight column can also be set after initialization with the
|
94
|
+
`set_sample_weight_col` method.
|
93
95
|
|
94
96
|
passthrough_cols: Optional[Union[str, List[str]]]
|
95
97
|
A string or a list of strings indicating column names to be excluded from any
|
96
98
|
operations (such as train, transform, or inference). These specified column(s)
|
97
99
|
will remain untouched throughout the process. This option is helpful in scenarios
|
98
100
|
requiring automatic input_cols inference, but need to avoid using specific
|
99
|
-
columns, like index columns, during training or inference.
|
101
|
+
columns, like index columns, during training or inference. Passthrough columns
|
102
|
+
can also be set after initialization with the `set_passthrough_cols` method.
|
100
103
|
|
101
104
|
drop_input_cols: Optional[bool], default=False
|
102
105
|
If set, the response of predict(), transform() methods will not contain input columns.
|
106
|
+
|
107
|
+
threshold: float, default=0
|
108
|
+
Features with a training-set variance lower than this threshold will
|
109
|
+
be removed. The default is to keep all features with non-zero variance,
|
110
|
+
i.e. remove the features that have the same value in all samples.
|
103
111
|
"""
|
104
112
|
|
105
113
|
def __init__( # type: ignore[no-untyped-def]
|
@@ -121,7 +129,7 @@ class VarianceThreshold(BaseTransformer):
|
|
121
129
|
self.set_passthrough_cols(passthrough_cols)
|
122
130
|
self.set_drop_input_cols(drop_input_cols)
|
123
131
|
self.set_sample_weight_col(sample_weight_col)
|
124
|
-
deps = set(
|
132
|
+
deps: Set[str] = set([f'numpy=={np.__version__}', f'scikit-learn=={sklearn.__version__}', f'cloudpickle=={cp.__version__}'])
|
125
133
|
|
126
134
|
self._deps = list(deps)
|
127
135
|
|
@@ -130,13 +138,14 @@ class VarianceThreshold(BaseTransformer):
|
|
130
138
|
args=init_args,
|
131
139
|
klass=sklearn.feature_selection.VarianceThreshold
|
132
140
|
)
|
133
|
-
self._sklearn_object = sklearn.feature_selection.VarianceThreshold(
|
141
|
+
self._sklearn_object: Any = sklearn.feature_selection.VarianceThreshold(
|
134
142
|
**cleaned_up_init_args,
|
135
143
|
)
|
136
144
|
self._model_signature_dict: Optional[Dict[str, ModelSignature]] = None
|
137
145
|
# If user used snowpark dataframe during fit, here it stores the snowpark input_cols, otherwise the processed input_cols
|
138
146
|
self._snowpark_cols: Optional[List[str]] = self.input_cols
|
139
|
-
self._handlers: FitPredictHandlers = HandlersImpl(class_name=VarianceThreshold.__class__.__name__, subproject=_SUBPROJECT, autogenerated=True
|
147
|
+
self._handlers: FitPredictHandlers = HandlersImpl(class_name=VarianceThreshold.__class__.__name__, subproject=_SUBPROJECT, autogenerated=True)
|
148
|
+
self._autogenerated = True
|
140
149
|
|
141
150
|
def _get_rand_id(self) -> str:
|
142
151
|
"""
|
@@ -192,54 +201,48 @@ class VarianceThreshold(BaseTransformer):
|
|
192
201
|
self
|
193
202
|
"""
|
194
203
|
self._infer_input_output_cols(dataset)
|
195
|
-
if isinstance(dataset,
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
self.
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
204
|
+
if isinstance(dataset, DataFrame):
|
205
|
+
session = dataset._session
|
206
|
+
assert session is not None # keep mypy happy
|
207
|
+
# Validate that key package version in user workspace are supported in snowflake conda channel
|
208
|
+
# If customer doesn't have package in conda channel, replace the ones have the closest versions
|
209
|
+
self._deps = pkg_version_utils.get_valid_pkg_versions_supported_in_snowflake_conda_channel(
|
210
|
+
pkg_versions=self._get_dependencies(), session=session, subproject=_SUBPROJECT)
|
211
|
+
|
212
|
+
# Specify input columns so column pruning will be enforced
|
213
|
+
selected_cols = self._get_active_columns()
|
214
|
+
if len(selected_cols) > 0:
|
215
|
+
dataset = dataset.select(selected_cols)
|
216
|
+
|
217
|
+
self._snowpark_cols = dataset.select(self.input_cols).columns
|
218
|
+
|
219
|
+
# If we are already in a stored procedure, no need to kick off another one.
|
220
|
+
if SNOWML_SPROC_ENV in os.environ:
|
221
|
+
statement_params = telemetry.get_function_usage_statement_params(
|
222
|
+
project=_PROJECT,
|
223
|
+
subproject=_SUBPROJECT,
|
224
|
+
function_name=telemetry.get_statement_params_full_func_name(inspect.currentframe(), VarianceThreshold.__class__.__name__),
|
225
|
+
api_calls=[Session.call],
|
226
|
+
custom_tags=dict([("autogen", True)]) if self._autogenerated else None,
|
227
|
+
)
|
228
|
+
pd_df: pd.DataFrame = dataset.to_pandas(statement_params=statement_params)
|
229
|
+
pd_df.columns = dataset.columns
|
230
|
+
dataset = pd_df
|
231
|
+
|
232
|
+
model_trainer = ModelTrainerBuilder.build(
|
233
|
+
estimator=self._sklearn_object,
|
234
|
+
dataset=dataset,
|
235
|
+
input_cols=self.input_cols,
|
236
|
+
label_cols=self.label_cols,
|
237
|
+
sample_weight_col=self.sample_weight_col,
|
238
|
+
autogenerated=self._autogenerated,
|
239
|
+
subproject=_SUBPROJECT
|
240
|
+
)
|
241
|
+
self._sklearn_object = model_trainer.train()
|
211
242
|
self._is_fitted = True
|
212
243
|
self._get_model_signatures(dataset)
|
213
244
|
return self
|
214
245
|
|
215
|
-
def _fit_snowpark(self, dataset: DataFrame) -> None:
|
216
|
-
session = dataset._session
|
217
|
-
assert session is not None # keep mypy happy
|
218
|
-
# Validate that key package version in user workspace are supported in snowflake conda channel
|
219
|
-
# If customer doesn't have package in conda channel, replace the ones have the closest versions
|
220
|
-
self._deps = pkg_version_utils.get_valid_pkg_versions_supported_in_snowflake_conda_channel(
|
221
|
-
pkg_versions=self._get_dependencies(), session=session, subproject=_SUBPROJECT)
|
222
|
-
|
223
|
-
# Specify input columns so column pruning will be enforced
|
224
|
-
selected_cols = self._get_active_columns()
|
225
|
-
if len(selected_cols) > 0:
|
226
|
-
dataset = dataset.select(selected_cols)
|
227
|
-
|
228
|
-
estimator = self._sklearn_object
|
229
|
-
assert estimator is not None # Keep mypy happy
|
230
|
-
|
231
|
-
self._snowpark_cols = dataset.select(self.input_cols).columns
|
232
|
-
|
233
|
-
self._sklearn_object = self._handlers.fit_snowpark(
|
234
|
-
dataset,
|
235
|
-
session,
|
236
|
-
estimator,
|
237
|
-
["snowflake-snowpark-python"] + self._get_dependencies(),
|
238
|
-
self.input_cols,
|
239
|
-
self.label_cols,
|
240
|
-
self.sample_weight_col,
|
241
|
-
)
|
242
|
-
|
243
246
|
def _get_pass_through_columns(self, dataset: DataFrame) -> List[str]:
|
244
247
|
if self._drop_input_cols:
|
245
248
|
return []
|
@@ -427,11 +430,6 @@ class VarianceThreshold(BaseTransformer):
|
|
427
430
|
subproject=_SUBPROJECT,
|
428
431
|
custom_tags=dict([("autogen", True)]),
|
429
432
|
)
|
430
|
-
@telemetry.add_stmt_params_to_df(
|
431
|
-
project=_PROJECT,
|
432
|
-
subproject=_SUBPROJECT,
|
433
|
-
custom_tags=dict([("autogen", True)]),
|
434
|
-
)
|
435
433
|
def predict(self, dataset: Union[DataFrame, pd.DataFrame]) -> Union[DataFrame, pd.DataFrame]:
|
436
434
|
"""Method not supported for this class.
|
437
435
|
|
@@ -483,11 +481,6 @@ class VarianceThreshold(BaseTransformer):
|
|
483
481
|
subproject=_SUBPROJECT,
|
484
482
|
custom_tags=dict([("autogen", True)]),
|
485
483
|
)
|
486
|
-
@telemetry.add_stmt_params_to_df(
|
487
|
-
project=_PROJECT,
|
488
|
-
subproject=_SUBPROJECT,
|
489
|
-
custom_tags=dict([("autogen", True)]),
|
490
|
-
)
|
491
484
|
def transform(self, dataset: Union[DataFrame, pd.DataFrame]) -> Union[DataFrame, pd.DataFrame]:
|
492
485
|
"""Reduce X to the selected features
|
493
486
|
For more details on this function, see [sklearn.feature_selection.VarianceThreshold.transform]
|
@@ -546,7 +539,8 @@ class VarianceThreshold(BaseTransformer):
|
|
546
539
|
if False:
|
547
540
|
self.fit(dataset)
|
548
541
|
assert self._sklearn_object is not None
|
549
|
-
|
542
|
+
labels : npt.NDArray[Any] = self._sklearn_object.labels_
|
543
|
+
return labels
|
550
544
|
else:
|
551
545
|
raise NotImplementedError
|
552
546
|
|
@@ -582,6 +576,7 @@ class VarianceThreshold(BaseTransformer):
|
|
582
576
|
output_cols = []
|
583
577
|
|
584
578
|
# Make sure column names are valid snowflake identifiers.
|
579
|
+
assert output_cols is not None # Make MyPy happy
|
585
580
|
rv = [identifier.rename_to_valid_snowflake_identifier(c) for c in output_cols]
|
586
581
|
|
587
582
|
return rv
|
@@ -592,11 +587,6 @@ class VarianceThreshold(BaseTransformer):
|
|
592
587
|
subproject=_SUBPROJECT,
|
593
588
|
custom_tags=dict([("autogen", True)]),
|
594
589
|
)
|
595
|
-
@telemetry.add_stmt_params_to_df(
|
596
|
-
project=_PROJECT,
|
597
|
-
subproject=_SUBPROJECT,
|
598
|
-
custom_tags=dict([("autogen", True)]),
|
599
|
-
)
|
600
590
|
def predict_proba(
|
601
591
|
self, dataset: Union[DataFrame, pd.DataFrame], output_cols_prefix: str = "predict_proba_"
|
602
592
|
) -> Union[DataFrame, pd.DataFrame]:
|
@@ -637,11 +627,6 @@ class VarianceThreshold(BaseTransformer):
|
|
637
627
|
subproject=_SUBPROJECT,
|
638
628
|
custom_tags=dict([("autogen", True)]),
|
639
629
|
)
|
640
|
-
@telemetry.add_stmt_params_to_df(
|
641
|
-
project=_PROJECT,
|
642
|
-
subproject=_SUBPROJECT,
|
643
|
-
custom_tags=dict([("autogen", True)]),
|
644
|
-
)
|
645
630
|
def predict_log_proba(
|
646
631
|
self, dataset: Union[DataFrame, pd.DataFrame], output_cols_prefix: str = "predict_log_proba_"
|
647
632
|
) -> Union[DataFrame, pd.DataFrame]:
|
@@ -678,16 +663,6 @@ class VarianceThreshold(BaseTransformer):
|
|
678
663
|
return output_df
|
679
664
|
|
680
665
|
@available_if(original_estimator_has_callable("decision_function")) # type: ignore[misc]
|
681
|
-
@telemetry.send_api_usage_telemetry(
|
682
|
-
project=_PROJECT,
|
683
|
-
subproject=_SUBPROJECT,
|
684
|
-
custom_tags=dict([("autogen", True)]),
|
685
|
-
)
|
686
|
-
@telemetry.add_stmt_params_to_df(
|
687
|
-
project=_PROJECT,
|
688
|
-
subproject=_SUBPROJECT,
|
689
|
-
custom_tags=dict([("autogen", True)]),
|
690
|
-
)
|
691
666
|
def decision_function(
|
692
667
|
self, dataset: Union[DataFrame, pd.DataFrame], output_cols_prefix: str = "decision_function_"
|
693
668
|
) -> Union[DataFrame, pd.DataFrame]:
|
@@ -786,11 +761,6 @@ class VarianceThreshold(BaseTransformer):
|
|
786
761
|
subproject=_SUBPROJECT,
|
787
762
|
custom_tags=dict([("autogen", True)]),
|
788
763
|
)
|
789
|
-
@telemetry.add_stmt_params_to_df(
|
790
|
-
project=_PROJECT,
|
791
|
-
subproject=_SUBPROJECT,
|
792
|
-
custom_tags=dict([("autogen", True)]),
|
793
|
-
)
|
794
764
|
def kneighbors(
|
795
765
|
self,
|
796
766
|
dataset: Union[DataFrame, pd.DataFrame],
|
@@ -850,9 +820,9 @@ class VarianceThreshold(BaseTransformer):
|
|
850
820
|
# For classifier, the type of predict is the same as the type of label
|
851
821
|
if self._sklearn_object._estimator_type == 'classifier':
|
852
822
|
# label columns is the desired type for output
|
853
|
-
outputs = _infer_signature(dataset[self.label_cols], "output", use_snowflake_identifiers=True)
|
823
|
+
outputs = list(_infer_signature(dataset[self.label_cols], "output", use_snowflake_identifiers=True))
|
854
824
|
# rename the output columns
|
855
|
-
outputs = model_signature_utils.rename_features(outputs, self.output_cols)
|
825
|
+
outputs = list(model_signature_utils.rename_features(outputs, self.output_cols))
|
856
826
|
self._model_signature_dict["predict"] = ModelSignature(inputs,
|
857
827
|
([] if self._drop_input_cols else inputs)
|
858
828
|
+ outputs)
|