
    ii0=                     F   d Z ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZ ddlmZ ej                            ej                            e                    Zej                            edd          Zej                            edd	          Z ej        ej                                        rd
nd          Z ede            g dZ g dZ! G d de	j"                  Z#d Z$ddZ%ddZ&d Z'd Z(d Z)e*dk    r e)             dS dS )a'  
BetPredictAI - Advanced Model Training V3

Uses 67 ML features from advanced data collection:
- Rolling team statistics (form, goals, streaks)
- Home/Away specific performance
- Head-to-head records
- Betting odds implied probabilities
- Form differentials

Target: Improve accuracy beyond 62%
    N)
DataLoaderTensorDataset)train_test_split)StandardScaler)datetimez..datamodelscudacpuzUsing device: ),home_form_ppghome_form_gpghome_form_gapghome_form_win_ratehome_home_ppghome_home_gpghome_away_ppghome_away_gpghome_form_winshome_form_drawshome_form_losseshome_streakhome_clean_sheetshome_failed_to_scoreaway_form_ppgaway_form_gpgaway_form_gapgaway_form_win_rateaway_home_ppgaway_home_gpgaway_away_ppgaway_away_gpgaway_form_winsaway_form_drawsaway_form_lossesaway_streakaway_clean_sheetsaway_failed_to_scoreh2h_matchesh2h_home_wins	h2h_drawsh2h_away_winsh2h_home_goalsh2h_away_goalsh2h_total_goals	impl_home	impl_draw	impl_awayppg_diffattack_diffdefense_diffwin_rate_diffhome_home_vs_away_awaystreak_diff)form_momentum_homeform_momentum_awaygoal_expectancydefensive_strength_diffh2h_dominanceodds_value_homeodds_value_awayc                   8     e Zd ZdZg ddf fd	Zd Zd Z xZS )AdvancedBettingModelz
    Advanced neural network with:
    - Deeper architecture
    - Residual connections
    - Dropout for regularization
    - Batch normalization
    i      rB      @   333333?c           	      p   t                                                       g }|}t          |          D ]\  }}|                    t	          j        ||                     |                    t	          j        |                     |                    t	          j        d                     |                    t	          j        |t          |          dz
  k     r|n|dz                       |}t	          j
        | | _        t	          j        |d          | _        |                                  d S )Ng?         ?   )super__init__	enumerateappendnnLinearBatchNorm1d	LeakyReLUDropoutlen
