PyIAML 1.0.0__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.
Files changed (279) hide show
  1. iaml/__init__.py +56 -0
  2. iaml/actionable.py +11 -0
  3. iaml/actionables/__init__.py +21 -0
  4. iaml/actionables/boosting/__init__.py +4 -0
  5. iaml/actionables/boosting/act_adaboost.py +59 -0
  6. iaml/actionables/cleaning/__init__.py +26 -0
  7. iaml/actionables/cleaning/act_categorical_imputer.py +124 -0
  8. iaml/actionables/cleaning/act_count_vectorizer.py +204 -0
  9. iaml/actionables/cleaning/act_drop_categorical_column.py +51 -0
  10. iaml/actionables/cleaning/act_drop_date_column.py +48 -0
  11. iaml/actionables/cleaning/act_drop_high_cardinality_categorical.py +337 -0
  12. iaml/actionables/cleaning/act_drop_numerical_column.py +75 -0
  13. iaml/actionables/cleaning/act_drop_textual_column.py +51 -0
  14. iaml/actionables/cleaning/act_encode_target_column.py +56 -0
  15. iaml/actionables/cleaning/act_frequency_encoder.py +127 -0
  16. iaml/actionables/cleaning/act_hashing_vectorizer.py +186 -0
  17. iaml/actionables/cleaning/act_knn_imputer.py +152 -0
  18. iaml/actionables/cleaning/act_mean_column.py +79 -0
  19. iaml/actionables/cleaning/act_mice.py +464 -0
  20. iaml/actionables/cleaning/act_missing_count_feature.py +109 -0
  21. iaml/actionables/cleaning/act_missing_indicator.py +124 -0
  22. iaml/actionables/cleaning/act_onehot.py +65 -0
  23. iaml/actionables/cleaning/act_ordinal_encoder.py +177 -0
  24. iaml/actionables/cleaning/act_rare_category_grouper.py +173 -0
  25. iaml/actionables/cleaning/act_simple_imputer.py +109 -0
  26. iaml/actionables/cleaning/act_split_date.py +68 -0
  27. iaml/actionables/cleaning/act_target_encoder.py +274 -0
  28. iaml/actionables/cleaning/act_text_normalizer.py +241 -0
  29. iaml/actionables/cleaning/act_tf_idf.py +80 -0
  30. iaml/actionables/cleaning/act_word2vec.py +150 -0
  31. iaml/actionables/features_precleaning/__init__.py +12 -0
  32. iaml/actionables/features_precleaning/act_coerce_numeric_strings.py +194 -0
  33. iaml/actionables/features_precleaning/act_date_converter.py +99 -0
  34. iaml/actionables/features_precleaning/act_drop_bad_quality_rows.py +77 -0
  35. iaml/actionables/features_precleaning/act_drop_duplicate_rows.py +131 -0
  36. iaml/actionables/features_precleaning/act_drop_high_missing_columns.py +94 -0
  37. iaml/actionables/features_precleaning/act_drop_id_like_columns.py +294 -0
  38. iaml/actionables/features_precleaning/act_normalize_column_names.py +157 -0
  39. iaml/actionables/features_precleaning/act_sentinel_to_na_n.py +270 -0
  40. iaml/actionables/features_precleaning/act_trim_space.py +79 -0
  41. iaml/actionables/features_preprocessing/__init__.py +18 -0
  42. iaml/actionables/features_preprocessing/act_cyclical_date_encoding.py +212 -0
  43. iaml/actionables/features_preprocessing/act_fast_ica.py +161 -0
  44. iaml/actionables/features_preprocessing/act_feature_agglomeration.py +90 -0
  45. iaml/actionables/features_preprocessing/act_k_bins_discretizer.py +207 -0
  46. iaml/actionables/features_preprocessing/act_k_means_features.py +296 -0
  47. iaml/actionables/features_preprocessing/act_kernel_pca.py +143 -0
  48. iaml/actionables/features_preprocessing/act_log_transformer.py +122 -0
  49. iaml/actionables/features_preprocessing/act_nystroem.py +100 -0
  50. iaml/actionables/features_preprocessing/act_pca.py +77 -0
  51. iaml/actionables/features_preprocessing/act_polynomial_features.py +86 -0
  52. iaml/actionables/features_preprocessing/act_power_transformer.py +106 -0
  53. iaml/actionables/features_preprocessing/act_quantile_transformer.py +114 -0
  54. iaml/actionables/features_preprocessing/act_rbf_sampler.py +88 -0
  55. iaml/actionables/features_preprocessing/act_select_percentile.py +112 -0
  56. iaml/actionables/features_preprocessing/act_sparse_random_projection.py +157 -0
  57. iaml/actionables/features_preprocessing/act_truncated_svd.py +137 -0
  58. iaml/actionables/features_selection/__init__.py +8 -0
  59. iaml/actionables/features_selection/act_permutation_importance_selector.py +421 -0
  60. iaml/actionables/features_selection/act_remove_high_correlated_column.py +70 -0
  61. iaml/actionables/features_selection/act_remove_low_variance_column.py +74 -0
  62. iaml/actionables/features_selection/act_rfe.py +214 -0
  63. iaml/actionables/features_selection/act_select_from_model.py +325 -0
  64. iaml/actionables/features_selection/act_select_k_best.py +181 -0
  65. iaml/actionables/features_selection/act_vif_selector.py +130 -0
  66. iaml/actionables/imbalance/__init__.py +10 -0
  67. iaml/actionables/imbalance/act_adasyn.py +150 -0
  68. iaml/actionables/imbalance/act_borderline_smote.py +171 -0
  69. iaml/actionables/imbalance/act_near_miss.py +158 -0
  70. iaml/actionables/imbalance/act_random_over_sampling.py +60 -0
  71. iaml/actionables/imbalance/act_random_under_sampler.py +135 -0
  72. iaml/actionables/imbalance/act_smote.py +162 -0
  73. iaml/actionables/imbalance/act_smote_tomek.py +182 -0
  74. iaml/actionables/imbalance/act_smoteenn.py +193 -0
  75. iaml/actionables/imbalance/act_tomek_links.py +138 -0
  76. iaml/actionables/normalize/__init__.py +6 -0
  77. iaml/actionables/normalize/act_max_abs_scaler.py +78 -0
  78. iaml/actionables/normalize/act_minmax_scaler.py +56 -0
  79. iaml/actionables/normalize/act_normalizer.py +95 -0
  80. iaml/actionables/normalize/act_robust_scaler.py +111 -0
  81. iaml/actionables/normalize/act_standard_scaler.py +55 -0
  82. iaml/actionables/predictors/__init__.py +6 -0
  83. iaml/actionables/predictors/_xgboost.py +16 -0
  84. iaml/actionables/predictors/classifier/__init__.py +26 -0
  85. iaml/actionables/predictors/classifier/act_bagging_classifier.py +113 -0
  86. iaml/actionables/predictors/classifier/act_bernoulli_nb.py +89 -0
  87. iaml/actionables/predictors/classifier/act_catboost_classifier.py +135 -0
  88. iaml/actionables/predictors/classifier/act_complement_nb.py +106 -0
  89. iaml/actionables/predictors/classifier/act_decision_tree_classifier.py +117 -0
  90. iaml/actionables/predictors/classifier/act_extra_trees_classifier.py +115 -0
  91. iaml/actionables/predictors/classifier/act_gaussian_nb.py +53 -0
  92. iaml/actionables/predictors/classifier/act_hist_gradient_boosting_classifier.py +144 -0
  93. iaml/actionables/predictors/classifier/act_knn.py +86 -0
  94. iaml/actionables/predictors/classifier/act_light_gbm_classifier.py +211 -0
  95. iaml/actionables/predictors/classifier/act_linear_discriminant_analysis.py +63 -0
  96. iaml/actionables/predictors/classifier/act_linear_svc.py +134 -0
  97. iaml/actionables/predictors/classifier/act_logistic_regression.py +92 -0
  98. iaml/actionables/predictors/classifier/act_mlp_classifier.py +107 -0
  99. iaml/actionables/predictors/classifier/act_multinomial_nb.py +76 -0
  100. iaml/actionables/predictors/classifier/act_passive_aggressive_classifier.py +141 -0
  101. iaml/actionables/predictors/classifier/act_quadratic_discriminant_analysis.py +72 -0
  102. iaml/actionables/predictors/classifier/act_randomforest.py +113 -0
  103. iaml/actionables/predictors/classifier/act_ridge_classifier.py +116 -0
  104. iaml/actionables/predictors/classifier/act_sgd_classifier.py +149 -0
  105. iaml/actionables/predictors/classifier/act_svm_svc.py +88 -0
  106. iaml/actionables/predictors/classifier/act_xgboost.py +111 -0
  107. iaml/actionables/predictors/regressor/__init__.py +27 -0
  108. iaml/actionables/predictors/regressor/act_ada_boost_regressor.py +75 -0
  109. iaml/actionables/predictors/regressor/act_ard_regression.py +95 -0
  110. iaml/actionables/predictors/regressor/act_catboost_regressor.py +134 -0
  111. iaml/actionables/predictors/regressor/act_decision_tree_regressor.py +111 -0
  112. iaml/actionables/predictors/regressor/act_elastic_net_regressor.py +109 -0
  113. iaml/actionables/predictors/regressor/act_extra_trees_regressor.py +113 -0
  114. iaml/actionables/predictors/regressor/act_gaussian_process_regressor.py +55 -0
  115. iaml/actionables/predictors/regressor/act_gboost_regressor.py +95 -0
  116. iaml/actionables/predictors/regressor/act_hist_gradient_boosting_regressor.py +105 -0
  117. iaml/actionables/predictors/regressor/act_huber_regressor.py +101 -0
  118. iaml/actionables/predictors/regressor/act_knn_regressor.py +86 -0
  119. iaml/actionables/predictors/regressor/act_lasso_regressor.py +103 -0
  120. iaml/actionables/predictors/regressor/act_light_gbm_regressor.py +201 -0
  121. iaml/actionables/predictors/regressor/act_linear_regression.py +43 -0
  122. iaml/actionables/predictors/regressor/act_mlp_regressor.py +104 -0
  123. iaml/actionables/predictors/regressor/act_poisson_regressor.py +111 -0
  124. iaml/actionables/predictors/regressor/act_quantile_regressor.py +87 -0
  125. iaml/actionables/predictors/regressor/act_randomforest_regressor.py +116 -0
  126. iaml/actionables/predictors/regressor/act_ransac_regressor.py +106 -0
  127. iaml/actionables/predictors/regressor/act_ridge_regressor.py +107 -0
  128. iaml/actionables/predictors/regressor/act_sgd_regressor.py +106 -0
  129. iaml/actionables/predictors/regressor/act_svm_svr.py +81 -0
  130. iaml/actionables/predictors/regressor/act_xgboost_regressor.py +97 -0
  131. iaml/actionables/predictors/survival/__init__.py +12 -0
  132. iaml/actionables/predictors/survival/act_aalen_additive_model.py +83 -0
  133. iaml/actionables/predictors/survival/act_cox.py +110 -0
  134. iaml/actionables/predictors/survival/act_coxnet_survival_analysis.py +134 -0
  135. iaml/actionables/predictors/survival/act_extra_survival_trees.py +101 -0
  136. iaml/actionables/predictors/survival/act_fast_survival_svm.py +102 -0
  137. iaml/actionables/predictors/survival/act_gradient_boosting_survival_analysis.py +93 -0
  138. iaml/actionables/predictors/survival/act_random_survival_forest.py +91 -0
  139. iaml/actionables/predictors/survival/act_survival_component_wise_gboost.py +80 -0
  140. iaml/actionables/predictors/survival/act_survival_tree.py +120 -0
  141. iaml/actionables/predictors/survival/act_survival_xgboost.py +9 -0
  142. iaml/actionables/predictors/survival/act_weibull_aft.py +230 -0
  143. iaml/cache.py +61 -0
  144. iaml/cache_keys.py +57 -0
  145. iaml/candidate.py +736 -0
  146. iaml/core_dispatcher.py +125 -0
  147. iaml/data_type.py +11 -0
  148. iaml/dataset.py +506 -0
  149. iaml/decorators/__init__.py +3 -0
  150. iaml/decorators/all.py +4 -0
  151. iaml/decorators/is_step.py +45 -0
  152. iaml/decorators/runner.py +100 -0
  153. iaml/explanation.py +112 -0
  154. iaml/iaml.py +1072 -0
  155. iaml/iaml_pipeline.py +600 -0
  156. iaml/logger.py +138 -0
  157. iaml/meta_explorer_step.py +62 -0
  158. iaml/meta_ordered_step.py +28 -0
  159. iaml/meta_partial_explorer_step.py +34 -0
  160. iaml/meta_singleton.py +24 -0
  161. iaml/metastep.py +211 -0
  162. iaml/metric.py +111 -0
  163. iaml/metric_plot.py +82 -0
  164. iaml/metrics/__init__.py +21 -0
  165. iaml/metrics/_classification.py +28 -0
  166. iaml/metrics/_survival_times.py +22 -0
  167. iaml/metrics/accuracy_metric.py +59 -0
  168. iaml/metrics/balanced_accuracy_metric.py +67 -0
  169. iaml/metrics/brier_score.py +90 -0
  170. iaml/metrics/classification_error_metric.py +66 -0
  171. iaml/metrics/concordance_index_ipcw.py +84 -0
  172. iaml/metrics/concordance_index_metric.py +67 -0
  173. iaml/metrics/cumulative_dynamic_auc.py +119 -0
  174. iaml/metrics/f1_score_metric.py +71 -0
  175. iaml/metrics/integrated_brier_score.py +98 -0
  176. iaml/metrics/integrated_brier_score_loss.py +41 -0
  177. iaml/metrics/mean_absolute_error_metric.py +46 -0
  178. iaml/metrics/mean_squared_error_metric.py +46 -0
  179. iaml/metrics/mean_squared_log_error_metric.py +49 -0
  180. iaml/metrics/median_absolute_error_metric.py +48 -0
  181. iaml/metrics/precision_metric.py +63 -0
  182. iaml/metrics/r2_score_metric.py +45 -0
  183. iaml/metrics/recall_metric.py +65 -0
  184. iaml/metrics/roc_auc_metric.py +50 -0
  185. iaml/metrics/specificity_metric.py +44 -0
  186. iaml/metrics/specificity_multiclass_metric.py +55 -0
  187. iaml/metrics/specificity_multilabel_metric.py +60 -0
  188. iaml/optimizers/__init__.py +5 -0
  189. iaml/optimizers/bayesian_optimizer.py +193 -0
  190. iaml/optimizers/genetic_optimizer.py +284 -0
  191. iaml/optimizers/optimizer.py +31 -0
  192. iaml/optimizers/random_optimizer.py +101 -0
  193. iaml/plot.py +138 -0
  194. iaml/plots/__init__.py +32 -0
  195. iaml/plots/bar_plot.py +141 -0
  196. iaml/plots/box_plot.py +166 -0
  197. iaml/plots/class_prediction_error_plot.py +37 -0
  198. iaml/plots/classification_report_plot.py +35 -0
  199. iaml/plots/confusion_matrix_plot.py +34 -0
  200. iaml/plots/correlation_heatmap_plot.py +201 -0
  201. iaml/plots/cumulative_hazard_plot.py +72 -0
  202. iaml/plots/density_plot.py +210 -0
  203. iaml/plots/histogram_plot.py +179 -0
  204. iaml/plots/kaplan_meier_comparison_plot.py +89 -0
  205. iaml/plots/line_plot.py +70 -0
  206. iaml/plots/missingness_heatmap_plot.py +203 -0
  207. iaml/plots/outlier_plot.py +217 -0
  208. iaml/plots/pair_plot.py +228 -0
  209. iaml/plots/precision_recall_curve_plot.py +86 -0
  210. iaml/plots/prediction_error_plot.py +34 -0
  211. iaml/plots/qq_plot.py +220 -0
  212. iaml/plots/residual_plot.py +38 -0
  213. iaml/plots/roc_dynamique_curve_plot.py +79 -0
  214. iaml/plots/rocauc_plot.py +96 -0
  215. iaml/plots/shap_plot.py +187 -0
  216. iaml/plots/target_distribution_plot.py +241 -0
  217. iaml/plots/violin_plot.py +206 -0
  218. iaml/predictor.py +139 -0
  219. iaml/reference.py +65 -0
  220. iaml/shared_cache.py +90 -0
  221. iaml/sklearn_preprocessor.py +74 -0
  222. iaml/splitters/__init__.py +3 -0
  223. iaml/splitters/kfold_splitter.py +32 -0
  224. iaml/splitters/random_splitter.py +26 -0
  225. iaml/stack.py +39 -0
  226. iaml/statistic.py +66 -0
  227. iaml/statistics/__init__.py +77 -0
  228. iaml/statistics/anova_statistic.py +80 -0
  229. iaml/statistics/cardinality_ratio_statistic.py +63 -0
  230. iaml/statistics/category_cooccurrence_statistic.py +79 -0
  231. iaml/statistics/chi_square_statistic.py +81 -0
  232. iaml/statistics/coef_variation_statistic.py +72 -0
  233. iaml/statistics/correlation_with_target.py +105 -0
  234. iaml/statistics/count.py +72 -0
  235. iaml/statistics/data_type_summary_statistic.py +74 -0
  236. iaml/statistics/duplicate_row_statistic.py +56 -0
  237. iaml/statistics/effect_size_statistic.py +129 -0
  238. iaml/statistics/entropy_statistic.py +69 -0
  239. iaml/statistics/event_rate_statistic.py +52 -0
  240. iaml/statistics/grouped_mean_statistic.py +60 -0
  241. iaml/statistics/iqr_statistic.py +66 -0
  242. iaml/statistics/kurtosis.py +50 -0
  243. iaml/statistics/mad_statistic.py +66 -0
  244. iaml/statistics/mean.py +61 -0
  245. iaml/statistics/median_statistic.py +61 -0
  246. iaml/statistics/minmax.py +60 -0
  247. iaml/statistics/missing_rate_statistic.py +62 -0
  248. iaml/statistics/mode.py +47 -0
  249. iaml/statistics/most_frequent_ratio.py +81 -0
  250. iaml/statistics/outlier_count_iqr_statistic.py +76 -0
  251. iaml/statistics/quantile.py +59 -0
  252. iaml/statistics/range.py +53 -0
  253. iaml/statistics/rare_category_rate.py +92 -0
  254. iaml/statistics/skewness.py +53 -0
  255. iaml/statistics/stdev.py +50 -0
  256. iaml/statistics/summary_table_statistic.py +60 -0
  257. iaml/statistics/time_by_group_statistic.py +83 -0
  258. iaml/statistics/time_summary_statistic.py +56 -0
  259. iaml/statistics/top_k_value_counts.py +68 -0
  260. iaml/statistics/unique_count_statistic.py +57 -0
  261. iaml/statistics/value_counts.py +63 -0
  262. iaml/statistics/variance.py +51 -0
  263. iaml/statistics/violin.py +63 -0
  264. iaml/step.py +600 -0
  265. iaml/step_cache.py +87 -0
  266. iaml/step_wrapper.py +79 -0
  267. iaml/timed_pool_executor.py +492 -0
  268. iaml/type_of_target.py +68 -0
  269. iaml/void_step.py +101 -0
  270. iaml/worker_manager.py +169 -0
  271. iaml/wrapper/__init__.py +4 -0
  272. iaml/wrapper/wrap_basic_gridsearch.py +68 -0
  273. iaml/wrapper/wrap_genetic_gridsearch.py +293 -0
  274. iaml/wrapper/wrap_iterative_gridsearch.py +399 -0
  275. pyiaml-1.0.0.dist-info/METADATA +802 -0
  276. pyiaml-1.0.0.dist-info/RECORD +279 -0
  277. pyiaml-1.0.0.dist-info/WHEEL +5 -0
  278. pyiaml-1.0.0.dist-info/licenses/LICENSE +674 -0
  279. pyiaml-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,157 @@
