Ë
    LµCjc  ã                   óª   — d Z ddlZddlmZ ddlZddlZddlZddl	m
Z
mZ ddlmZ ddlZddlmZmZmZ  ee«      Zg d¢ZdZdd	„Zed
k(  r e«        yy)zÆ
Train the XGBoost yield prediction regressor.

Usage:
    python -m ml_pipeline.training.train_xgb_yield         --input data/processed/final_feature_matrix.csv         --output-dir data/models/v1
é    N)ÚPath)Úmean_absolute_errorÚr2_score)Útrain_test_split)Úcheck_minimum_samplesÚ
get_loggerÚsave_training_metadata)Úrainfall_mmÚtemp_cÚhumidityÚseason_indexÚrainfall_anomalyÚrainfall_ma3Úrainfall_lag1Úwater_req_mmÚ
min_temp_cÚ
max_temp_cÚdrought_tolerantÚgrowth_daysÚyield_ton_hac            
      ó  — t        j                  d¬«      } | j                  dd¬«       | j                  dd¬«       | j                  «       }t	        j
                  |j                  «      }t        t        t        gz   «      t        |j                  «      z
  }|rt        d|› �«      ‚|j                  t        t        gz   ¬«      }t        t        |«      d	d
¬«       |t           j                  }|t           j                  }t!        ||dd¬«      \  }}}}	t#        j$                  ddddd¬«      }
|
j'                  ||||	fgd¬«       |
j)                  |«      }t+        |	|«      }t-        |	|«      }t.        j1                  d|d›d|d›�«       |dk  rt.        j3                  d|d›d�«       t.        j1                  d«       d}g }t4        j6                  j9                  d«      }t;        |«      D ]k  }|j=                  t        |«      t        |«      d¬«      }t#        j$                  dddd|¬«      }|j'                  ||   ||   «       |j?                  |«       Œm t5        j@                  |D �cg c]  }|j)                  |«      ‘Œ c}«      }tC        t5        jD                  t5        jF                  |d ¬!«      «      «      }t.        j1                  d"|d›d#�«       tI        |jJ                  «      }|jM                  dd¬$«       |
t        |d%œ}|d&z  }tO        jP                  ||«       tS        |d	tC        |«      tC        |«      |d'œt        t        |«      t        |«      ¬(«       t.        j1                  d)|› �«       y c c}w )*NzTrain XGBoost yield regressor)Údescriptionz--inputT)Úrequiredz--output-dirz#Input is missing required columns: )ÚsubsetÚ	xgb_yieldéd   )Úminimumgš™™™™™É?é*   )Ú	test_sizeÚrandom_statei,  é   gš™™™™™©?gš™™™™™é?)Ún_estimatorsÚ	max_depthÚlearning_rateÚ	subsampler    F)Úeval_setÚverbosez
Test MAE: z.3fz tonnes/ha, R2: g      à?zR2 of z.2fz© means the model explains less than half the variance in yield. Treat predictions as directional, not precise, until more training data or better features are available.z9Training bootstrap ensemble for uncertainty estimation...é
   )ÚsizeÚreplacer   )Úaxisz5Average bootstrap uncertainty (std across ensemble): z
 tonnes/ha)ÚparentsÚexist_ok)ÚmodelÚfeature_colsÚbootstrap_modelszxgb_yield.pkl)Ú
mae_ton_haÚr2Ú avg_bootstrap_uncertainty_ton_ha)Ú
model_nameÚmetricsr/   Ún_trainÚn_testzSaved model bundle to )*ÚargparseÚArgumentParserÚadd_argumentÚ
parse_argsÚpdÚread_csvÚinputÚsetÚFEATURE_COLUMNSÚTARGET_COLUMNÚcolumnsÚ
ValueErrorÚdropnar   ÚlenÚvaluesr   ÚxgbÚXGBRegressorÚfitÚpredictr   r   ÚloggerÚinfoÚwarningÚnpÚrandomÚdefault_rngÚrangeÚchoiceÚappendÚarrayÚfloatÚmeanÚstdr   Ú
output_dirÚmkdirÚjoblibÚdumpr	   )ÚparserÚargsÚdfÚmissing_colsÚXÚyÚX_trainÚX_testÚy_trainÚy_testr.   Úy_predÚmaer2   Ún_bootstrapr0   ÚrngÚiÚidxÚbmÚbootstrap_predsÚavg_uncertaintyrX   ÚbundleÚoutput_paths                            úQC:\Crop_Prediction\Backend\crop-ai-system\ml_pipeline\training\train_xgb_yield.pyÚmainrr   #   s7  € Ü×$Ñ$Ð1PÔQ€FØ
×Ñ˜	¨DÐÔ1Ø
×Ñ˜°ÐÔ6Ø×ÑÓ€Dä	�‰�T—Z‘ZÓ	 €Bä”¬-¨Ñ8Ó9¼CÀÇ
Á
»OÑK€LÙÜÐ>¸|¸nÐMÓNÐNà	�‰œ/¬]¨OÑ;ˆÓ	<€Bô œ#˜b›' ;¸Õ<à
Œ?Ñ×"Ñ"€AØ
Œ=Ñ× Ñ €Aä'7¸¸1ÈÐZ\Ô']Ñ$€GˆV�W˜fä×ÑØØØØØô€Eð 
‡I�Iˆg�w¨6°6Ð*:Ð);ÀU€IÔKà�]‰]˜6Ó"€FÜ
˜f fÓ
-€CÜ	�&˜&Ó	!€BÜ
‡K�K�*˜S ˜IÐ%5°b¸°XÐ>Ô?à	ˆC‚xÜ�‰Ø�R˜�Hð Ið Jô	
ô ‡K�KÐKÔLØ€KØÐÜ
�)‰)×
Ñ
 Ó
#€Cä�;Óò $ˆØ�j‰jœ˜W›¬C°«LÀ$ˆjÓGˆÜ×ÑØ¨¸Ø¨ô
ˆð 	�‰ˆw�s‰|˜W S™\Ô*Ø×Ñ Õ#ð$ô —h‘hÐ=MÖN°r §
¡
¨6Õ 2ÒNÓO€OÜœBŸG™G¤B§F¡F¨?ÀÔ$CÓDÓE€OÜ
‡K�KÐGÈÐX[ÐG\Ð\fÐgÔhä�d—o‘oÓ&€JØ×Ñ˜T¨DÐÔ1ð Ü'Ø,ñ€Fð ˜Ñ.€KÜ
‡K�K�˜Ô$äØØä ›*Ü˜“)Ø0?ñ
ô
 %Ü�G“Ü�6‹{õô ‡K�KÐ(¨¨Ð6Õ7ùò=  Os   É3NÚ__main__)ÚreturnN)Ú__doc__r8   Úpathlibr   rZ   ÚnumpyrN   ÚxgboostrG   Úsklearn.metricsr   r   Úsklearn.model_selectionr   Úpandasr<   Ú#ml_pipeline.training.training_utilsr   r   r	   Ú__name__rK   r@   rA   rr   © ó    rq   ú<module>r€      s]   ðñó Ý ã Û Û ß 9Ý 4ã ç iÑ iá	�HÓ	€ò€ð €ó\8ð~ ˆzÒÙ…Fð r   