Sequentialfeature_extractor
classifier_init_weights)	self
input_sizehidden_sizesdropoutlayers	prev_sizeihidden_size	__class__s	           2/var/www/html/bet.cuttalo.com/ml/train_model_v3.pyrK   zAdvancedBettingModel.__init__Q   s   	'55 	$ 	$NA{MM")I{;;<<<MM".55666MM",s++,,,MM"*C4E4E4I0I0IWWwY\}]]^^^#II!#!7)Iq11 	    c                    |                                  D ]}t          |t          j                  rTt          j                            |j        dd           |j        %t          j                            |j        d           pt          |t          j	                  rJt          j                            |j        d           t          j                            |j        d           d S )Nfan_out
leaky_relu)modenonlinearityr   rG   )
modules
isinstancerN   rO   initkaiming_normal_weightbias	constant_rP   )rX   ms     ra   rW   z"AdvancedBettingModel._init_weightsd   s     	- 	-A!RY'' -''y|'\\\6%G%%afa000Ar~.. -!!!(A...!!!&!,,,	- 	-rb   c                 V    |                      |          }|                     |          S N)rU   rV   )rX   xfeaturess      ra   forwardzAdvancedBettingModel.forwardn   s'    ))!,,x(((rb   )__name__
__module____qualname____doc__rK   rW   rt   __classcell__)r`   s   @ra   r@   r@   H   st          1I0H0HRU      &- - -) ) ) ) ) ) )rb   r@   c                  f   t          d           t          j        t          j                            t          d                    t          dt                     d           fdt          D             } fdt          D             }t          dt          |            dt          t                                |rt          d	|d
d          d           t          d           dj	        v rNdj	        v rEd         d         z
  dz  d<   d         d         z
  dz  d<   | 
                    ddg           dj	        v r5dj	        v r,d         d         z   dz  d<   |                     d           dj	        v r2dj	        v r)d         d         z
  d<   |                     d           dj	        v r2dj	        v r)d         d         z
  d<   |                     d           dj	        v rndj	        v red         d                             d           z
  d!<   d"         d#                             d           z
  d$<   | 
                    d!d$g           t          d%t          |                                           d&g| d
d'         z   (                                          }t          d)t          |                      | D ]J}||j	        v r?||                             ||                                                   |j        d
d
|f<   K|| fS )*z'Load advanced data and prepare featuresu!   
📊 Loading advanced dataset...zadvanced_historical_matches.csvz	  Loaded z matchesc                 &    g | ]}|j         v |S  columns.0fdfs     ra   
<listcomp>z)load_and_prepare_data.<locals>.<listcomp>{   s     DDDAOO!OOOrb   c                 &    g | ]}|j         v|S r|   r}   r   s     ra   r   z)load_and_prepare_data.<locals>.<listcomp>|   s%    FFFa!2:2E2E2E2E2Erb   z  Available features: /z  Missing features: N   z...u"   
🔧 Creating derived features...r   r   r8   r"   r$   r9   r   r   r      r:   r   r;   r)   r+   r<   r/   r   gQ?r=   r   r1   r>   z#  Total features after derivation: result_code   )subsetz  Matches with complete data: )printpdread_csvospathjoinDATA_DIRrS   ML_FEATURESr~   extendrM   fillnadropnacopymedianloc)available_featuresmissing_featuresdf_cleancolr   s       @ra   load_and_prepare_datar   s   s   	
.///	RW\\(,MNN	O	OB	
'c"gg
'
'
'((( EDDD[DDDFFFF;FFF	
O3'9#:#:
O
OS=M=M
O
OPPP @>%5bqb%9>>>??? 

/000 2:%%*<
*J*J$&'7$82>P;Q$QUV#V $&'7$82>P;Q$QUV#V !!#79M"NOOO "*$$)9RZ)G)G!#O!4r/7J!Ja O!!"3444 2:%%*:bj*H*H(*+;(<rBR?S(S$%!!";<<< "*$$BJ)F)F 1B4GG?!!/222 bj  %9RZ%G%G "#7 82k?;Q;QRV;W;W W "#7 82k?;Q;QRV;W;W W!!#46G"HIII	
I4F0G0G
I
IJJJ yy2DSbS2I IyJJOOQQH	
:3x==
:
:;;; " P P("""#+C=#7#78L8L8N8N#O#OHLC '''rb   333333?c                    t          d           |                     d                              d          } | |         j        }| d         j                            t
                    }t                      }|                    |          }t          |          }t          |d|z
  z            }	t          |d|z
  |z
  z            }
|d|
         |d|
         }}||
|	         ||
|	         }}||	d         ||	d         }}t          dt          |           d	t          |           d
t          |                      d|fd|fd|ffD ]H\  }}t          j
        |d          }t          d| d|d          d|d          d|d                     It          t          j        |          t          j        |                    }t          t          j        |          t          j        |                    }t          t          j        |          t          j        |                    }||||| j        |	d         fS )zCreate train/val/test datasetsu   
📦 Creating datasets...dateT)dropr   rG   Nz	  Train: z | Val: z	 | Test: TrainValTestrI   )	minlength  z distribution: Away=r   z, Draw=z, Home=r   )r   sort_valuesreset_indexvaluesastypeintr   fit_transformrS   npbincountr   torchFloatTensor
LongTensoriloc)r   rs   	test_sizeval_sizeXyscalerX_scaledntest_idxval_idxX_trainy_trainX_valy_valX_testy_testnamelabelsdisttrain_datasetval_datasettest_datasets                          ra   create_datasetsr      sj   	
'((( 
			+	+	+	6	6B 	8A
= '',,A F##A&&H 	AA1I&''H!q9}x/011G)1XgX;WGGH,-q1A/B5Ehii(!HII,FF	
Nc'll
N
NCJJ
N
NV
N
NOOO "7+eU^ff=MN X Xf{6Q///V4VVT!WVVT!WVVTRSWVVWWWW "'""!! M  %   K !&!!   L
 +|VRWXYY=OOOrb      r   c                 Z	   t          d           t          j                    }t          j        |                                 dd          }t          j                            |ddd          }d	}d
}	d	}
g }t          |          D ]}| 	                                 d	}d	}d	}|D ]H\  }}|
                    t                    |
                    t                    }}|                                  | |          } |||          }|                                 t          j        j                            |                                 d           |                                 ||                                z  }|                    d          \  }}||                    d	          z  }||                    |                                                                          z  }Jd|z  |z  }|                                  d	}d	}g d}g d}t          j                    5  |D ];\  }}|
                    t                    |
                    t                    }} | |          }|                    d          \  }}||                    d	          z  }||                    |                                                                          z  }t          d          D ]z}||k    }||xx         |                                                                z  cc<   ||xx         ||         |k                                                                    z  cc<   {=	 d
d
d
           n# 1 swxY w Y   d|z  |z  }d t3          ||          D             }|                    |           |                    |dz   |||d           ||k    rh|}|                                                                 }	d	}
t          d|dz   dd|dd|dd|d	         dd|d         dd|d         dd           n0|
dz  }
|dz   dz  d	k    rt          d|dz   dd|dd|dd           |
|k    rt          d|dz                n|                     |	           | ||fS )z<Train model with early stopping and learning rate schedulingu   
🚀 Training model...gMbP?g{Gz?)lrweight_decaymaxrH   
   )rf   factorpatiencer   Ng      ?)max_normrG   d   )r   r   r   rI   c                 4    g | ]\  }}|d k    rd|z  |z  nd S )r   r   r|   )r   cts      ra   r   ztrain_model.<locals>.<listcomp>#  s0    ]]]TQAEES1Wq[[q]]]rb   )epoch	train_accval_acc	class_accz  Epoch 3dz: Train=.1fz% | Val=u   % ⭐ | Away=z.0fz% Draw=z% Home=r   %z
  Early stopping at epoch )r   rN   CrossEntropyLossoptimAdamW
parameterslr_schedulerReduceLROnPlateaurangetraintodevice	zero_gradbackwardr   utilsclip_grad_norm_stepitemr   sizeeqsumevalno_gradziprM   
state_dictr   load_state_dict)modeltrain_loader
val_loaderepochsr   	criterion	optimizer	schedulerbest_val_accbest_model_statepatience_counterhistoryr   
train_losstrain_correcttrain_totalX_batchy_batchoutputsloss_	predictedr   val_correct	val_totalclass_correctclass_totalr^   maskr   r   s                                  ra   train_modelr     s   	
$%%% #%%I E,,..5tLLLI "44cB 5  I LGv M M
 , 	@ 	@GW&zz&117::f3E3EWG!!!eGnnG9Wg..DMMOOO HN**5+;+;+=+=*LLLNN$))++%J";;q>>LAy7<<??*KY\\'226688==???MM-'+5	 	

	!		ii]__ 	L 	L$. L L #*::f#5#5wzz&7I7I%..&{{1~~9W\\!__,	y||G4488::??AAAq L LA"a<DNNNdhhjjoo&7&77NNN!!$$$4A)=(B(B(D(D(I(I(K(KK$$$$LL	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L #i/]]SP[=\=\]]]	 	w 	QY""	
 
 	 	 	 \!!"L$//116688  `U1W] ` `] ` `] ` `#A,_` `3<Q<_` `LUVWL_` ` ` a a a a !	R1$$ZqZZZYZZZGZZZZ[[[x'':q::;;;E (
 
