Loading data...
Train (80%): 504,000  |  Val (20%): 126,000
Target dist: Presence=0.448  Absence=0.552

HVRT-reducing 630k -> 50,000 for HPO...
Done in 5.6s  |  n=50,000  class_balance=0.504

--- Optuna HPO ---
  40 trials x 3-fold CV on 50,000  |  n_jobs=8  |  n_rounds fixed=1000
  Search space: {'learning_rate': [0.1, 0.15, 0.2, 0.25, 0.3], 'max_depth': [3, 4, 5], 'refit_interval': [20, 50, 100], 'y_weight': [0.3, 0.4, 0.5, 0.6, 0.7, 0.8]}
  Warm starts:  {'learning_rate': 0.3, 'max_depth': 4, 'refit_interval': 50, 'y_weight': 0.4}  +  {'learning_rate': 0.2, 'max_depth': 4, 'refit_interval': 100, 'y_weight': 0.6}


HPO done in 3087.4s
Best CV AUC : 0.9329
Best params : {'learning_rate': 0.25, 'max_depth': 3, 'refit_interval': 20, 'y_weight': 0.3}

All 40 trials:
    #      LR    D     RI     YW    CV AUC
  ---  ------  ---  -----  -----  --------
    0     0.3    4     50    0.4    0.9326
    1     0.2    4    100    0.6    0.9328
    2     0.3    4    100    0.5    0.9328
    3     0.2    4     50    0.7    0.9327
    4    0.25    5     20    0.8    0.9320
    5     0.3    4    100    0.5    0.9328
    6    0.25    4     50    0.6    0.9327
    7     0.2    5     20    0.3    0.9322
    8    0.25    5     20    0.5    0.9320
    9    0.25    3     20    0.3    0.9329 *
   10    0.15    4     50    0.7    0.9328
   11     0.2    5     20    0.3    0.9322
   12     0.1    3     50    0.6    0.9325
   13     0.1    4    100    0.8    0.9326
   14     0.2    4    100    0.7    0.9327
   15     0.2    4     20    0.8    0.9327
   16     0.1    4    100    0.4    0.9325
   17    0.15    5     20    0.3    0.9324
   18    0.15    3     20    0.3    0.9327
   19    0.15    3     50    0.7    0.9328
   20    0.15    3     50    0.7    0.9328
   21    0.15    3     20    0.3    0.9327
   22    0.15    3     20    0.3    0.9327
   23    0.15    3     20    0.7    0.9328
   24    0.15    3     20    0.3    0.9327
   25    0.15    3     20    0.3    0.9327
   26    0.15    3     20    0.3    0.9327
   27    0.25    3     20    0.3    0.9329
   28    0.15    3     50    0.7    0.9328
   29    0.15    3     50    0.7    0.9328
   30    0.25    3     50    0.7    0.9329
   31    0.25    3     50    0.7    0.9329
   32    0.25    3     50    0.7    0.9329
   33    0.25    3     50    0.7    0.9329
   34    0.25    3     50    0.7    0.9329
   35    0.25    3     50    0.7    0.9329
   36    0.25    3     50    0.4    0.9328
   37    0.25    3     50    0.4    0.9328
   38    0.25    3     50    0.4    0.9328
   39    0.25    3     50    0.4    0.9328

--- Checkpoint sweep (best params, 504k holdout) ---
  Params: {'learning_rate': 0.25, 'max_depth': 3, 'refit_interval': 20, 'y_weight': 0.3}
    n_rounds     val_AUC    fit_time
  ----------  ----------  ----------
        1000      0.9548      809.1s <--
        2000      0.9551     1619.1s <--
        3000      0.9553     2447.6s <--
        4000      0.9555     3388.8s <--

  Best checkpoint: n_rounds=4000  val_AUC=0.9555
  Previous best submission : 0.95333
  Improvement              : +0.00214

--- Final refit: n_rounds=4000 on all 630k ---
  Params: {'learning_rate': 0.25, 'max_depth': 3, 'refit_interval': 20, 'y_weight': 0.3, 'n_rounds': 4000, 'random_state': 42}
  Fit done in 4323.6s  |  n_trees=4000
  Train AUC (full 630k): 0.9552

