FLAML 2.3.1__tar.gz → 2.3.2__tar.gz

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 (120) hide show
  1. {flaml-2.3.1 → flaml-2.3.2}/FLAML.egg-info/PKG-INFO +1 -1
  2. {flaml-2.3.1 → flaml-2.3.2}/PKG-INFO +1 -1
  3. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/data.py +1 -1
  4. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/model.py +50 -16
  5. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/spark/metrics.py +17 -1
  6. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/task/generic_task.py +0 -4
  7. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/time_series/ts_data.py +1 -1
  8. {flaml-2.3.1 → flaml-2.3.2}/flaml/fabric/mlflow.py +8 -1
  9. flaml-2.3.2/flaml/version.py +1 -0
  10. flaml-2.3.1/flaml/version.py +0 -1
  11. {flaml-2.3.1 → flaml-2.3.2}/FLAML.egg-info/SOURCES.txt +0 -0
  12. {flaml-2.3.1 → flaml-2.3.2}/FLAML.egg-info/dependency_links.txt +0 -0
  13. {flaml-2.3.1 → flaml-2.3.2}/FLAML.egg-info/requires.txt +0 -0
  14. {flaml-2.3.1 → flaml-2.3.2}/FLAML.egg-info/top_level.txt +0 -0
  15. {flaml-2.3.1 → flaml-2.3.2}/LICENSE +0 -0
  16. {flaml-2.3.1 → flaml-2.3.2}/NOTICE.md +0 -0
  17. {flaml-2.3.1 → flaml-2.3.2}/README.md +0 -0
  18. {flaml-2.3.1 → flaml-2.3.2}/flaml/__init__.py +0 -0
  19. {flaml-2.3.1 → flaml-2.3.2}/flaml/autogen/__init__.py +0 -0
  20. {flaml-2.3.1 → flaml-2.3.2}/flaml/autogen/agentchat/__init__.py +0 -0
  21. {flaml-2.3.1 → flaml-2.3.2}/flaml/autogen/agentchat/agent.py +0 -0
  22. {flaml-2.3.1 → flaml-2.3.2}/flaml/autogen/agentchat/assistant_agent.py +0 -0
  23. {flaml-2.3.1 → flaml-2.3.2}/flaml/autogen/agentchat/conversable_agent.py +0 -0
  24. {flaml-2.3.1 → flaml-2.3.2}/flaml/autogen/agentchat/groupchat.py +0 -0
  25. {flaml-2.3.1 → flaml-2.3.2}/flaml/autogen/agentchat/user_proxy_agent.py +0 -0
  26. {flaml-2.3.1 → flaml-2.3.2}/flaml/autogen/code_utils.py +0 -0
  27. {flaml-2.3.1 → flaml-2.3.2}/flaml/autogen/extensions/__init__.py +0 -0
  28. {flaml-2.3.1 → flaml-2.3.2}/flaml/autogen/math_utils.py +0 -0
  29. {flaml-2.3.1 → flaml-2.3.2}/flaml/autogen/oai/__init__.py +0 -0
  30. {flaml-2.3.1 → flaml-2.3.2}/flaml/autogen/oai/completion.py +0 -0
  31. {flaml-2.3.1 → flaml-2.3.2}/flaml/autogen/oai/openai_utils.py +0 -0
  32. {flaml-2.3.1 → flaml-2.3.2}/flaml/autogen/retrieve_utils.py +0 -0
  33. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/__init__.py +0 -0
  34. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/automl.py +0 -0
  35. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/contrib/__init__.py +0 -0
  36. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/contrib/histgb.py +0 -0
  37. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/logger.py +0 -0
  38. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/ml.py +0 -0
  39. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/nlp/__init__.py +0 -0
  40. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/nlp/huggingface/__init__.py +0 -0
  41. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/nlp/huggingface/data_collator.py +0 -0
  42. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/nlp/huggingface/trainer.py +0 -0
  43. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/nlp/huggingface/training_args.py +0 -0
  44. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/nlp/huggingface/utils.py +0 -0
  45. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/nlp/utils.py +0 -0
  46. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/spark/__init__.py +0 -0
  47. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/spark/utils.py +0 -0
  48. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/state.py +0 -0
  49. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/task/__init__.py +0 -0
  50. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/task/factory.py +0 -0
  51. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/task/task.py +0 -0
  52. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/task/time_series_task.py +0 -0
  53. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/time_series/__init__.py +0 -0
  54. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/time_series/feature.py +0 -0
  55. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/time_series/sklearn.py +0 -0
  56. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/time_series/tcn.py +0 -0
  57. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/time_series/tft.py +0 -0
  58. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/time_series/ts_model.py +0 -0
  59. {flaml-2.3.1 → flaml-2.3.2}/flaml/automl/training_log.py +0 -0
  60. {flaml-2.3.1 → flaml-2.3.2}/flaml/config.py +0 -0
  61. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/__init__.py +0 -0
  62. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/all/binary.json +0 -0
  63. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/all/multiclass.json +0 -0
  64. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/all/regression.json +0 -0
  65. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/estimator.py +0 -0
  66. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/extra_tree/binary.json +0 -0
  67. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/extra_tree/multiclass.json +0 -0
  68. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/extra_tree/regression.json +0 -0
  69. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/greedy.py +0 -0
  70. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/lgbm/binary.json +0 -0
  71. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/lgbm/multiclass.json +0 -0
  72. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/lgbm/regression.json +0 -0
  73. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/portfolio.py +0 -0
  74. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/regret.py +0 -0
  75. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/rf/binary.json +0 -0
  76. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/rf/multiclass.json +0 -0
  77. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/rf/regression.json +0 -0
  78. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/suggest.py +0 -0
  79. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/xgb_limitdepth/binary.json +0 -0
  80. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/xgb_limitdepth/multiclass.json +0 -0
  81. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/xgb_limitdepth/regression.json +0 -0
  82. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/xgboost/binary.json +0 -0
  83. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/xgboost/multiclass.json +0 -0
  84. {flaml-2.3.1 → flaml-2.3.2}/flaml/default/xgboost/regression.json +0 -0
  85. {flaml-2.3.1 → flaml-2.3.2}/flaml/fabric/__init__.py +0 -0
  86. {flaml-2.3.1 → flaml-2.3.2}/flaml/ml.py +0 -0
  87. {flaml-2.3.1 → flaml-2.3.2}/flaml/onlineml/__init__.py +0 -0
  88. {flaml-2.3.1 → flaml-2.3.2}/flaml/onlineml/autovw.py +0 -0
  89. {flaml-2.3.1 → flaml-2.3.2}/flaml/onlineml/trial.py +0 -0
  90. {flaml-2.3.1 → flaml-2.3.2}/flaml/onlineml/trial_runner.py +0 -0
  91. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/__init__.py +0 -0
  92. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/analysis.py +0 -0
  93. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/result.py +0 -0
  94. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/sample.py +0 -0
  95. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/scheduler/__init__.py +0 -0
  96. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/scheduler/online_scheduler.py +0 -0
  97. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/scheduler/trial_scheduler.py +0 -0
  98. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/searcher/__init__.py +0 -0
  99. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/searcher/blendsearch.py +0 -0
  100. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/searcher/cfo_cat.py +0 -0
  101. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/searcher/flow2.py +0 -0
  102. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/searcher/online_searcher.py +0 -0
  103. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/searcher/search_thread.py +0 -0
  104. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/searcher/suggestion.py +0 -0
  105. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/searcher/variant_generator.py +0 -0
  106. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/space.py +0 -0
  107. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/spark/__init__.py +0 -0
  108. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/spark/utils.py +0 -0
  109. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/trial.py +0 -0
  110. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/trial_runner.py +0 -0
  111. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/tune.py +0 -0
  112. {flaml-2.3.1 → flaml-2.3.2}/flaml/tune/utils.py +0 -0
  113. {flaml-2.3.1 → flaml-2.3.2}/pyproject.toml +0 -0
  114. {flaml-2.3.1 → flaml-2.3.2}/setup.cfg +0 -0
  115. {flaml-2.3.1 → flaml-2.3.2}/setup.py +0 -0
  116. {flaml-2.3.1 → flaml-2.3.2}/test/test_autovw.py +0 -0
  117. {flaml-2.3.1 → flaml-2.3.2}/test/test_conda_distribution.py +0 -0
  118. {flaml-2.3.1 → flaml-2.3.2}/test/test_gpu.py +0 -0
  119. {flaml-2.3.1 → flaml-2.3.2}/test/test_model.py +0 -0
  120. {flaml-2.3.1 → flaml-2.3.2}/test/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: FLAML