*+++,''s   *E M77M;	>M;	c           
      \   t          d           |                                  g }g }g }t          j                    5  |D ]\  }}|                    t
                    } | |          }t          j        |d          }	|                    d          \  }
}|                    |	                                
                                           |                    |
                                           |                    |		                                
                                           	 ddd           n# 1 swxY w Y   t          j        |          }t          j        |          }t          j        |          }d||k                                    z  t          |          z  }g d}g }t          d          D ]}||k    }|                                dk    r~d||         |k                                    z  |                                z  }|                    |           t          d	||          d
|dd|                                 d           |                    d           t          d|dd           |                    d          }|dk    }|                                dk    red||         ||         k                                    z  |                                z  }t          d|dd|                                 d           |||||fS )zEvaluate model on test setu   
📈 Evaluating on test set...rG   )dimNr   )AwayDrawHomerI   r   r   z: r   z% (z	 matches)u   
  ✅ Overall Test Accuracy: .2fr   )axisrH   z#  High confidence (>50%) accuracy: )r   r   r   r   r   r   softmaxr   r   r   numpyr   arrayr   rS   r   rM   )r   test_loadertest_df	all_preds
all_labels	all_probsr  r  r  probsr  r  accuracyclass_namesr   r^   r  accconfidenceshigh_conf_maskhigh_conf_accs                        ra   evaluate_modelr%  G  sR   	
,---	JJLLLIJI	 	2 	2 + 	2 	2GWjj((GeGnnGM'q111E";;q>>LAyY]]__2244555gmmoo...UYY[[..001111	2	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 ##I*%%J##I i:-22444s:FH +**KI1XX    Q88::>>4A-22444txxzzACS!!!J{1~JJJJJTXXZZJJJKKKKQ	
;H
;
;
;
;<<< --Q-''K 3&Nay8J~<VV[[]]]`n`r`r`t`ttiMiii.J\J\J^J^iiijjjY	:y@@s   C5D??EEc           
         t          d           t          j        t          d           t          j                            t          d          }t          j        |                                 |           t          d|            t          j                            t          d          }t          j        ||j
        |j        d           t          j                                                    |||dd	t          |          |d
d         d}t          j                            t          d          }	t!          |	d          5 }
t#          j        ||
d           ddd           n# 1 swxY w Y   t          d|	            |S )zSave model and metadatau   
💾 Saving model...T)exist_okzbetting_model_v3.pthz  Model saved to zscaler_v3.npy)meanscalev3z512-256-256-128-64iN)
trained_atr   class_accuracyfeature_columnsmodel_versionarchitecturetotal_featuresr   zbetting_model_v3_meta.jsonwr   )indentz  Metadata saved to )r   r   makedirs
MODELS_DIRr   r   r   saver   r   mean_scale_r   now	isoformatrS   openjsondump)r   r   rs   r   r   r   
model_pathscaler_pathmeta	meta_pathr   s              ra   
save_modelrA  z  s   	
"###K
T**** j*@AAJ	Ju!!:...	
*j
*
*+++ ',,z?;;KGK     lnn..00##,h--344=	 	D Z)EFFI	i		 %	$!$$$$% % % % % % % % % % % % % % %	
,
,
,---s   E,,E03E0c                  .   t          d           t          d           t          d           t                      \  } }t          | |          \  }}}}}t          |dd          }t          |d          }t          |d          }	t	          t          |          g dd	
                              t                    }
t          d           t          dt          |           d           t          d           t          d           t          d |
	                                D                       }t          d|d           t          |
||dd          \  }
}}t          |
|	|          \  }}}}}t          |
|||||           t          d           t          d           t          d           t          d|dd           t          d|dd           t          dt          |                      t          d           |
|fS )Nz<============================================================u.   🧠 BetPredictAI - Advanced Model Training V3rD   T)
batch_sizeshufflerC   )rC  rA   rE   )rY   rZ   r[   u   
🏗️ Model architecture:z	  Input: z	 featuresu,     Hidden: 512 → 256 → 256 → 128 → 64z$  Output: 3 classes (Away/Draw/Home)c              3   >   K   | ]}|                                 V  d S rq   )numel)r   ps     ra   	<genexpr>zmain.<locals>.<genexpr>  s*      ==Qqwwyy======rb   z  Total parameters: ,r      )r   r   z=
============================================================u   ✅ TRAINING COMPLETEz  Best Validation Accuracy: r  r   z  Test Accuracy: z  Features used: )r   r   r   r   r@   rS   r   r   r   r   r  r%  rA  )r   rs   train_dsval_dstest_dsr   r  r   r   r  r   total_paramsr   r   test_accr   predsr   r  s                      ra   mainrQ    sK   	&MMM	
:;;;	&MMM )**LB 2AX1N1N.Hfgvw h2tDDDLFs333JW555K !x==---   	bjj	 
 

*+++	
.c(mm
.
.
.///	
9:::	
1222==%*:*:*<*<=====L	
1
1
1
1222 *%zRU`bcccE7G 1?ukSZ0[0[-Hi ufhGDDD	-	
!"""	&MMM	
7
7
7
7
7888	
-h
-
-
-
-...	
-c(mm
-
-...	&MMM(?rb   __main__)r   r   )r   r   )+rx   r   r;  r  r   pandasr   r   torch.nnrN   torch.optimr   torch.utils.datar   r   sklearn.model_selectionr   sklearn.preprocessingr   r   r   dirnameabspath__file__BASE_DIRr   r   r4  r   r
   is_availabler   r   DERIVED_FEATURESModuler@   r   r   r  r%  rA  rQ  ru   r|   rb   ra   <module>r`     s3    
			                       6 6 6 6 6 6 6 6 4 4 4 4 4 4 0 0 0 0 0 0       7??27??844557<<$//W\\(D(33
 

 7 7 9 9Dffu	E	E v        8   () () () () ()29 () () ()V8( 8( 8(v-P -P -P -P`f( f( f( f(R0A 0A 0Af# # #L/ / /d zDFFFFF rb   