--- Predict & write submission ---
  Done in 36.2s
  Test proba: min=0.0008  max=0.9995  mean=0.4500
  Saved: data/sample_submission_v013.csv  (270,000 rows)
Traceback (most recent call last):
  File "C:\Users\jakep\ProofOfConcept\GeoXGB\data\v013_hpo_pipeline.py", line 199, in <module>
    final.save(model_path)
    ~~~~~~~~~~^^^^^^^^^^^^
  File "C:\Users\jakep\ProofOfConcept\GeoXGB\src\geoxgb\_base.py", line 523, in save
    joblib.dump(slim, path)
    ~~~~~~~~~~~^^^^^^^^^^^^
  File "C:\Users\jakep\AppData\Roaming\Python\Python313\site-packages\joblib\numpy_pickle.py", line 600, in dump
    NumpyPickler(f, protocol=protocol).dump(value)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 484, in dump
    self.save(obj)
    ~~~~~~~~~^^^^^
  File "C:\Users\jakep\AppData\Roaming\Python\Python313\site-packages\joblib\numpy_pickle.py", line 395, in save
    return Pickler.save(self, obj)
           ~~~~~~~~~~~~^^^^^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 601, in save
    self.save_reduce(obj=obj, *rv)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 715, in save_reduce
    save(state)
    ~~~~^^^^^^^
  File "C:\Users\jakep\AppData\Roaming\Python\Python313\site-packages\joblib\numpy_pickle.py", line 395, in save
    return Pickler.save(self, obj)
           ~~~~~~~~~~~~^^^^^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 558, in save
    f(self, obj)  # Call unbound method with explicit self
    ~^^^^^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 990, in save_dict
    self._batch_setitems(obj.items())
    ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 1014, in _batch_setitems
    save(v)
    ~~~~^^^
  File "C:\Users\jakep\AppData\Roaming\Python\Python313\site-packages\joblib\numpy_pickle.py", line 395, in save
    return Pickler.save(self, obj)
           ~~~~~~~~~~~~^^^^^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 558, in save
    f(self, obj)  # Call unbound method with explicit self
    ~^^^^^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 950, in save_list
    self._batch_appends(obj)
    ~~~~~~~~~~~~~~~~~~~^^^^^
  File "C:\Python313\Lib\pickle.py", line 974, in _batch_appends
    save(x)
    ~~~~^^^
  File "C:\Users\jakep\AppData\Roaming\Python\Python313\site-packages\joblib\numpy_pickle.py", line 395, in save
    return Pickler.save(self, obj)
           ~~~~~~~~~~~~^^^^^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 558, in save
    f(self, obj)  # Call unbound method with explicit self
    ~^^^^^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 990, in save_dict
    self._batch_setitems(obj.items())
    ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 1014, in _batch_setitems
    save(v)
    ~~~~^^^
  File "C:\Users\jakep\AppData\Roaming\Python\Python313\site-packages\joblib\numpy_pickle.py", line 395, in save
    return Pickler.save(self, obj)
           ~~~~~~~~~~~~^^^^^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 601, in save
    self.save_reduce(obj=obj, *rv)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 715, in save_reduce
    save(state)
    ~~~~^^^^^^^
  File "C:\Users\jakep\AppData\Roaming\Python\Python313\site-packages\joblib\numpy_pickle.py", line 395, in save
    return Pickler.save(self, obj)
           ~~~~~~~~~~~~^^^^^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 558, in save
    f(self, obj)  # Call unbound method with explicit self
    ~^^^^^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 990, in save_dict
    self._batch_setitems(obj.items())
    ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
  File "C:\Python313\Lib\pickle.py", line 1014, in _batch_setitems
    save(v)
    ~~~~^^^
  File "C:\Users\jakep\AppData\Roaming\Python\Python313\site-packages\joblib\numpy_pickle.py", line 392, in save
    wrapper.write_array(obj, self)
    ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
  File "C:\Users\jakep\AppData\Roaming\Python\Python313\site-packages\joblib\numpy_pickle.py", line 157, in write_array
    pickler.file_handle.write(chunk.tobytes("C"))
    ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
OSError: [Errno 28] No space left on device