3
- Version: 2.3.1
3
+ Version: 2.3.2
4
4
  Summary: A fast library for automated machine learning and tuning
5
5
  Home-page: https://github.com/microsoft/FLAML
6
6
  Author: Microsoft Corporation
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: FLAML
3
- Version: 2.3.1
3
+ Version: 2.3.2
4
4
  Summary: A fast library for automated machine learning and tuning
5
5
  Home-page: https://github.com/microsoft/FLAML
6
6
  Author: Microsoft Corporation
@@ -293,7 +293,7 @@ class DataTransformer:
293
293
  y = y.rename(TS_VALUE_COL)
294
294
  for column in X.columns:
295
295
  # sklearn\utils\validation.py needs int/float values
296
- if X[column].dtype.name in ("object", "category"):
296
+ if X[column].dtype.name in ("object", "category", "string"):
297
297
  if X[column].nunique() == 1 or X[column].nunique(dropna=True) == n - X[column].isnull().sum():
298
298
  X.drop(columns=column, inplace=True)
299
299
  drop = True
@@ -157,7 +157,25 @@ class BaseEstimator:
157
157
 
158
158
  @property
159
159
  def estimator(self):
160
- """Trained model after fit() is called, or None before fit() is called."""
160
+ """
161
+ Get the best trained estimator model.
162
+
163
+ Returns:
164
+ object or None: The trained model obtained after calling the `fit()` method,
165
+ representing the best estimator found during the training process. If `fit()` has
166
+ not been called yet, it returns `None`.
167
+
168
+ Examples:
169
+ >>> from flaml import AutoML
170
+ >>> automl = AutoML()
171
+ >>> automl.fit(X_train, y_train)
172
+ >>> best_estimator = automl.model.estimator
173
+ >>> print(best_estimator)
174
+ RandomForestClassifier()
175
+
176
+ Note:
177
+ To access the best estimator, use `automl.model.estimator`.
178
+ """
161
179
  return self._model
