
    	KWj                     f    S r SSKrSSKJr  SSKJr  SSKJr  SSK	J
r
  SSKJr  S r " S	 S
5      rg)u  Meta-ensemble: RandomForest + XGBoost + LightGBM → Blending.

Для каждого направления (long/short):
1. Обучает 3 базовые модели (RF, XGB, LGB) на 80% train
2. Находит оптимальные веса blending на val (20% train) — минимизация log_loss
3. Возвращает взвешенное среднее (blend) как итоговую вероятность

Blending не сжимает вероятности (в отличие от Platt scaling) и сохраняет
высокие значения при уверенных предсказаниях базовых моделей.
    N)minimize)RandomForestClassifier)log_loss)XGBClassifier)LGBMClassifierc                 2  ^ ^^ U U4S jm[         R                  " / SQ5      nT" U5      n/ SQ/ SQ/ SQ/ SQ4 HJ  n[        U4S jUS/S	-  S
S S.SSSS.S9nUR                  U:  d  M2  UR                  nUR                  nML     X"R                  5       -  $ )u3  Находит оптимальные веса blending через минимизацию log_loss.

Args:
    p_val: (n_samples, 3) — [P_rf, P_xgb, P_lgb] на val
    y_val: (n_samples,) — истинные метки

Returns:
    np.ndarray: (3,) — оптимальные веса (сумма = 1)
c                    > [         R                  " U SS5      n X R                  5       -  n TU -  n[         R                  " USS5      n[        TU5      $ )Nr      gV瞯<g?)npclipsumr   )wpp_valy_vals     0/home/ai/projects/AI_Strategy/models/ensemble.pyloss$_optimal_blend_weights.<locals>.loss   sJ    GGAq!KAIGGAui(q!!    )UUUUUU?r   r   )r
   r   r   )r   r
   r   )r   r   r
   )g      ?g333333?g?c                    > T" U 5      $ N )xr   s    r   <lambda>(_optimal_blend_weights.<locals>.<lambda>*   s	    d1gr   r   r
      eqc                 (    U R                  5       S-
  $ )Nr
   )r   )r   s    r   r   r   -   s    !r   )typefunSLSQP   g:0yE>)maxiterftol)boundsconstraintsmethodoptions)r   arrayr   r"   r   r   )r   r   best_w	best_lossinitresr   s   ``    @r   _optimal_blend_weightsr0      s    " XX+,FVIIy/B8a<!%.CD #T2
 77YIUUF C JJL  r   c                   8    \ rS rSrSrS	S jrS rS rS
S jrSr	g)EnsembleModel7   u  Blending-ансамбль: RF + XGB + LGB → взвешенное среднее.

Архитектура:
    X_train ──┬── RandomForest ── P_rf ──┐
              ├── XGBoost ─────── P_xgb ──┼── взвешенное среднее ──→ P_ensemble
              └── LightGBM ────── P_lgb ──┘

Веса оптимизируются по log_loss на валидации.
c                 (    Xl         X l        X0l        g r   )long_weightshort_weightrandom_state)selfr5   r6   r7   s       r   __init__EnsembleModel.__init__B   s    &((r   c                     US:X  a%  U R                   nUS:X  a  US:  a  X#-
  U-  OSnXES.$ SU R                  S.US:  a	  X#-
  U-  S.$ SS.$ )u8   Параметры для базовых моделей.longbalancedr   g      ?)class_weightscale_pos_weightr   )r5   r6   )r8   	directionn_trainn_posr   spws         r   _get_paramsEnsembleModel._get_paramsG   sp      A/0J5197?e+RUC$%?? %(D,=,= >AFW_$= PS r   c                    S GHq  nUS:X  a  UOUnUS:X  a  UOUn	[        UR                  5       5      n
U R                  U[        U5      U
5      nU R                  n[        SSUSUS   S9n[        SSS	S
S
US   USSS9	n[        SSS	S
S
US   USSS9	nUR                  X5        UR                  X5        UR                  X5        UR                  U5      SS2S4   nUR                  U5      SS2S4   nUR                  U5      SS2S4   n[        R                  " UUU/5      n[        UU	5      n[        U SU 3U5        [        U SU 3U5        [        U SU 3U5        [        U SU 3U5        GMt     g)u   Обучает ансамбль.

Args:
    X_train: (n_train, n_features) — 80% train
    y_train_long/short: целевые
    X_val: (n_val, n_features) — 20% train
    y_val_long/short: целевые
)r<   shortr<   r$   
   r>   )n_estimators	max_depthr7   n_jobsr>      g?g?r?   r   )	rJ   rK   learning_rate	subsamplecolsample_bytreer?   r7   	verbosityrL   )	rJ   rK   rN   rO   rP   r>   r7   verboserL   Nr
   rf_xgb_lgb_blend_weights_)intr   rD   lenr7   r   r   r   fitpredict_probar   column_stackr0   setattr)r8   X_trainy_train_longy_train_shortX_val
y_val_longy_val_shortr@   y_trainr   rB   paramsrsrfxgblgbrf_valxgb_vallgb_valr   blend_weightss                        r   rY   EnsembleModel.fitS   s    +I&/6&9l}G"+v"5J;E&E%%iWuEF""B ( BR#N3B   AS!'(:!;1R	C ! AS#N3B	C FF7$GGG%GGG% %%e,QT2F''.q!t4G''.q!t4GOOVWg$>?E25%@M DC	{+R0DD,c2DD,c2DN9+6FO +r   c                 4   [        U SU 35      R                  U5      SS2S4   n[        U SU 35      R                  U5      SS2S4   n[        U SU 35      R                  U5      SS2S4   n[        R                  " X4U/5      nU[        U SU 35      -  $ )u   Возвращает P(class=1) — взвешенное среднее 3-х моделей.

Returns:
    np.ndarray: (n_samples,)
rS   Nr
   rT   rU   rV   )getattrrZ   r   r[   )r8   Xr@   rf_pxgb_plgb_pr   s          r   rZ   EnsembleModel.predict_proba   s     ts9+./==a@AFYK01??B1a4HYK01??B1a4HOOT%0174>)!=>>>r   )r5   r7   r6   N)r=   g      @*   )r<   )
__name__
__module____qualname____firstlineno____doc__r9   rD   rY   rZ   __static_attributes__r   r   r   r2   r2   7   s    )

1Gf
?r   r2   )rz   numpyr   scipy.optimizer   sklearn.ensembler   sklearn.metricsr   xgboostr   lightgbmr   r0   r2   r   r   r   <module>r      s0   	  # 3 $ ! # !FY? Y?r   