From 3e6ef8b540f20e72c9975c31a6d6bbe0986c8aa5 Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Sat, 5 Oct 2024 20:14:46 +0200 Subject: [PATCH] update batch training --- app/cron_ai_score.py | 96 +++++++++--------- .../__pycache__/score_model.cpython-310.pyc | Bin 4529 -> 4004 bytes app/ml_models/score_model.py | 34 ++----- 3 files changed, 56 insertions(+), 74 deletions(-) diff --git a/app/cron_ai_score.py b/app/cron_ai_score.py index f66126a..43f8b43 100644 --- a/app/cron_ai_score.py +++ b/app/cron_ai_score.py @@ -248,64 +248,62 @@ async def download_data(ticker, con, start_date, end_date, skip_downloading): pass -async def chunked_gather(tickers, con, start_date, end_date, skip_downloading, chunk_size=10): +async def chunked_gather(tickers, con, skip_downloading, chunk_size=10): + test_size = 0.2 + start_date = datetime(1995, 1, 1).strftime("%Y-%m-%d") + end_date = datetime.today().strftime("%Y-%m-%d") + df_train = pd.DataFrame() + df_test = pd.DataFrame() + # Helper function to divide the tickers into chunks def chunks(lst, size): for i in range(0, len(lst), size): yield lst[i:i+size] - results = [] + dfs = [] - for chunk in tqdm(chunks(tickers, chunk_size)): + for num, chunk in enumerate(tqdm(chunks(tickers, chunk_size))): # Create tasks for each chunk tasks = [download_data(ticker, con, start_date, end_date, skip_downloading) for ticker in chunk] # Await the results for the current chunk chunk_results = await asyncio.gather(*tasks) # Accumulate the results - results.extend(chunk_results) + dfs.extend(chunk_results) + + train_list = [] + test_list = [] + + for df in dfs: + try: + split_size = int(len(df) * (1 - test_size)) + train_data = df.iloc[:split_size] + test_data = df.iloc[split_size:] + + # Append to the lists + train_list.append(train_data) + test_list.append(test_data) + except: + pass + + # Concatenate all at once outside the loop + df_train = pd.concat(train_list, ignore_index=True) + df_test = pd.concat(test_list, ignore_index=True) + df_train = df_train.sample(frac=1).reset_index(drop=True) + df_test = df_test.sample(frac=1).reset_index(drop=True) + + print('======Warm Start Train Set Datapoints======') + print(f'Batch Training: {num}') + print(len(df_train)) + + predictor = ScorePredictor() + selected_features = [col for col in df_train if col not in ['price', 'date', 'Target']] #top_uncorrelated_features(df_train, top_n=200) + predictor.warm_start_training(df_train[selected_features], df_train['Target']) + predictor.evaluate_model(df_test[selected_features], df_test['Target']) + - return results - async def warm_start_training(tickers, con, skip_downloading): - start_date = datetime(1995, 1, 1).strftime("%Y-%m-%d") - end_date = datetime.today().strftime("%Y-%m-%d") - df_train = pd.DataFrame() - df_test = pd.DataFrame() - test_size = 0.2 - - dfs = await chunked_gather(tickers, con, start_date, end_date, skip_downloading, chunk_size=10) - - train_list = [] - test_list = [] - - for df in dfs: - try: - split_size = int(len(df) * (1 - test_size)) - train_data = df.iloc[:split_size] - test_data = df.iloc[split_size:] - - # Append to the lists - train_list.append(train_data) - test_list.append(test_data) - except: - pass - - # Concatenate all at once outside the loop - df_train = pd.concat(train_list, ignore_index=True) - df_test = pd.concat(test_list, ignore_index=True) - df_train = df_train.sample(frac=1).reset_index(drop=True) - df_test = df_test.sample(frac=1).reset_index(drop=True) - - print('======Warm Start Train Set Datapoints======') - print(len(df_train)) - - predictor = ScorePredictor() - selected_features = [col for col in df_train if col not in ['price', 'date', 'Target']] #top_uncorrelated_features(df_train, top_n=200) - #predictor.warm_start_training(df_train[selected_features], df_train['Target']) - predictor.batch_train_model(df_train[selected_features], df_train['Target'], batch_size=1000) - predictor.evaluate_model(df_test[selected_features], df_test['Target']) - - return predictor + + dfs = await chunked_gather(tickers, con, skip_downloading, chunk_size=50) async def fine_tune_and_evaluate(ticker, con, start_date, end_date, skip_downloading): try: @@ -328,7 +326,7 @@ async def fine_tune_and_evaluate(ticker, con, start_date, end_date, skip_downloa data = predictor.evaluate_model(test_data[selected_features], test_data['Target']) if len(data) != 0: - if data['precision'] >= 50 and data['accuracy'] >= 50 and data['accuracy'] < 100 and data['precision'] < 100 and data['f1_score'] > 50 and data['recall_score'] > 50 and data['roc_auc_score'] > 50: + if data['precision'] >= 50 and data['accuracy'] >= 50 and data['accuracy'] < 100 and data['precision'] < 100 and data['f1_score'] >= 50 and data['recall_score'] >= 50 and data['roc_auc_score'] >= 50: await save_json(ticker, data) print(f"Saved results for {ticker}") gc.collect() @@ -348,10 +346,10 @@ async def run(): if train_mode: # Warm start training - cursor.execute("SELECT DISTINCT symbol FROM stocks WHERE marketCap >= 1E9 AND symbol NOT LIKE '%.%' AND symbol NOT LIKE '%-%'") + cursor.execute("SELECT DISTINCT symbol FROM stocks WHERE marketCap >= 500E6 AND symbol NOT LIKE '%.%' AND symbol NOT LIKE '%-%'") warm_start_symbols = [row[0] for row in cursor.fetchall()] - print(f'Warm Start Training: {len(warm_start_symbols)}') - predictor = await warm_start_training(warm_start_symbols, con, skip_downloading) + print(f'Warm Start Training: Total Tickers {len(warm_start_symbols)}') + await warm_start_training(warm_start_symbols, con, skip_downloading) else: # Fine-tuning and evaluation for all stocks cursor.execute("SELECT DISTINCT symbol FROM stocks WHERE marketCap >= 500E6 AND symbol NOT LIKE '%.%'") diff --git a/app/ml_models/__pycache__/score_model.cpython-310.pyc b/app/ml_models/__pycache__/score_model.cpython-310.pyc index 30e3db846755c1fa797582c1f9f6d4db85f21699..129f98c6f0e93d83d6b7dd0092a13f5d18278f53 100644 GIT binary patch delta 1099 zcmZuw&1)1%6tAkO>F(*wbVkkOvSZem=w@P!>neV%!Nf1buY|>enia>^>LjD{Wpzi_ zWMUR3;7KLElV6a4B0&(vlLztR;YqV%iWjqk*@H|als(0iT^EC^r~i3n3pDP-<@dl7 z-j#{iK~puTgd1C>(Fjbx4GO~ufx5sIR}={=eZ zk2gI%`1e@QyI|pNVGYcS=FITjJ2YPQF3?e2;JHb1lK^`%hk?`B$ zv}}{sN9n+IIlrY1bzy3#5aa{xmi?iMF6nmE%?X_&il5Y-_+5exq{+bRcm^KCf8!hB zLwwinZlX64{7kT!;1_}@bmHry?xn>0)DR%1X>Um_Y*td4F`7i51Z^f^eHEt5&T4UZLyiXY0V z8;pd8_ea4Ge7%m;vQqWRp;0ZIzgYA_S**B9cMuW7I)_q?ma1XAste^{PA*m1JW1s* zltc6CXMqnbuM#=0y5j0m-VaC`W#$dGUshkxZTK6Iwom2Obw1~X=5 z!qrr_(9JNH>Pj3z!-Yj0@KO>F9z^i(Gpa=sA8Z*w~ysomgn>f>;`@gh$^JiYEr7bT%)=qTMGk`5DGBKUHLNTT2J&6@=36m#jUJm;)f((eSH>gr8B%69;L7G_0Yaz`;I>J(LD&E3<@PL ca`;}B(CWb|jTXJ#^f&rz;pU1~Y4Mfve^9*&4*&oF delta 1641 zcmZuxO>7%Q6yDi?uYcl{hy8_l39e4x0OieZT%Oq^OCvBCe#QsCi z%MJa<;!}7?wo(@*!Mz}?GXJg@pHKHu%UT#oV*}6%rh%UwFy1p?g9)VfaZq^CB1>%qH2#2B_UW_mPKp)n$6GSiPHeF2HwSHt6tvrS*+7`qZRAT77O?k zt{N>~4@5y5xNEH;5A`6nZVv{JT>4w%jf_YeRU*Bo?wH`C5t(nRPbfQ9ge!xw4P0oE1zcF*v%Y0S zR%BzZs8vGM?w$s;m{f}lphJ&MboW$0ri>dd%VhA>IpAoA}n$OeicY;ciBzPFM+HxoY-O1 zZ65A-J31QRFM(>Ou!JUEpLsl}2UWM+Y_xnPKppHK9vpf%87(ds(y`{VAT}Tyt1Q+U z_25A$`8-(TO9%@H-9^Ng5ipj8R1!pvnZz#w#7^Q%DXe!`oDSMh79O4)#;K$}N_F~H zY_Wh225Y569b=yi9*#X)8y;9o5~PH5E&7*19%60TY95jz1D~UfX^*R8T84DotK}wV zE1c1KSu}a^=zd=g+ud%g^36{EwS@jkJz%q<9WYurOyT?9B`(Lh-}Gpb*AK`j=tun~ zm7{kbLdzwzoZQ@B$BSnGoG(*cC2z