162
180
 
163
181
  @property
@@ -249,9 +267,11 @@ class BaseEstimator:
249
267
  mem = psutil.virtual_memory() if psutil is not None else None
250
268
  try:
251
269
  with limit_resource(
252
- mem.available * (1 - free_mem_ratio) + psutil.Process(os.getpid()).memory_info().rss
253
- if mem is not None
254
- else -1,
270
+ (
271
+ mem.available * (1 - free_mem_ratio) + psutil.Process(os.getpid()).memory_info().rss
272
+ if mem is not None
273
+ else -1
274
+ ),
255
275
  budget,
256
276
  ):
257
277
  train_time = self._fit(X_train, y_train, **kwargs)
@@ -1534,12 +1554,16 @@ class LGBMEstimator(BaseEstimator):
1534
1554
  if n_iter > 1:
1535
1555
  max_iter = min(
1536
1556
  n_iter,
1537
- int((budget - time.time() + start_time - self._t1) / self._time_per_iter + 1)
1538
- if budget is not None
1539
- else n_iter,
1540
- int((1 - free_mem_ratio) * mem0 / self._mem_per_iter)
1541
- if psutil is not None and self._mem_per_iter > 0
1542
- else n_iter,
1557
+ (
1558
+ int((budget - time.time() + start_time - self._t1) / self._time_per_iter + 1)
1559
+ if budget is not None
1560
+ else n_iter
1561
+ ),
1562
+ (
1563
+ int((1 - free_mem_ratio) * mem0 / self._mem_per_iter)
1564
+ if psutil is not None and self._mem_per_iter > 0
1565
+ else n_iter
1566
+ ),
1543
1567
  )
1544
1568
  if trained and max_iter <= self.params[self.ITER_HP]:
1545
1569
  return time.time() - start_time
@@ -1561,18 +1585,17 @@ class LGBMEstimator(BaseEstimator):
1561
1585
  callbacks = None