1
+ """[STEP] Reduce dimensions with SparseRandomProjection."""
2
+ import textwrap
3
+ import pandas as pd
4
+ from sklearn.random_projection import SparseRandomProjection
5
+ from ...actionable import Actionable
6
+ from ...candidate import Candidate
7
+ from ...dataset import Dataset
8
+ from ...data_type import DataType
9
+ from ...decorators.all import is_step
10
+
11
+
12
+ @is_step('features_preprocessing')
13
+ class ActSparseRandomProjection(Actionable):
14
+ """[STEP] Reduce dimensions with SparseRandomProjection."""
15
+
16
+ name: str = "SparseRandomProjection"
17
+ _description: str = "Project numeric features to a lower-dimensional space quickly"
18
+ _usage: str = "Use when you need fast, scalable reduction of many numeric features and can trade interpretability, vs heavier ActKernelPCA or ActFastICA. Applicable to high-dimensional numeric data, including sparse inputs. Avoid when features are few or you need interpretable axes."
19
+ _description_long: str = textwrap.dedent('''\
20
+ Sparse random projection compresses high-dimensional numeric features by
21
+ multiplying them with a sparse random matrix. This preserves distances in
22
+ expectation while keeping computation fast, making it suitable for large
23
+ feature spaces where traditional decompositions are expensive.
24
+ ''')
25
+
26
+ def __init__(self):
27
+ self.columns: list[str] = []
28
+ self.component_names: list[str] = []
29
+ self.preprocessor: SparseRandomProjection | None = None
30
+
31
+ self.configuration = {
32
+ 'n_components': {
33
+ 'description': 'Number of components to keep.',
34
+ 'default': 100,
35
+ 'range': [2, 2000]
36
+ },
37
+ 'density': {
38
+ 'description': textwrap.dedent('''\
39
+ Proportion of non-zero elements in the projection matrix.
40
+ Use "auto" to rely on the default 1/sqrt(n_features).'''),
41
+ 'default': 'auto'
42
+ },
43
+ 'random_state': {
44
+ 'description': 'Random State',
45
+ 'default': 42
46
+ }
47
+ }
48
+
49
+ self.optimizable: bool = True
50
+
51
+ @staticmethod
52
+ def _coerce_int(value: object, default: int) -> int:
53
+ try:
54
+ return int(value)
55
+ except (TypeError, ValueError):
56
+ return default
57
+
58
+ def _resolve_n_components(self, n_samples: int, n_features: int) -> int | None:
59
+ max_components = min(n_samples, n_features)
60
+ if max_components < 2:
61
+ return None
62
+ n_components = self._coerce_int(self.get_config('n_components'), max_components)
63
+ n_components = max(2, n_components)
64
+ return min(n_components, max_components)
65
+
66
+ def _resolve_density(self) -> float | str:
67
+ value = self.get_config('density')
68
+ if value is None:
69
+ return 'auto'
70
+ if isinstance(value, str):
71
+ stripped = value.strip().lower()
72
+ if stripped in ['', 'auto', 'none']:
73
+ return 'auto'
74
+ try:
75
+ value = float(stripped)
76
+ except ValueError:
77
+ return 'auto'
78
+ try:
79
+ numeric = float(value)
80
+ except (TypeError, ValueError):
81
+ return 'auto'
82
+ if numeric <= 0:
83
+ return 'auto'
84
+ return min(numeric, 1.0)
85
+
86
+ def _build_transformer(self, n_components: int) -> SparseRandomProjection:
87
+ params = self.passthrough_parameters()
88
+ params['n_components'] = int(n_components)
89
+ params['density'] = self._resolve_density()
90
+ return SparseRandomProjection(**params)
91
+
92
+ def fit(self, dataset: Dataset) -> Actionable:
93
+ self.columns = dataset.get_columns_names_by_type(DataType.NUMERIC)
94
+ self.preprocessor = None
95
+ self.component_names = []
96
+
97
+ if not self.columns or dataset.X.empty:
98
+ return self
99
+
100
+ values = dataset.X[self.columns]
101
+ if values.isna().any().any():
102
+ return self
103
+ n_components = self._resolve_n_components(*values.shape)
104
+ if n_components is None:
105
+ return self
106
+
107
+ self.configure('n_components', n_components) # pylint: disable=too-many-function-args
108
+ self.preprocessor = self._build_transformer(n_components)
109
+ self.preprocessor.fit(values)
110
+
111
+ self.component_names = [f"srp_{i}" for i in range(n_components)]
112
+ return self
113
+
114
+ def transform(self, X: pd.DataFrame) -> pd.DataFrame:
115
+ """Apply SparseRandomProjection
116
+
117
+ :param pd.DataFrame X: DataFrame to transform
118
+ :return: Transformed dataset
119
+ """
120
+ if self.preprocessor is None or not self.columns:
121
+ return X
122
+
123
+ values = X[self.columns]
124
+ transformed = self.preprocessor.transform(values)
125
+ if hasattr(transformed, "toarray"):
126
+ transformed = transformed.toarray()
127
+
128
+ component_names = self.component_names or [
129
+ f"srp_{i}" for i in range(transformed.shape[1])
130
+ ]
131
+ projected_df = pd.DataFrame(transformed, columns=component_names, index=X.index)
132
+
133
+ X = X.drop(columns=self.columns)
134
+ return pd.concat([X, projected_df], axis=1)
135
+
136
+ def suitable(self, dataset: Dataset) -> bool:
137
+ columns = dataset.get_columns_names_by_type(DataType.NUMERIC)
138
+ if not columns or dataset.X.empty:
139
+ return False
140
+ values = dataset.X[columns]
141
+ if values.isna().any().any():
142
+ return False
143
+ return min(values.shape) > 1
144
+
145
+ def priorize(self, candidate: Candidate = None) -> float:
146
+ if candidate is None:
147
+ return 0.0
148
+ dataset = candidate.dataset
149
+ columns = dataset.get_columns_names_by_type(DataType.NUMERIC)
150
+ if not columns or dataset.X.empty:
151
+ return 0.0
152
+ values = dataset.X[columns]
153
+ if min(values.shape) <= 1:
154
+ return 0.0
155
+ n_features = values.shape[1]
156
+ n_samples = values.shape[0]
157
+ return min(1.0, n_features / max(1, n_samples))
@@ -0,0 +1,137 @@
1
+ """[STEP] Reduce dimensions with TruncatedSVD"""
2
+ import textwrap
3
+ import pandas as pd
4
+ from sklearn.decomposition import TruncatedSVD
5
+ from ...actionable import Actionable
6
+ from ...candidate import Candidate
7
+ from ...dataset import Dataset
8
+ from ...data_type import DataType
9
+ from ...decorators.all import is_step
10
+
11
+
12
+ @is_step('features_preprocessing')
13
+ class ActTruncatedSVD(Actionable):
14
+ """[STEP] Reduce dimensions with TruncatedSVD"""
15
+
16
+ name: str = "TruncatedSVD"
17
+ _description: str = "Reduce dimensionality for sparse or high-dimensional numeric features"
18
+ _description_long: str = textwrap.dedent('''\
19
+ TruncatedSVD performs a low-rank approximation of the feature matrix.
20
+ It is well suited for sparse representations such as TF-IDF or hashing
21
+ vectors, and can reduce the number of features while preserving most
22
+ of the structure of the data.
23
+ ''')
24
+ _usage: str = "Use when you need linear reduction for sparse, high-dimensional numeric features; compare ActKernelPCA for nonlinear patterns. Applicable to TF-IDF, hashing, and large numeric feature matrices. Avoid when data is dense with nonlinear structure or when ActFastICA is the goal."
25
+
26
+ def __init__(self):
27
+ self.columns: list[str] = []
28
+ self.preprocessor: TruncatedSVD | None = None
29
+ self.component_names: list[str] = []
30
+
31
+ self.configuration = {
32
+ 'n_components': {
33
+ 'description': 'Number of components to keep.',
34
+ 'default': 100,
35
+ 'range': [2, 2000]
36
+ },
37
+ 'algorithm': {
38
+ 'description': 'SVD solver to use.',
39
+ 'default': 'randomized',
40
+ 'categorical': ['randomized', 'arpack']
41
+ },
42
+ 'n_iter': {
43
+ 'description': 'Number of power iterations for randomized SVD.',
44
+ 'default': 5,
45
+ 'range': [2, 15]
46
+ },
47
+ 'tol': {
48
+ 'description': 'Tolerance for arpack solver.',
49
+ 'default': 0.0,
50
+ 'range': [0.0, 0.1]
51
+ },
52
+ 'random_state': {
53
+ 'description': 'Random State',
54
+ 'default': 42
55
+ }
56
+ }
57
+
58
+ self.optimizable: bool = True
59
+
60
+ @staticmethod
61
+ def _coerce_int(value: object, default: int) -> int:
62
+ try:
63
+ return int(value)
64
+ except (TypeError, ValueError):
65
+ return default
66
+
67
+ def _resolve_n_components(self, n_samples: int, n_features: int) -> int | None:
68
+ max_components = min(n_samples - 1, n_features - 1)
69
+ if max_components < 1:
70
+ return None
71
+ n_components = self._coerce_int(self.get_config('n_components'), max_components)
72
+ n_components = max(1, n_components)
73
+ return min(n_components, max_components)
74
+
75
+ def fit(self, dataset: Dataset) -> Actionable:
76
+ self.columns = dataset.get_columns_names_by_type(DataType.NUMERIC)
77
+ self.preprocessor = None
78
+ self.component_names = []
79
+
80
+ if not self.columns or dataset.X.empty:
81
+ return self
82
+
83
+ values = dataset.X[self.columns]
84
+ if values.isna().any().any():
85
+ return self
86
+ n_components = self._resolve_n_components(*values.shape)
87
+ if n_components is None:
88
+ return self
89
+
90
+ self.configure('n_components', n_components) # pylint: disable=too-many-function-args
91
+ params = self.passthrough_parameters()
92
+ self.preprocessor = TruncatedSVD(**params)
93
+ self.preprocessor.fit(values)
94
+
95
+ self.component_names = [f"svd_{i}" for i in range(n_components)]
96
+ return self
97
+
98
+ def transform(self, X: pd.DataFrame) -> pd.DataFrame:
99
+ """Apply TruncatedSVD
100
+
101
+ :param pd.DataFrame X: DataFrame to transform
102
+ :return: Transformed dataset
103
+ """
104
+ if self.preprocessor is None or not self.columns:
105
+ return X
106
+
107
+ values = X[self.columns]
108
+ transformed = self.preprocessor.transform(values)
109
+ component_names = self.component_names or [
110
+ f"svd_{i}" for i in range(transformed.shape[1])
111
+ ]
112
+ svd_df = pd.DataFrame(transformed, columns=component_names, index=X.index)
113
+
114
+ X = X.drop(columns=self.columns)
115
+ return pd.concat([X, svd_df], axis=1)
116
+
117
+ def suitable(self, dataset: Dataset) -> bool:
118
+ columns = dataset.get_columns_names_by_type(DataType.NUMERIC)
119
+ if not columns or dataset.X.empty:
120
+ return False
121
+ values = dataset.X[columns]
122
+ if values.isna().any().any():
123
+ return False
124
+ return min(values.shape) > 1
125
+
126
+ def priorize(self, candidate: Candidate = None) -> float:
127
+ if candidate is None:
128
+ return 0.0
129
+ dataset = candidate.dataset
130
+ columns = dataset.get_columns_names_by_type(DataType.NUMERIC)
131
+ if not columns or dataset.X.empty:
132
+ return 0.0
133
+ n_features = len(columns)
134
+ n_samples = dataset.X.shape[0]
135
+ if n_features <= 1 or n_samples <= 1:
136
+ return 0.0
137
+ return min(1.0, n_features / max(1, n_samples))
@@ -0,0 +1,8 @@
1
+ """Features selection Actionables"""
2
+ from .act_remove_high_correlated_column import ActRemoveHighCorrelatedColumn
3
+ from .act_remove_low_variance_column import ActRemoveLowVarianceColumn
4
+ from .act_select_k_best import ActSelectKBest
5
+ from .act_rfe import ActRFE
6
+ from .act_select_from_model import ActSelectFromModel
7
+ from .act_vif_selector import ActVIFSelector
8
+ from .act_permutation_importance_selector import ActPermutationImportanceSelector