diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index ef1fcdd56..e1bb38d6a 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -37,8 +37,7 @@ jobs: - name: Install packages and dependencies run: | python -m pip install --upgrade pip - pip install flake8 pytest coverage - pip install -e . + pip install -e .[test] - name: Lint with flake8 run: | # stop the build if there are Python syntax errors or undefined names diff --git a/flaml/__init__.py b/flaml/__init__.py index 309cac7c2..b9c94a146 100644 --- a/flaml/__init__.py +++ b/flaml/__init__.py @@ -1,12 +1,10 @@ from flaml.automl import AutoML -import logging - -from flaml.model import BaseEstimator -from flaml.data import get_output_from_log from flaml.version import __version__ +import logging # Set the root logger. logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) # Add the console handler. _ch = logging.StreamHandler() @@ -14,4 +12,4 @@ logger_formatter = logging.Formatter( '[%(name)s: %(asctime)s] {%(lineno)d} %(levelname)s - %(message)s', '%m-%d %H:%M:%S') _ch.setFormatter(logger_formatter) -logger.addHandler(_ch) +logger.addHandler(_ch) \ No newline at end of file diff --git a/flaml/automl.py b/flaml/automl.py index b271608f8..82cdf6897 100644 --- a/flaml/automl.py +++ b/flaml/automl.py @@ -390,22 +390,22 @@ class AutoML: def add_learner(self, learner_name, - learner_class, - size_estimate=lambda config: 'unknown', - cost_relative2lgbm=1): + learner_class): '''Add a customized learner Args: learner_name: A string of the learner's name learner_class: A subclass of BaseEstimator - size_estimate: A function from a config to its memory size in float - cost_relative2lgbm: A float number for the training cost ratio with - respect to lightgbm(when both use the initial config) ''' self._custom_learners[learner_name] = learner_class + cost_relative2lgbm = 1 + # cost_relative2lgbm: A float number for the training cost ratio with + # respect to lightgbm(when both use the initial config) self._eti_ini[learner_name] = cost_relative2lgbm self._config_space_info[learner_name] = \ learner_class.params_configsearch_info + # size_estimate: A function from a config to its memory size in float + size_estimate = lambda config: 1.0 self._custom_size_estimate[learner_name] = size_estimate def get_estimator_from_log(self, log_file_name, record_id, objective): diff --git a/flaml/data.py b/flaml/data.py index ca24d05d9..44bc0f69d 100644 --- a/flaml/data.py +++ b/flaml/data.py @@ -6,7 +6,6 @@ import numpy as np from scipy.sparse import vstack, issparse import pandas as pd -from sklearn.preprocessing import LabelEncoder from .training_log import training_log_reader diff --git a/flaml/version.py b/flaml/version.py index b3f475621..ae7362549 100644 --- a/flaml/version.py +++ b/flaml/version.py @@ -1 +1 @@ -__version__ = "0.1.2" +__version__ = "0.1.3" diff --git a/notebook/flaml_demo.ipynb b/notebook/flaml_demo.ipynb index 22e6f32fd..cde79fa37 100644 --- a/notebook/flaml_demo.ipynb +++ b/notebook/flaml_demo.ipynb @@ -49,7 +49,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "metadata": { "slideshow": { "slide_type": "subslide" @@ -69,8 +69,8 @@ } ], "source": [ - "from flaml.data import load_openml_dataset\n", - "X_train, X_test, y_train, y_test = load_openml_dataset(dataset_id = 1169, data_dir = './')" + "from flaml.data import load_openml_dataset\n", + "X_train, X_test, y_train, y_test = load_openml_dataset(dataset_id = 1169, data_dir = './')" ] }, { @@ -87,7 +87,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "metadata": { "slideshow": { "slide_type": "slide" @@ -102,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "metadata": { "slideshow": { "slide_type": "slide" @@ -122,7 +122,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 4, "metadata": { "slideshow": { "slide_type": "slide" @@ -134,36 +134,46 @@ "output_type": "stream", "name": "stderr", "text": [ - "[flaml.automl: 11-22 10:30:17] {649} INFO - List of ML learners in AutoML Run: ['lgbm', 'rf', 'xgboost']\n", - "[flaml.automl: 11-22 10:30:17] {654} INFO - Evaluation method: holdout\n", - "[flaml.automl: 11-22 10:30:17] {672} INFO - Minimizing error metric: 1-accuracy\n", - "[flaml.automl: 11-22 10:30:20] {326} INFO - Using StratifiedKFold\n", - "[flaml.automl: 11-22 10:30:20] {717} INFO - iteration 0 current learner lgbm\n", - "[flaml.automl: 11-22 10:30:22] {782} INFO - at 4.8s,\tbest lgbm's error=0.3748,\tbest lgbm's error=0.3748\n", - "[flaml.automl: 11-22 10:30:22] {717} INFO - iteration 1 current learner lgbm\n", - "[flaml.automl: 11-22 10:30:25] {782} INFO - at 8.3s,\tbest lgbm's error=0.3638,\tbest lgbm's error=0.3638\n", - "[flaml.automl: 11-22 10:30:25] {717} INFO - iteration 2 current learner xgboost\n", - "[flaml.automl: 11-22 10:30:29] {782} INFO - at 11.8s,\tbest xgboost's error=0.3742,\tbest lgbm's error=0.3638\n", - "[flaml.automl: 11-22 10:30:29] {717} INFO - iteration 3 current learner xgboost\n", - "[flaml.automl: 11-22 10:30:39] {782} INFO - at 21.6s,\tbest xgboost's error=0.3742,\tbest lgbm's error=0.3638\n", - "[flaml.automl: 11-22 10:30:39] {717} INFO - iteration 4 current learner lgbm\n", - "[flaml.automl: 11-22 10:30:45] {782} INFO - at 28.4s,\tbest lgbm's error=0.3609,\tbest lgbm's error=0.3609\n", - "[flaml.automl: 11-22 10:30:45] {717} INFO - iteration 5 current learner rf\n", - "[flaml.automl: 11-22 10:31:05] {782} INFO - at 47.8s,\tbest rf's error=0.3882,\tbest lgbm's error=0.3609\n", - "[flaml.automl: 11-22 10:31:05] {717} INFO - iteration 6 current learner lgbm\n", - "[flaml.automl: 11-22 10:31:10] {782} INFO - at 52.8s,\tbest lgbm's error=0.3579,\tbest lgbm's error=0.3579\n", - "[flaml.automl: 11-22 10:31:10] {717} INFO - iteration 7 current learner lgbm\n", - "[flaml.automl: 11-22 10:31:13] {782} INFO - at 56.3s,\tbest lgbm's error=0.3474,\tbest lgbm's error=0.3474\n", - "[flaml.automl: 11-22 10:31:13] {717} INFO - iteration 8 current learner lgbm\n", - "[flaml.automl: 11-22 10:31:16] {782} INFO - at 59.3s,\tbest lgbm's error=0.3474,\tbest lgbm's error=0.3474\n", - "[flaml.automl: 11-22 10:31:16] {717} INFO - iteration 9 current learner xgboost\n", - "[flaml.automl: 11-22 10:31:16] {782} INFO - at 59.3s,\tbest xgboost's error=0.3742,\tbest lgbm's error=0.3474\n", - "[flaml.automl: 11-22 10:31:16] {803} INFO - LGBMClassifier(colsample_bytree=0.7, learning_rate=0.7508368515284745,\n", - " max_bin=1023, min_child_weight=2.57801629551926, n_estimators=15,\n", - " num_leaves=17, objective='binary',\n", - " reg_alpha=1.832070610572943e-10, reg_lambda=0.3606535801605071,\n", - " subsample=0.699879308565092)\n", - "[flaml.automl: 11-22 10:31:16] {691} INFO - fit succeeded\n" + "[flaml.automl: 12-15 07:41:38] {660} INFO - List of ML learners in AutoML Run: ['lgbm', 'rf', 'xgboost']\n", + "[flaml.automl: 12-15 07:41:38] {665} INFO - Evaluation method: holdout\n", + "[flaml.automl: 12-15 07:41:38] {683} INFO - Minimizing error metric: 1-accuracy\n", + "[flaml.automl: 12-15 07:41:39] {327} INFO - Using StratifiedKFold\n", + "[flaml.automl: 12-15 07:41:39] {728} INFO - iteration 0 current learner lgbm\n", + "[flaml.automl: 12-15 07:41:41] {793} INFO - at 3.6s,\tbest lgbm's error=0.3748,\tbest lgbm's error=0.3748\n", + "[flaml.automl: 12-15 07:41:41] {728} INFO - iteration 1 current learner lgbm\n", + "[flaml.automl: 12-15 07:41:45] {793} INFO - at 7.5s,\tbest lgbm's error=0.3735,\tbest lgbm's error=0.3735\n", + "[flaml.automl: 12-15 07:41:45] {728} INFO - iteration 2 current learner lgbm\n", + "[flaml.automl: 12-15 07:41:47] {793} INFO - at 9.2s,\tbest lgbm's error=0.3668,\tbest lgbm's error=0.3668\n", + "[flaml.automl: 12-15 07:41:47] {728} INFO - iteration 3 current learner lgbm\n", + "[flaml.automl: 12-15 07:41:49] {793} INFO - at 11.4s,\tbest lgbm's error=0.3613,\tbest lgbm's error=0.3613\n", + "[flaml.automl: 12-15 07:41:49] {728} INFO - iteration 4 current learner lgbm\n", + "[flaml.automl: 12-15 07:41:53] {793} INFO - at 15.0s,\tbest lgbm's error=0.3613,\tbest lgbm's error=0.3613\n", + "[flaml.automl: 12-15 07:41:53] {728} INFO - iteration 5 current learner xgboost\n", + "[flaml.automl: 12-15 07:41:56] {793} INFO - at 18.1s,\tbest xgboost's error=0.3740,\tbest lgbm's error=0.3613\n", + "[flaml.automl: 12-15 07:41:56] {728} INFO - iteration 6 current learner lgbm\n", + "[flaml.automl: 12-15 07:42:00] {793} INFO - at 22.7s,\tbest lgbm's error=0.3613,\tbest lgbm's error=0.3613\n", + "[flaml.automl: 12-15 07:42:00] {728} INFO - iteration 7 current learner xgboost\n", + "[flaml.automl: 12-15 07:42:02] {793} INFO - at 24.8s,\tbest xgboost's error=0.3659,\tbest lgbm's error=0.3613\n", + "[flaml.automl: 12-15 07:42:02] {728} INFO - iteration 8 current learner lgbm\n", + "[flaml.automl: 12-15 07:42:11] {793} INFO - at 33.0s,\tbest lgbm's error=0.3544,\tbest lgbm's error=0.3544\n", + "[flaml.automl: 12-15 07:42:11] {728} INFO - iteration 9 current learner rf\n", + "[flaml.automl: 12-15 07:42:20] {793} INFO - at 41.9s,\tbest rf's error=0.3895,\tbest lgbm's error=0.3544\n", + "[flaml.automl: 12-15 07:42:20] {728} INFO - iteration 10 current learner xgboost\n", + "[flaml.automl: 12-15 07:42:24] {793} INFO - at 45.8s,\tbest xgboost's error=0.3659,\tbest lgbm's error=0.3544\n", + "[flaml.automl: 12-15 07:42:24] {728} INFO - iteration 11 current learner lgbm\n", + "[flaml.automl: 12-15 07:42:29] {793} INFO - at 51.5s,\tbest lgbm's error=0.3410,\tbest lgbm's error=0.3410\n", + "[flaml.automl: 12-15 07:42:29] {728} INFO - iteration 12 current learner rf\n", + "[flaml.automl: 12-15 07:42:29] {793} INFO - at 51.5s,\tbest rf's error=0.3895,\tbest lgbm's error=0.3410\n", + "[flaml.automl: 12-15 07:42:29] {728} INFO - iteration 13 current learner lgbm\n", + "[flaml.automl: 12-15 07:42:35] {793} INFO - at 57.1s,\tbest lgbm's error=0.3383,\tbest lgbm's error=0.3383\n", + "[flaml.automl: 12-15 07:42:35] {728} INFO - iteration 14 current learner xgboost\n", + "[flaml.automl: 12-15 07:42:38] {793} INFO - at 60.4s,\tbest xgboost's error=0.3659,\tbest lgbm's error=0.3383\n", + "[flaml.automl: 12-15 07:42:38] {814} INFO - LGBMClassifier(learning_rate=0.5482637744255212, max_bin=1023,\n", + " min_child_weight=1.1930700595990091, n_estimators=76,\n", + " num_leaves=67, objective='binary',\n", + " reg_alpha=3.668052110134859e-10, reg_lambda=0.49371485228257217,\n", + " subsample=0.6)\n", + "[flaml.automl: 12-15 07:42:38] {702} INFO - fit succeeded\n" ] } ], @@ -185,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 5, "metadata": { "slideshow": { "slide_type": "slide" @@ -197,7 +207,7 @@ "output_type": "stream", "name": "stdout", "text": [ - "Best ML leaner: lgbm\nBest hyperparmeter config: {'n_estimators': 15.192392947194397, 'max_leaves': 17.203047569920084, 'min_child_weight': 2.57801629551926, 'learning_rate': 0.7508368515284745, 'subsample': 0.699879308565092, 'log_max_bin': 10.0, 'reg_alpha': 1.832070610572943e-10, 'reg_lambda': 0.3606535801605071, 'colsample_bytree': 0.7}\nBest accuracy on validation data: 0.6526\nTraining duration of best run: 3.485 s\n" + "Best ML leaner: lgbm\nBest hyperparmeter config: {'n_estimators': 76.23660313632638, 'max_leaves': 66.93360726547702, 'min_child_weight': 1.1930700595990091, 'learning_rate': 0.5482637744255212, 'subsample': 0.6, 'log_max_bin': 10.0, 'reg_alpha': 3.668052110134859e-10, 'reg_lambda': 0.49371485228257217, 'colsample_bytree': 1.0}\nBest accuracy on validation data: 0.6617\nTraining duration of best run: 5.522 s\n" ] } ], @@ -211,7 +221,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 6, "metadata": { "slideshow": { "slide_type": "slide" @@ -222,15 +232,15 @@ "output_type": "execute_result", "data": { "text/plain": [ - "LGBMClassifier(colsample_bytree=0.7, learning_rate=0.7508368515284745,\n", - " max_bin=1023, min_child_weight=2.57801629551926, n_estimators=15,\n", - " num_leaves=17, objective='binary',\n", - " reg_alpha=1.832070610572943e-10, reg_lambda=0.3606535801605071,\n", - " subsample=0.699879308565092)" + "LGBMClassifier(learning_rate=0.5482637744255212, max_bin=1023,\n", + " min_child_weight=1.1930700595990091, n_estimators=76,\n", + " num_leaves=67, objective='binary',\n", + " reg_alpha=3.668052110134859e-10, reg_lambda=0.49371485228257217,\n", + " subsample=0.6)" ] }, "metadata": {}, - "execution_count": 11 + "execution_count": 6 } ], "source": [ @@ -239,7 +249,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 7, "metadata": { "slideshow": { "slide_type": "slide" @@ -255,7 +265,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 8, "metadata": { "slideshow": { "slide_type": "slide" @@ -281,7 +291,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 9, "metadata": { "slideshow": { "slide_type": "slide" @@ -293,10 +303,10 @@ "output_type": "stream", "name": "stdout", "text": [ - "accuracy = 0.6529077614463907\n", - "roc_auc = 0.6991857682861167\n", - "log_loss = 0.6207438299015984\n", - "f1 = 0.5468504928063822\n" + "accuracy = 0.6666493629770256\n", + "roc_auc = 0.7173397375696496\n", + "log_loss = 0.6095801351363471\n", + "f1 = 0.580528363863719\n" ] } ], @@ -322,7 +332,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 10, "metadata": { "slideshow": { "slide_type": "subslide" @@ -334,12 +344,12 @@ "output_type": "stream", "name": "stdout", "text": [ - "{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 4, 'max_leaves': 4, 'min_child_weight': 20, 'learning_rate': 0.1, 'subsample': 1.0, 'log_max_bin': 8, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 4, 'max_leaves': 4, 'min_child_weight': 20, 'learning_rate': 0.1, 'subsample': 1.0, 'log_max_bin': 8, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 1.0}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 14.910702833861574, 'max_leaves': 11.190080057422913, 'min_child_weight': 20.0, 'learning_rate': 0.08941779365546668, 'subsample': 1.0, 'log_max_bin': 8.148457575491062, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 0.7}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 14.910702833861574, 'max_leaves': 11.190080057422913, 'min_child_weight': 20.0, 'learning_rate': 0.08941779365546668, 'subsample': 1.0, 'log_max_bin': 8.148457575491062, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 0.7}}\n{'Current Learner': 'xgboost', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 4, 'max_leaves': 4, 'min_child_weight': 20.0, 'learning_rate': 0.1, 'subsample': 1.0, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bylevel': 1.0, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 14.910702833861574, 'max_leaves': 11.190080057422913, 'min_child_weight': 20.0, 'learning_rate': 0.08941779365546668, 'subsample': 1.0, 'log_max_bin': 8.148457575491062, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 0.7}}\n{'Current Learner': 'xgboost', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 19.407062304628294, 'max_leaves': 4.089279288647953, 'min_child_weight': 20.0, 'learning_rate': 0.0666254583409074, 'subsample': 0.8953637096714, 'reg_alpha': 1e-10, 'reg_lambda': 0.5362533759049211, 'colsample_bylevel': 0.7360077369961437, 'colsample_bytree': 0.8727182620355596}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 14.910702833861574, 'max_leaves': 11.190080057422913, 'min_child_weight': 20.0, 'learning_rate': 0.08941779365546668, 'subsample': 1.0, 'log_max_bin': 8.148457575491062, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 0.7}}\n{'Current Learner': 'xgboost', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 4.0, 'max_leaves': 4.0, 'min_child_weight': 8.75767132182036, 'learning_rate': 0.15009277608016236, 'subsample': 1.0, 'reg_alpha': 1.984021711625501e-10, 'reg_lambda': 1.0, 'colsample_bylevel': 1.0, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 14.910702833861574, 'max_leaves': 11.190080057422913, 'min_child_weight': 20.0, 'learning_rate': 0.08941779365546668, 'subsample': 1.0, 'log_max_bin': 8.148457575491062, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 0.7}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 23.12482594118475, 'max_leaves': 13.137233040107322, 'min_child_weight': 16.737337377896562, 'learning_rate': 0.04193971066903862, 'subsample': 1.0, 'log_max_bin': 10.0, 'reg_alpha': 5.090318687618562e-10, 'reg_lambda': 0.6027318887059488, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 14.910702833861574, 'max_leaves': 11.190080057422913, 'min_child_weight': 20.0, 'learning_rate': 0.08941779365546668, 'subsample': 1.0, 'log_max_bin': 8.148457575491062, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 0.7}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 9.614301943945227, 'max_leaves': 9.53152702013049, 'min_child_weight': 20.0, 'learning_rate': 0.19064370484830762, 'subsample': 0.6629253372107331, 'log_max_bin': 4.903424989804441, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 0.7}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 9.614301943945227, 'max_leaves': 9.53152702013049, 'min_child_weight': 20.0, 'learning_rate': 0.19064370484830762, 'subsample': 0.6629253372107331, 'log_max_bin': 4.903424989804441, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 0.7}}\n{'Current Learner': 'rf', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 4, 'criterion': 1, 'max_features': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 9.614301943945227, 'max_leaves': 9.53152702013049, 'min_child_weight': 20.0, 'learning_rate': 0.19064370484830762, 'subsample': 0.6629253372107331, 'log_max_bin': 4.903424989804441, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 0.7}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 12.936352853193041, 'max_leaves': 5.9593857069945635, 'min_child_weight': 20.0, 'learning_rate': 0.0681181870320628, 'subsample': 0.6088343986090358, 'log_max_bin': 5.171176894908052, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 9.614301943945227, 'max_leaves': 9.53152702013049, 'min_child_weight': 20.0, 'learning_rate': 0.19064370484830762, 'subsample': 0.6629253372107331, 'log_max_bin': 4.903424989804441, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 0.7}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 7.145352551707305, 'max_leaves': 15.244861098493168, 'min_child_weight': 6.579398853250162, 'learning_rate': 0.533558272494558, 'subsample': 0.7218219005364884, 'log_max_bin': 4.6495366759381, 'reg_alpha': 1.0256261116727895e-10, 'reg_lambda': 0.4566694152359654, 'colsample_bytree': 0.7}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 7.145352551707305, 'max_leaves': 15.244861098493168, 'min_child_weight': 6.579398853250162, 'learning_rate': 0.533558272494558, 'subsample': 0.7218219005364884, 'log_max_bin': 4.6495366759381, 'reg_alpha': 1.0256261116727895e-10, 'reg_lambda': 0.4566694152359654, 'colsample_bytree': 0.7}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 15.192392947194397, 'max_leaves': 17.203047569920084, 'min_child_weight': 2.57801629551926, 'learning_rate': 0.7508368515284745, 'subsample': 0.699879308565092, 'log_max_bin': 10.0, 'reg_alpha': 1.832070610572943e-10, 'reg_lambda': 0.3606535801605071, 'colsample_bytree': 0.7}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 15.192392947194397, 'max_leaves': 17.203047569920084, 'min_child_weight': 2.57801629551926, 'learning_rate': 0.7508368515284745, 'subsample': 0.699879308565092, 'log_max_bin': 10.0, 'reg_alpha': 1.832070610572943e-10, 'reg_lambda': 0.3606535801605071, 'colsample_bytree': 0.7}}\n{'Current Learner': 'lgbm', 'Current Sample': 404536, 'Current Hyper-parameters': {'n_estimators': 15.192392947194397, 'max_leaves': 17.203047569920084, 'min_child_weight': 2.57801629551926, 'learning_rate': 0.7508368515284745, 'subsample': 0.699879308565092, 'log_max_bin': 10.0, 'reg_alpha': 1.832070610572943e-10, 'reg_lambda': 0.3606535801605071, 'colsample_bytree': 0.7}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 15.192392947194397, 'max_leaves': 17.203047569920084, 'min_child_weight': 2.57801629551926, 'learning_rate': 0.7508368515284745, 'subsample': 0.699879308565092, 'log_max_bin': 10.0, 'reg_alpha': 1.832070610572943e-10, 'reg_lambda': 0.3606535801605071, 'colsample_bytree': 0.7}}\n" + "{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 4, 'max_leaves': 4, 'min_child_weight': 20, 'learning_rate': 0.1, 'subsample': 1.0, 'log_max_bin': 8, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 4, 'max_leaves': 4, 'min_child_weight': 20, 'learning_rate': 0.1, 'subsample': 1.0, 'log_max_bin': 8, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 1.0}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 4.345841756255061, 'max_leaves': 10.353390566270846, 'min_child_weight': 20.0, 'learning_rate': 0.04742496726415123, 'subsample': 0.9045133325444861, 'log_max_bin': 10.0, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 0.9407474408255333}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 4, 'max_leaves': 4, 'min_child_weight': 20, 'learning_rate': 0.1, 'subsample': 1.0, 'log_max_bin': 8, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bytree': 1.0}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 4.0, 'max_leaves': 4.0, 'min_child_weight': 9.874086709908818, 'learning_rate': 0.21085939699865755, 'subsample': 1.0, 'log_max_bin': 3.0, 'reg_alpha': 2.6875093824678297e-10, 'reg_lambda': 0.7230542131309051, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 4.0, 'max_leaves': 4.0, 'min_child_weight': 9.874086709908818, 'learning_rate': 0.21085939699865755, 'subsample': 1.0, 'log_max_bin': 3.0, 'reg_alpha': 2.6875093824678297e-10, 'reg_lambda': 0.7230542131309051, 'colsample_bytree': 1.0}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 6.30703808576676, 'max_leaves': 4.615126183980338, 'min_child_weight': 5.419442970309873, 'learning_rate': 0.45611181052279925, 'subsample': 1.0, 'log_max_bin': 3.0, 'reg_alpha': 1e-10, 'reg_lambda': 0.5948168429421155, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 6.30703808576676, 'max_leaves': 4.615126183980338, 'min_child_weight': 5.419442970309873, 'learning_rate': 0.45611181052279925, 'subsample': 1.0, 'log_max_bin': 3.0, 'reg_alpha': 1e-10, 'reg_lambda': 0.5948168429421155, 'colsample_bytree': 1.0}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 13.346655408225933, 'max_leaves': 7.128882408907543, 'min_child_weight': 3.5378687932000563, 'learning_rate': 0.27022645132691947, 'subsample': 1.0, 'log_max_bin': 3.9062497595361734, 'reg_alpha': 4.798429666191569e-10, 'reg_lambda': 0.31076883570242425, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 13.346655408225933, 'max_leaves': 7.128882408907543, 'min_child_weight': 3.5378687932000563, 'learning_rate': 0.27022645132691947, 'subsample': 1.0, 'log_max_bin': 3.9062497595361734, 'reg_alpha': 4.798429666191569e-10, 'reg_lambda': 0.31076883570242425, 'colsample_bytree': 1.0}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 9.168255249166949, 'max_leaves': 16.406314436487644, 'min_child_weight': 1.2440119163470513, 'learning_rate': 0.34085789038743874, 'subsample': 0.8622669492242545, 'log_max_bin': 3.9088586623653176, 'reg_alpha': 6.716698258358434e-10, 'reg_lambda': 0.08971222222676836, 'colsample_bytree': 0.7}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 13.346655408225933, 'max_leaves': 7.128882408907543, 'min_child_weight': 3.5378687932000563, 'learning_rate': 0.27022645132691947, 'subsample': 1.0, 'log_max_bin': 3.9062497595361734, 'reg_alpha': 4.798429666191569e-10, 'reg_lambda': 0.31076883570242425, 'colsample_bytree': 1.0}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 19.429346778070144, 'max_leaves': 4.0, 'min_child_weight': 10.061411336518901, 'learning_rate': 0.21423102429501803, 'subsample': 1.0, 'log_max_bin': 3.903642597975916, 'reg_alpha': 3.428012749081665e-10, 'reg_lambda': 1.0, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 13.346655408225933, 'max_leaves': 7.128882408907543, 'min_child_weight': 3.5378687932000563, 'learning_rate': 0.27022645132691947, 'subsample': 1.0, 'log_max_bin': 3.9062497595361734, 'reg_alpha': 4.798429666191569e-10, 'reg_lambda': 0.31076883570242425, 'colsample_bytree': 1.0}}\n{'Current Learner': 'xgboost', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 4, 'max_leaves': 4, 'min_child_weight': 20.0, 'learning_rate': 0.1, 'subsample': 1.0, 'reg_alpha': 1e-10, 'reg_lambda': 1.0, 'colsample_bylevel': 1.0, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 13.346655408225933, 'max_leaves': 7.128882408907543, 'min_child_weight': 3.5378687932000563, 'learning_rate': 0.27022645132691947, 'subsample': 1.0, 'log_max_bin': 3.9062497595361734, 'reg_alpha': 4.798429666191569e-10, 'reg_lambda': 0.31076883570242425, 'colsample_bytree': 1.0}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 5.008309383948613, 'max_leaves': 9.693976070518184, 'min_child_weight': 2.0342098563400848, 'learning_rate': 0.8024873058142261, 'subsample': 0.6512672999141046, 'log_max_bin': 4.485581916675402, 'reg_alpha': 4.235615166719706e-10, 'reg_lambda': 0.1209714816813433, 'colsample_bytree': 0.7}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 13.346655408225933, 'max_leaves': 7.128882408907543, 'min_child_weight': 3.5378687932000563, 'learning_rate': 0.27022645132691947, 'subsample': 1.0, 'log_max_bin': 3.9062497595361734, 'reg_alpha': 4.798429666191569e-10, 'reg_lambda': 0.31076883570242425, 'colsample_bytree': 1.0}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 35.567533259194164, 'max_leaves': 5.242530415831202, 'min_child_weight': 6.15301098797069, 'learning_rate': 0.09099500324512855, 'subsample': 1.0, 'log_max_bin': 3.4017408370474773, 'reg_alpha': 5.436029090248796e-10, 'reg_lambda': 0.7983474113199597, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 13.346655408225933, 'max_leaves': 7.128882408907543, 'min_child_weight': 3.5378687932000563, 'learning_rate': 0.27022645132691947, 'subsample': 1.0, 'log_max_bin': 3.9062497595361734, 'reg_alpha': 4.798429666191569e-10, 'reg_lambda': 0.31076883570242425, 'colsample_bytree': 1.0}}\n{'Current Learner': 'xgboost', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 4.0, 'max_leaves': 7.946393543064438, 'min_child_weight': 20.0, 'learning_rate': 0.06505010684115302, 'subsample': 0.6, 'reg_alpha': 2.879414788721035e-10, 'reg_lambda': 0.9747843231355767, 'colsample_bylevel': 1.0, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 13.346655408225933, 'max_leaves': 7.128882408907543, 'min_child_weight': 3.5378687932000563, 'learning_rate': 0.27022645132691947, 'subsample': 1.0, 'log_max_bin': 3.9062497595361734, 'reg_alpha': 4.798429666191569e-10, 'reg_lambda': 0.31076883570242425, 'colsample_bytree': 1.0}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 26.66408504703253, 'max_leaves': 31.775028586333367, 'min_child_weight': 2.101032324057992, 'learning_rate': 0.3750121217006764, 'subsample': 0.8711935510039006, 'log_max_bin': 3.1949625175875354, 'reg_alpha': 5.201043116468452e-10, 'reg_lambda': 0.6849921466924215, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 26.66408504703253, 'max_leaves': 31.775028586333367, 'min_child_weight': 2.101032324057992, 'learning_rate': 0.3750121217006764, 'subsample': 0.8711935510039006, 'log_max_bin': 3.1949625175875354, 'reg_alpha': 5.201043116468452e-10, 'reg_lambda': 0.6849921466924215, 'colsample_bytree': 1.0}}\n{'Current Learner': 'rf', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 4, 'criterion': 1, 'max_features': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 26.66408504703253, 'max_leaves': 31.775028586333367, 'min_child_weight': 2.101032324057992, 'learning_rate': 0.3750121217006764, 'subsample': 0.8711935510039006, 'log_max_bin': 3.1949625175875354, 'reg_alpha': 5.201043116468452e-10, 'reg_lambda': 0.6849921466924215, 'colsample_bytree': 1.0}}\n{'Current Learner': 'xgboost', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 5.908417243275515, 'max_leaves': 5.7730103299390825, 'min_child_weight': 20.0, 'learning_rate': 0.18663315779626963, 'subsample': 1.0, 'reg_alpha': 1.2498021235418823e-10, 'reg_lambda': 1.0, 'colsample_bylevel': 0.6, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 26.66408504703253, 'max_leaves': 31.775028586333367, 'min_child_weight': 2.101032324057992, 'learning_rate': 0.3750121217006764, 'subsample': 0.8711935510039006, 'log_max_bin': 3.1949625175875354, 'reg_alpha': 5.201043116468452e-10, 'reg_lambda': 0.6849921466924215, 'colsample_bytree': 1.0}}\n{'Current Learner': 'xgboost', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 4.0, 'max_leaves': 10.937997116302148, 'min_child_weight': 9.37137175953572, 'learning_rate': 0.022672907912025912, 'subsample': 0.6, 'reg_alpha': 6.633873770360544e-10, 'reg_lambda': 0.7590775750138271, 'colsample_bylevel': 1.0, 'colsample_bytree': 0.7}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 26.66408504703253, 'max_leaves': 31.775028586333367, 'min_child_weight': 2.101032324057992, 'learning_rate': 0.3750121217006764, 'subsample': 0.8711935510039006, 'log_max_bin': 3.1949625175875354, 'reg_alpha': 5.201043116468452e-10, 'reg_lambda': 0.6849921466924215, 'colsample_bytree': 1.0}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 23.158867908507276, 'max_leaves': 22.03591314927381, 'min_child_weight': 3.8955300015298784, 'learning_rate': 0.24051679800463044, 'subsample': 0.6, 'log_max_bin': 3.0, 'reg_alpha': 3.0792188923459856e-10, 'reg_lambda': 0.9016340605593407, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 26.66408504703253, 'max_leaves': 31.775028586333367, 'min_child_weight': 2.101032324057992, 'learning_rate': 0.3750121217006764, 'subsample': 0.8711935510039006, 'log_max_bin': 3.1949625175875354, 'reg_alpha': 5.201043116468452e-10, 'reg_lambda': 0.6849921466924215, 'colsample_bytree': 1.0}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 30.699835337556014, 'max_leaves': 45.81849795934486, 'min_child_weight': 1.1331800358366897, 'learning_rate': 0.5847162966959815, 'subsample': 1.0, 'log_max_bin': 7.2980887397386915, 'reg_alpha': 8.784971268721483e-10, 'reg_lambda': 0.5204042987675161, 'colsample_bytree': 0.7}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 30.699835337556014, 'max_leaves': 45.81849795934486, 'min_child_weight': 1.1331800358366897, 'learning_rate': 0.5847162966959815, 'subsample': 1.0, 'log_max_bin': 7.2980887397386915, 'reg_alpha': 8.784971268721483e-10, 'reg_lambda': 0.5204042987675161, 'colsample_bytree': 0.7}}\n{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 76.23660313632638, 'max_leaves': 66.93360726547702, 'min_child_weight': 1.1930700595990091, 'learning_rate': 0.5482637744255212, 'subsample': 0.6, 'log_max_bin': 10.0, 'reg_alpha': 3.668052110134859e-10, 'reg_lambda': 0.49371485228257217, 'colsample_bytree': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 76.23660313632638, 'max_leaves': 66.93360726547702, 'min_child_weight': 1.1930700595990091, 'learning_rate': 0.5482637744255212, 'subsample': 0.6, 'log_max_bin': 10.0, 'reg_alpha': 3.668052110134859e-10, 'reg_lambda': 0.49371485228257217, 'colsample_bytree': 1.0}}\n" ] } ], "source": [ - "from flaml import get_output_from_log\n", + "from flaml.data import get_output_from_log\n", "time_history, best_valid_loss_history, valid_loss_history, config_history, train_loss_history = \\\n", " get_output_from_log(filename = settings['log_file_name'], time_budget = 60)\n", "\n", @@ -349,7 +359,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 11, "metadata": { "slideshow": { "slide_type": "slide" @@ -360,8 +370,8 @@ "output_type": "display_data", "data": { "text/plain": "
", - "image/svg+xml": "\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", - "image/png": "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\n" + "image/svg+xml": "\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", + "image/png": "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\n" }, "metadata": { "needs_background": "light" @@ -425,7 +435,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 12, "metadata": { "slideshow": { "slide_type": "slide" @@ -433,10 +443,10 @@ }, "outputs": [], "source": [ - "''' BaseEstimator is the parent module for a customized learner '''\n", + "''' BaseEstimator is the parent class for a customized learner '''\n", "from flaml.model import BaseEstimator\n", "from flaml.space import ConfigSearchInfo\n", - "''' import the original implementation of RGF from rgf.sklearn package'''\n", + "''' import the RGF implementation from rgf.sklearn module'''\n", "from rgf.sklearn import RGFClassifier, RGFRegressor\n", "\n", "\n", @@ -465,6 +475,7 @@ "\n", " # round integer hyperparameters\n", " self.params = {\n", + " \"n_jobs\": n_jobs,\n", " 'max_leaf': int(round(max_leaf)),\n", " 'n_iter': int(round(n_iter)),\n", " 'n_tree_search': int(round(n_tree_search)),\n", @@ -489,7 +500,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 13, "metadata": { "slideshow": { "slide_type": "slide" @@ -504,7 +515,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 14, "metadata": { "slideshow": { "slide_type": "slide" @@ -516,54 +527,68 @@ "output_type": "stream", "name": "stderr", "text": [ - "[flaml.automl: 11-22 10:32:04] {649} INFO - List of ML learners in AutoML Run: ['RGF', 'lgbm', 'rf', 'xgboost']\n", - "[flaml.automl: 11-22 10:32:04] {654} INFO - Evaluation method: holdout\n", - "[flaml.automl: 11-22 10:32:04] {672} INFO - Minimizing error metric: 1-accuracy\n", - "[flaml.automl: 11-22 10:32:05] {326} INFO - Using StratifiedKFold\n", - "[flaml.automl: 11-22 10:32:05] {717} INFO - iteration 0 current learner RGF\n", - "[flaml.automl: 11-22 10:32:10] {782} INFO - at 5.9s,\tbest RGF's error=0.3764,\tbest RGF's error=0.3764\n", - "[flaml.automl: 11-22 10:32:10] {717} INFO - iteration 1 current learner RGF\n", - "[flaml.automl: 11-22 10:32:17] {782} INFO - at 13.5s,\tbest RGF's error=0.3764,\tbest RGF's error=0.3764\n", - "[flaml.automl: 11-22 10:32:17] {717} INFO - iteration 2 current learner lgbm\n", - "[flaml.automl: 11-22 10:32:17] {782} INFO - at 13.7s,\tbest lgbm's error=0.3790,\tbest RGF's error=0.3764\n", - "[flaml.automl: 11-22 10:32:17] {717} INFO - iteration 3 current learner lgbm\n", - "[flaml.automl: 11-22 10:32:18] {782} INFO - at 14.1s,\tbest lgbm's error=0.3739,\tbest lgbm's error=0.3739\n", - "[flaml.automl: 11-22 10:32:18] {717} INFO - iteration 4 current learner lgbm\n", - "[flaml.automl: 11-22 10:32:18] {782} INFO - at 14.5s,\tbest lgbm's error=0.3738,\tbest lgbm's error=0.3738\n", - "[flaml.automl: 11-22 10:32:18] {717} INFO - iteration 5 current learner lgbm\n", - "[flaml.automl: 11-22 10:32:18] {782} INFO - at 14.7s,\tbest lgbm's error=0.3657,\tbest lgbm's error=0.3657\n", - "[flaml.automl: 11-22 10:32:18] {717} INFO - iteration 6 current learner lgbm\n", - "[flaml.automl: 11-22 10:32:19] {782} INFO - at 15.3s,\tbest lgbm's error=0.3657,\tbest lgbm's error=0.3657\n", - "[flaml.automl: 11-22 10:32:19] {717} INFO - iteration 7 current learner lgbm\n", - "[flaml.automl: 11-22 10:32:20] {782} INFO - at 16.4s,\tbest lgbm's error=0.3650,\tbest lgbm's error=0.3650\n", - "[flaml.automl: 11-22 10:32:20] {717} INFO - iteration 8 current learner lgbm\n", - "[flaml.automl: 11-22 10:32:23] {782} INFO - at 19.2s,\tbest lgbm's error=0.3562,\tbest lgbm's error=0.3562\n", - "[flaml.automl: 11-22 10:32:23] {717} INFO - iteration 9 current learner lgbm\n", - "[flaml.automl: 11-22 10:32:27] {782} INFO - at 23.4s,\tbest lgbm's error=0.3547,\tbest lgbm's error=0.3547\n", - "[flaml.automl: 11-22 10:32:27] {717} INFO - iteration 10 current learner lgbm\n", - "[flaml.automl: 11-22 10:32:34] {782} INFO - at 30.0s,\tbest lgbm's error=0.3477,\tbest lgbm's error=0.3477\n", - "[flaml.automl: 11-22 10:32:34] {717} INFO - iteration 11 current learner lgbm\n", - "[flaml.automl: 11-22 10:32:42] {782} INFO - at 38.1s,\tbest lgbm's error=0.3477,\tbest lgbm's error=0.3477\n", - "[flaml.automl: 11-22 10:32:42] {717} INFO - iteration 12 current learner lgbm\n", - "[flaml.automl: 11-22 10:32:50] {782} INFO - at 46.8s,\tbest lgbm's error=0.3435,\tbest lgbm's error=0.3435\n", - "[flaml.automl: 11-22 10:32:50] {717} INFO - iteration 13 current learner xgboost\n", - "[flaml.automl: 11-22 10:32:51] {782} INFO - at 47.0s,\tbest xgboost's error=0.3740,\tbest lgbm's error=0.3435\n", - "[flaml.automl: 11-22 10:32:51] {717} INFO - iteration 14 current learner xgboost\n", - "[flaml.automl: 11-22 10:32:51] {782} INFO - at 47.4s,\tbest xgboost's error=0.3685,\tbest lgbm's error=0.3435\n", - "[flaml.automl: 11-22 10:32:51] {717} INFO - iteration 15 current learner xgboost\n", - "[flaml.automl: 11-22 10:32:51] {782} INFO - at 47.8s,\tbest xgboost's error=0.3673,\tbest lgbm's error=0.3435\n", - "[flaml.automl: 11-22 10:32:52] {717} INFO - iteration 16 current learner xgboost\n", - "[flaml.automl: 11-22 10:32:52] {782} INFO - at 48.3s,\tbest xgboost's error=0.3662,\tbest lgbm's error=0.3435\n", - "[flaml.automl: 11-22 10:32:52] {717} INFO - iteration 17 current learner RGF\n", - "[flaml.automl: 11-22 10:33:03] {782} INFO - at 59.5s,\tbest RGF's error=0.3764,\tbest lgbm's error=0.3435\n", - "[flaml.automl: 11-22 10:33:03] {717} INFO - iteration 18 current learner lgbm\n", - "[flaml.automl: 11-22 10:33:05] {782} INFO - at 61.1s,\tbest lgbm's error=0.3435,\tbest lgbm's error=0.3435\n", - "[flaml.automl: 11-22 10:33:05] {803} INFO - LGBMClassifier(colsample_bytree=0.7, learning_rate=0.6244209542375836,\n", - " max_bin=1023, min_child_weight=8.99139787892973, n_estimators=8,\n", - " num_leaves=60, objective='binary',\n", - " reg_alpha=1.1018060088007014e-10,\n", - " reg_lambda=0.33075796457184126)\n", - "[flaml.automl: 11-22 10:33:05] {691} INFO - fit succeeded\n" + "[flaml.automl: 12-15 07:42:43] {660} INFO - List of ML learners in AutoML Run: ['RGF', 'lgbm', 'rf', 'xgboost']\n", + "[flaml.automl: 12-15 07:42:43] {665} INFO - Evaluation method: holdout\n", + "[flaml.automl: 12-15 07:42:43] {683} INFO - Minimizing error metric: 1-accuracy\n", + "[flaml.automl: 12-15 07:42:45] {327} INFO - Using StratifiedKFold\n", + "[flaml.automl: 12-15 07:42:45] {728} INFO - iteration 0 current learner RGF\n", + "[flaml.automl: 12-15 07:42:47] {793} INFO - at 4.0s,\tbest RGF's error=0.3764,\tbest RGF's error=0.3764\n", + "[flaml.automl: 12-15 07:42:47] {728} INFO - iteration 1 current learner RGF\n", + "[flaml.automl: 12-15 07:42:52] {793} INFO - at 8.7s,\tbest RGF's error=0.3764,\tbest RGF's error=0.3764\n", + "[flaml.automl: 12-15 07:42:52] {728} INFO - iteration 2 current learner lgbm\n", + "[flaml.automl: 12-15 07:42:52] {793} INFO - at 8.9s,\tbest lgbm's error=0.3790,\tbest RGF's error=0.3764\n", + "[flaml.automl: 12-15 07:42:52] {728} INFO - iteration 3 current learner lgbm\n", + "[flaml.automl: 12-15 07:42:53] {793} INFO - at 9.3s,\tbest lgbm's error=0.3790,\tbest RGF's error=0.3764\n", + "[flaml.automl: 12-15 07:42:53] {728} INFO - iteration 4 current learner lgbm\n", + "[flaml.automl: 12-15 07:42:53] {793} INFO - at 9.8s,\tbest lgbm's error=0.3718,\tbest lgbm's error=0.3718\n", + "[flaml.automl: 12-15 07:42:53] {728} INFO - iteration 5 current learner lgbm\n", + "[flaml.automl: 12-15 07:42:53] {793} INFO - at 10.0s,\tbest lgbm's error=0.3652,\tbest lgbm's error=0.3652\n", + "[flaml.automl: 12-15 07:42:53] {728} INFO - iteration 6 current learner lgbm\n", + "[flaml.automl: 12-15 07:42:54] {793} INFO - at 10.5s,\tbest lgbm's error=0.3652,\tbest lgbm's error=0.3652\n", + "[flaml.automl: 12-15 07:42:54] {728} INFO - iteration 7 current learner lgbm\n", + "[flaml.automl: 12-15 07:42:55] {793} INFO - at 11.8s,\tbest lgbm's error=0.3652,\tbest lgbm's error=0.3652\n", + "[flaml.automl: 12-15 07:42:55] {728} INFO - iteration 8 current learner lgbm\n", + "[flaml.automl: 12-15 07:42:57] {793} INFO - at 14.0s,\tbest lgbm's error=0.3568,\tbest lgbm's error=0.3568\n", + "[flaml.automl: 12-15 07:42:57] {728} INFO - iteration 9 current learner lgbm\n", + "[flaml.automl: 12-15 07:43:02] {793} INFO - at 18.1s,\tbest lgbm's error=0.3547,\tbest lgbm's error=0.3547\n", + "[flaml.automl: 12-15 07:43:02] {728} INFO - iteration 10 current learner lgbm\n", + "[flaml.automl: 12-15 07:43:07] {793} INFO - at 23.2s,\tbest lgbm's error=0.3522,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:07] {728} INFO - iteration 11 current learner xgboost\n", + "[flaml.automl: 12-15 07:43:07] {793} INFO - at 23.9s,\tbest xgboost's error=0.3764,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:07] {728} INFO - iteration 12 current learner xgboost\n", + "[flaml.automl: 12-15 07:43:08] {793} INFO - at 24.7s,\tbest xgboost's error=0.3671,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:08] {728} INFO - iteration 13 current learner xgboost\n", + "[flaml.automl: 12-15 07:43:09] {793} INFO - at 26.0s,\tbest xgboost's error=0.3671,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:09] {728} INFO - iteration 14 current learner lgbm\n", + "[flaml.automl: 12-15 07:43:18] {793} INFO - at 34.7s,\tbest lgbm's error=0.3522,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:18] {728} INFO - iteration 15 current learner rf\n", + "[flaml.automl: 12-15 07:43:19] {793} INFO - at 35.3s,\tbest rf's error=0.4323,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:19] {728} INFO - iteration 16 current learner rf\n", + "[flaml.automl: 12-15 07:43:19] {793} INFO - at 36.0s,\tbest rf's error=0.4033,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:19] {728} INFO - iteration 17 current learner RGF\n", + "[flaml.automl: 12-15 07:43:28] {793} INFO - at 44.7s,\tbest RGF's error=0.3764,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:28] {728} INFO - iteration 18 current learner xgboost\n", + "[flaml.automl: 12-15 07:43:29] {793} INFO - at 45.4s,\tbest xgboost's error=0.3602,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:29] {728} INFO - iteration 19 current learner xgboost\n", + "[flaml.automl: 12-15 07:43:31] {793} INFO - at 47.3s,\tbest xgboost's error=0.3544,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:31] {728} INFO - iteration 20 current learner xgboost\n", + "[flaml.automl: 12-15 07:43:32] {793} INFO - at 48.9s,\tbest xgboost's error=0.3525,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:32] {728} INFO - iteration 21 current learner xgboost\n", + "[flaml.automl: 12-15 07:43:37] {793} INFO - at 53.5s,\tbest xgboost's error=0.3525,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:37] {728} INFO - iteration 22 current learner lgbm\n", + "[flaml.automl: 12-15 07:43:42] {793} INFO - at 59.0s,\tbest lgbm's error=0.3522,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:42] {728} INFO - iteration 23 current learner xgboost\n", + "[flaml.automl: 12-15 07:43:43] {793} INFO - at 59.9s,\tbest xgboost's error=0.3525,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:43] {728} INFO - iteration 24 current learner rf\n", + "[flaml.automl: 12-15 07:43:43] {793} INFO - at 59.9s,\tbest rf's error=0.4033,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:43] {728} INFO - iteration 25 current learner RGF\n", + "[flaml.automl: 12-15 07:43:47] {793} INFO - at 63.9s,\tbest RGF's error=0.3764,\tbest lgbm's error=0.3522\n", + "[flaml.automl: 12-15 07:43:47] {814} INFO - LGBMClassifier(colsample_bytree=0.7, learning_rate=0.06177098582210786,\n", + " max_bin=127, min_child_weight=5.058775453728698, n_estimators=80,\n", + " num_leaves=17, objective='binary',\n", + " reg_alpha=3.690867311882246e-10, reg_lambda=1.0,\n", + " subsample=0.7382230019481447)\n", + "[flaml.automl: 12-15 07:43:47] {702} INFO - fit succeeded\n" ] } ], @@ -586,10 +611,10 @@ "metadata": { "kernelspec": { "name": "python3", - "display_name": "Python 3.7.7 64-bit ('flaml': conda)", + "display_name": "Python 3.7.9 64-bit ('test': conda)", "metadata": { "interpreter": { - "hash": "bfcd9a6a9254a5e160761a1fd7a9e444f011592c6770d9f4180dde058a9df5dd" + "hash": "d432c3c2bcf16c697a4c55907b7ae9cb502fbbf6a7955e813637a3b18956f9d0" } } }, @@ -603,7 +628,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7-final" + "version": "3.7.9-final" } }, "nbformat": 4, diff --git a/setup.py b/setup.py index 9b7609260..b036ee9b8 100644 --- a/setup.py +++ b/setup.py @@ -45,6 +45,7 @@ setuptools.setup( "flake8>=3.8.4", "pytest>=6.1.1", "coverage>=5.3", + "rgf-python", ], }, classifiers=[ diff --git a/test/test_automl.py b/test/test_automl.py index 8a51da97e..fa68b38f2 100644 --- a/test/test_automl.py +++ b/test/test_automl.py @@ -2,9 +2,55 @@ import unittest import numpy as np import scipy.sparse -from sklearn.datasets import load_boston, load_iris +from sklearn.datasets import load_boston, load_iris, load_wine -from flaml import AutoML, get_output_from_log +from flaml import AutoML +from flaml.data import get_output_from_log + +from flaml.model import BaseEstimator +from flaml.space import ConfigSearchInfo +from rgf.sklearn import RGFClassifier, RGFRegressor + + +class MyRegularizedGreedyForest(BaseEstimator): + + # search space + params_configsearch_info = { + 'max_leaf': ConfigSearchInfo(name = 'max_leaf', + type = int, lower = 4, init = 4, upper = 10000), + 'n_iter': ConfigSearchInfo(name = 'n_iter', type = int, lower = 1, + init = 1, upper = 32768), + 'n_tree_search': ConfigSearchInfo(name = 'n_tree_search', type = int, + lower = 1, init = 1, upper = 32768), + 'opt_interval': ConfigSearchInfo(name = 'opt_interval', type = int, + lower = 1, init = 100, upper = 10000), + 'learning_rate': ConfigSearchInfo(name = 'learning_rate', type = float, + lower = 0.01, init = 1.0, upper = 20.0), + 'min_samples_leaf': ConfigSearchInfo(name = 'min_samples_leaf', + type = int, lower = 1, init = 20, upper = 20) + } + + def __init__(self, objective_name = 'binary:logistic', n_jobs = 1, + max_leaf = 1000, n_iter = 1, n_tree_search = 1, opt_interval = 1, + learning_rate = 1.0, min_samples_leaf = 1): + + self.objective_name = objective_name + + if 'regression' in objective_name: + self.estimator_class = RGFRegressor + else: + self.estimator_class = RGFClassifier + + # round integer hyperparameters + self.params = { + 'max_leaf': int(round(max_leaf)), + 'n_iter': int(round(n_iter)), + 'n_tree_search': int(round(n_tree_search)), + 'opt_interval': int(round(opt_interval)), + 'learning_rate': learning_rate, + 'min_samples_leaf':int(round(min_samples_leaf)), + "n_jobs": n_jobs, + } def custom_metric(X_test, y_test, estimator, labels, X_train, y_train): @@ -19,6 +65,23 @@ def custom_metric(X_test, y_test, estimator, labels, X_train, y_train): class TestAutoML(unittest.TestCase): + def test_custom_learner(self): + automl = AutoML() + automl.add_learner(learner_name = 'RGF', + learner_class = MyRegularizedGreedyForest) + X_train, y_train = load_wine(return_X_y=True) + settings = { + "time_budget": 10, # total running time in seconds + "estimator_list": ['RGF', 'lgbm', 'rf', 'xgboost'], + "task": 'classification', # task type + "sample": True, # whether to subsample training data + "log_file_name": "test/wine.log", + "log_training_metric": True, # whether to log training metric + } + + '''The main flaml automl API''' + automl.fit(X_train = X_train, y_train = y_train, **settings) + def test_dataframe(self): self.test_classification(True) diff --git a/test/test_python_log.py b/test/test_python_log.py index 561de54fd..d1cb2d347 100644 --- a/test/test_python_log.py +++ b/test/test_python_log.py @@ -36,9 +36,9 @@ class TestLogging(unittest.TestCase): "model_history": True } X_train, y_train = load_boston(return_X_y=True) - n = len(y_train) - automl_experiment.fit(X_train=X_train[:n >> 1], y_train=y_train[:n >> 1], - X_val=X_train[n >> 1:], y_val=y_train[n >> 1:], + n = len(y_train) >> 1 + automl_experiment.fit(X_train=X_train[:n], y_train=y_train[:n], + X_val=X_train[n:], y_val=y_train[n:], **automl_settings) # Check if the log buffer is populated. diff --git a/test/test_training_log.py b/test/test_training_log.py index 2ac9f2b68..2b72ecd82 100644 --- a/test/test_training_log.py +++ b/test/test_training_log.py @@ -1,7 +1,5 @@ import os import unittest -import logging -import json from tempfile import TemporaryDirectory from sklearn.datasets import load_boston