1562
1586
  if callbacks is None:
1563
1587
  self._fit(X_train, y_train, **kwargs)
1564
- else:
1565
- self._fit(X_train, y_train, callbacks=callbacks, **kwargs)
1566
- if callbacks is None:
1567
1588
  # for xgboost>=1.6.0, pop callbacks to enable pickle
1568
1589
  callbacks = self.params.pop("callbacks")
1569
1590
  self._model.set_params(callbacks=callbacks[:-1])
1591
+ else:
1592
+ self._fit(X_train, y_train, callbacks=callbacks, **kwargs)
1570
1593
  best_iteration = (
1571
1594
  getattr(self._model.get_booster(), "best_iteration", None)
1572
1595
  if isinstance(self, XGBoostSklearnEstimator)
1573
1596
  else self._model.best_iteration_
1574
1597
  )
1575
- if best_iteration is not None:
1598
+ if best_iteration is not None and best_iteration > 0:
1576
1599
  self._model.set_params(n_estimators=best_iteration + 1)
1577
1600
  else:
1578
1601
  self._fit(X_train, y_train, **kwargs)
@@ -2090,7 +2113,8 @@ class CatBoostEstimator(BaseEstimator):
2090
2113
  if weight is not None:
2091
2114
  kwargs["sample_weight"] = weight
2092
2115
  self._model = model
2093
- self.params[self.ITER_HP] = self._model.tree_count_
2116
+ # Commented-out line below incorrectly assigned n_estimators - see https://github.com/microsoft/FLAML/pull/1364
2117
+ # self.params[self.ITER_HP] = self._model.tree_count_
2094
2118
  train_time = time.time() - start_time
2095
2119
  return train_time
2096
2120
 
@@ -2184,6 +2208,11 @@ class SVCEstimator(SKLearnEstimator):
2184
2208
 
2185
2209
  def __init__(self, task="binary", **config):
2186
2210
  super().__init__(task, **config)
2211
+ self.params.update(
2212
+ {
2213
+ "random_state": config.get("random_seed", 10242048),
2214
+ }
2215
+ )
2187
2216
  assert self._task.is_classification(), "LinearSVC for classification task only"
2188
2217
  self.estimator_class = LinearSVC
2189
2218
 
@@ -2428,6 +2457,11 @@ class ElasticNetEstimator(SKLearnEstimator):
2428
2457
 
2429
2458
  def __init__(self, task="regression", **config):
2430
2459
  super().__init__(task, **config)
2460
+ self.params.update(
2461
+ {
2462
+ "random_state": config.get("random_seed", 10242048),
2463
+ }
2464
+ )
2431
2465
  assert self._task.is_regression(), "ElasticNet for regression task only"
2432
2466
  self.estimator_class = ElasticNet
2433
2467
 
@@ -2752,7 +2786,7 @@ class BaseResourceLimit:
2752
2786
  def check_resource_limits(self, current_time, current_iteration, mllib):
2753
2787
  if (mllib == "xgb" and current_iteration == 0) or (mllib == "cat" and current_iteration == 1):
2754
2788
  self._time_per_iter = current_time - self.start_time
2755
- if current_time + self._time_per_iter > self.deadline:
2789
+ if mllib != "cat" and current_time + self._time_per_iter > self.deadline:
2756
2790
  return False
2757
2791
  if psutil is not None and self.free_mem_ratio is not None:
2758
2792
  mem = psutil.virtual_memory()
@@ -1,3 +1,4 @@
1
+ import json
1
2
  from typing import Union
2
3
 
3
4
  import numpy as np
@@ -9,7 +10,7 @@ from pyspark.ml.evaluation import (
9
10
  RegressionEvaluator,
10
11
  )
11
12
 
12
- from flaml.automl.spark import F, psSeries
13
+ from flaml.automl.spark import F, T, psDataFrame, psSeries, sparkDataFrame
13
14
 
14
15
 
15
16
  def ps_group_counts(groups: Union[psSeries, np.ndarray]) -> np.ndarray:
@@ -36,6 +37,16 @@ def _compute_label_from_probability(df, probability_col, prediction_col):
36
37
  return df
37
38
 
38
39
 
40
+ def string_to_array(s):
41
+ try:
42
+ return json.loads(s)
43
+ except json.JSONDecodeError:
44
+ return []
45
+
46
+
47
+ string_to_array_udf = F.udf(string_to_array, T.ArrayType(T.DoubleType()))
48
+
49
+
39
50
  def spark_metric_loss_score(
40
51
  metric_name: str,
41
52
  y_predict: psSeries,
@@ -135,6 +146,11 @@ def spark_metric_loss_score(
135
146
  )
136
147
  elif metric_name == "log_loss":
137
148
  # For log_loss, prediction_col should be probability, and we need to convert it to label
149
+ # handle data like "{'type': '1', 'values': '[1, 2, 3]'}"
150
+ # Fix cannot resolve "array_max(prediction)" due to data type mismatch: Parameter 1 requires the "ARRAY" type,
151
+ # however "prediction" has the type "STRUCT<type: TINYINT, size: INT, indices: ARRAY<INT>, values: ARRAY<DOUBLE>>"
152
+ df = df.withColumn(prediction_col, df[prediction_col].cast(T.StringType()))
153
+ df = df.withColumn(prediction_col, string_to_array_udf(df[prediction_col]))
138
154
  df = _compute_label_from_probability(df, prediction_col, prediction_col + "_label")
139
155
  evaluator = MulticlassClassificationEvaluator(
140
156
  metricName="logLoss",
@@ -87,7 +87,6 @@ class GenericTask(Task):
87
87
  "transformer": TransformersEstimator,
88
88
  "transformer_ms": TransformersEstimatorModelSelection,
89
89
  "histgb": HistGradientBoostingEstimator,
90
- # Above are open-source, below are internal
91
90
  "svc": SVCEstimator,
92
91
  "sgd": SGDEstimator,
93
92
  "nb_spark": SparkNaiveBayesEstimator,
@@ -706,7 +705,6 @@ class GenericTask(Task):
706
705
  fit_kwargs = {}
707
706
  if cv_score_agg_func is None:
708
707
  cv_score_agg_func = default_cv_score_agg_func
709
- start_time = time.time()
710
708
  val_loss_folds = []
711
709
  log_metric_folds = []
712
710
  metric = None
@@ -813,8 +811,6 @@ class GenericTask(Task):
813
811
  if is_spark_dataframe:
814
812
  X_train.spark.unpersist() # uncache data to free memory
815
813
  X_val.spark.unpersist() # uncache data to free memory
816
- if budget and time.time() - start_time >= budget:
817
- break
818
814
  val_loss, metric = cv_score_agg_func(val_loss_folds, log_metric_folds)
819
815
  n = total_fold_num
820
816
  pred_time /= n
@@ -393,7 +393,7 @@ class DataTransformerTS:
393
393
 
394
394
  for column in X.columns:
395
395
  # sklearn/utils/validation.py needs int/float values
396
- if X[column].dtype.name in ("object", "category"):
396
+ if X[column].dtype.name in ("object", "category", "string"):
397
397
  if (
398
398
  # drop columns where all values are the same
399
399
  X[column].nunique() == 1
@@ -127,6 +127,13 @@ def _get_notebook_name():
127
127
  return None
128
128
 
129
129
 
130
+ def safe_json_dumps(obj):
131
+ def default(o):
132
+ return str(o)
133
+
134
+ return json.dumps(obj, default=default)
135
+
136
+
130
137
  class MLflowIntegration:
131
138
  def __init__(self, experiment_type="automl", mlflow_exp_name=None, extra_tag=None):
132
139
  try:
@@ -438,7 +445,7 @@ class MLflowIntegration:
438
445
  "flaml.meric": automl_metric_name,
439
446
  "flaml.run_source": "flaml-automl",
440
447
  "flaml.log_type": self.log_type,
441
- "flaml.automl_user_configurations": json.dumps(automl._automl_user_configurations),
448
+ "flaml.automl_user_configurations": safe_json_dumps(automl._automl_user_configurations),
442
449
  },
443
450
  "params": {
444
451
  "sample_size": search_state.sample_size,
@@ -0,0 +1 @@
1
+ __version__ = "2.3.2"
@@ -1 +0,0 @@
1
- __version__ = "2.3.1"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes