{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":82611,"databundleVersionId":9553358,"sourceType":"competition"}],"dockerImageVersionId":30775,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!git clone https://github.com/yunsuxiaozi/Yunbase.git","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-02T13:02:34.010748Z","iopub.execute_input":"2024-12-02T13:02:34.011131Z","iopub.status.idle":"2024-12-02T13:02:35.747921Z","shell.execute_reply.started":"2024-12-02T13:02:34.011091Z","shell.execute_reply":"2024-12-02T13:02:35.746733Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip  download -r Yunbase/requirements.txt","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-02T13:02:35.749281Z","iopub.execute_input":"2024-12-02T13:02:35.749560Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q --requirement Yunbase/requirements.txt  \\\n--no-index --find-links file:.","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from Yunbase.baseline import Yunbase\n\n#necessary\nimport polars as pl#similar to pandas, but with better performance when dealing with large datasets.\nimport pandas as pd#read csv,parquet\nimport numpy as np#for scientific computation of matrices\n#models(lgb,xgb,cat)\nfrom  lightgbm import LGBMRegressor,LGBMClassifier,log_evaluation,early_stopping\nfrom catboost import CatBoostRegressor,CatBoostClassifier\nfrom xgboost import XGBRegressor,XGBClassifier\nfrom sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer#word2vec feature\nimport warnings#avoid some negligible errors\n#The filterwarnings () method is used to set warning filters, which can control the output method and level of warning information.\nwarnings.filterwarnings('ignore')\n\nimport random#provide some function to generate random_seed.\n#set random seed,to make sure model can be recurrented.\ndef seed_everything(seed):\n    np.random.seed(seed)#numpy's random seed\n    random.seed(seed)#python built-in random seed\nseed_everything(seed=2024)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train=pl.read_csv(\"/kaggle/input/brist1d/train.csv\")\ntrain=train.to_pandas()\ntest=pl.read_csv(\"/kaggle/input/brist1d/test.csv\")\ntest=test.to_pandas()\nprint(len(train),len(test))\ntrain.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#six float features\nfeats=['bg','insulin','hr','steps','cals','activity']\nts=['-5:55', '-5:50', '-5:45', '-5:40', '-5:35', '-5:30', '-5:25', '-5:20', '-5:15', '-5:10', '-5:05', '-5:00', '-4:55', '-4:50', '-4:45', '-4:40', '-4:35', '-4:30', '-4:25', '-4:20', '-4:15', '-4:10', '-4:05', '-4:00', '-3:55', '-3:50', '-3:45', '-3:40', '-3:35', '-3:30', '-3:25', '-3:20', '-3:15', '-3:10', '-3:05', '-3:00', '-2:55', '-2:50', '-2:45', '-2:40', '-2:35', '-2:30', '-2:25', '-2:20', '-2:15', '-2:10', '-2:05', '-2:00', '-1:55', '-1:50', '-1:45', '-1:40', '-1:35', '-1:30', '-1:25', '-1:20', '-1:15', '-1:10', '-1:05', '-1:00', '-0:55', '-0:50', '-0:45', '-0:40', '-0:35', '-0:30', '-0:25', '-0:20', '-0:15', '-0:10', '-0:05', '-0:00']\ndef get_more_data(df,timestep,mode='train'):#mode is train or test\n    full_data=[]\n    #12step is 1 hour.\n    for start in range(0,len(ts)-timestep-12):\n        end=start+timestep\n        target=end+12\n        #[start:end] target\n        hours_data=df[['p_num','time']+[f+ts[i]  for i in range(start,end) for f in feats]+['bg'+ts[target]]]\n        hours_data.columns=['p_num','time']+[f+str(i-start)  for i in range(start,end)for f in feats]+['bg+1:00']\n        hours_data=hours_data[~hours_data['bg+1:00'].isna()]\n        #get true time\n        hours_data['time']=hours_data['time']-pd.DateOffset(minutes=(len(ts)-end)*5)\n        hours_data['hour']=hours_data['time'].dt.hour\n        hours_data['minute']=hours_data['time'].dt.minute\n        hours_data['sin_hour']=np.sin(2*np.pi*hours_data['hour']/24)\n        hours_data['cos_hour']=np.cos(2*np.pi*hours_data['hour']/24)\n        hours_data['sin_halfday']=np.sin(2*np.pi*hours_data['hour']/12)\n        hours_data['cos_halfday']=np.cos(2*np.pi*hours_data['hour']/12)\n        \n        full_data.append(hours_data)\n    if mode=='test':\n        hours_data=df[['p_num','time']+[f+ts[i]  for i in range(len(ts)-timestep,len(ts)) for f in feats]]\n        hours_data.columns=['p_num','time']+[f+str(i-len(ts)+timestep)  for i in range(len(ts)-timestep,len(ts))for f in feats]\n        #get true time\n        hours_data['time']=hours_data['time']\n        hours_data['hour']=hours_data['time'].dt.hour\n        hours_data['minute']=hours_data['time'].dt.minute\n        hours_data['sin_hour']=np.sin(2*np.pi*hours_data['hour']/24)\n        hours_data['cos_hour']=np.cos(2*np.pi*hours_data['hour']/24)\n        hours_data['sin_halfday']=np.sin(2*np.pi*hours_data['hour']/12)\n        hours_data['cos_halfday']=np.cos(2*np.pi*hours_data['hour']/12)\n        \n        full_data.append(hours_data)\n    full_data=pd.concat(full_data).drop_duplicates()\n    return full_data.drop(['time'],axis=1)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def FE(df,mode='train',timestep=9):#mode='train' or 'test'\n    #mean_isnan is 0.98 ,id is useless.\n    print(\"< drop useless columns >\")\n    df.drop([c for c in df.columns if 'carbs' in c]+['id'],axis=1,inplace=True)\n\n    #nearest bgs' correlation is greater than 0.99.\n    print(\"< fillna >\")\n    bgs=[c for c in list(df.columns) if (c!='bg+1:00') and ('bg' in c)]\n    df[bgs] = df[bgs].fillna(method='ffill', axis=1)\n    df[bgs] = df[bgs].fillna(method='bfill', axis=1)\n\n    #long tail distribution\n    print(\"< log1p transform >\")\n    step_cols=[c for c in list(df.columns) if 'step' in c]\n    df[step_cols]=df[step_cols].fillna(50).astype(np.float32)\n    df[step_cols]=np.log1p(df[step_cols])\n\n    #transform None to np.nan.\n    print(\"< fix bug >\")\n    float_cols=[c for c in df.columns  for f in feats[:-1] if f in c]\n    df[float_cols]=df[float_cols].astype(np.float32)\n\n    print(\"< get more data >\")\n    df['time']=pd.to_datetime(df['time'])\n    df=get_more_data(df,timestep=timestep,mode=mode)\n    #p_num to int\n    df['p_num_int']=df['p_num'].apply(lambda x:int(x[1:])).astype(np.int8)\n    \n    float_cols=[col+str(ts) for ts in range(timestep) for col in ['bg','insulin','hr','steps','cals']]\n    df[float_cols]=df[float_cols].fillna(-1)\n\n    #activity to str then drop them.\n    print(\"< activity to str >\")\n    activity_cols=[c for c in list(df.columns) if 'activity' in c]\n    activity_feats=df[activity_cols].astype(str).replace('None','').values\n    df['activity_str']=[' '.join(activity_feats[i]) for i in range(len(activity_feats))]\n\n    print(\"< Z-score feature >\")\n    cols=['bg', 'insulin','steps','hr','cals']\n    for col in cols:\n        df[f'mean_pnum_{col}{timestep-1}']=df.groupby(['p_num'])[col+f\"{timestep-1}\"].transform('mean')\n        df[f'std_pnum_{col}{timestep-1}']=df.groupby(['p_num'])[col+f\"{timestep-1}\"].transform('std')\n        df[f'norm_pnum_{col}{timestep-1}']=(df[f'{col}{timestep-1}']-df[f'mean_pnum_{col}{timestep-1}'])/df[f'std_pnum_{col}{timestep-1}']\n        df[f'{col}{timestep-1}-{col}{timestep-2}']=df[f'{col}{timestep-1}']-df[f'{col}{timestep-2}']\n        df[f'{col}{timestep-1}+{col}{timestep-2}']=df[f'{col}{timestep-1}']+df[f'{col}{timestep-2}']\n        df[f'{col}{timestep-1}*{col}{timestep-2}']=df[f'{col}{timestep-1}']*df[f'{col}{timestep-2}']\n        df[f'{col}{timestep-1}/{col}{timestep-2}']=df[f'{col}{timestep-1}']/df[f'{col}{timestep-2}']\n    print(\"< cross feature >\")\n    cross=['bg', 'insulin','steps','hr','cals']\n    for i in range(len(cross)):\n        for j in range(i+1,len(cross)):\n            for k in [1,2,3]:\n                df[cross[i]+f\"{timestep-k}+\"+cross[j]+f\"{timestep-k}\"]=df[cross[i]+f\"{timestep-k}\"]+df[cross[j]+f\"{timestep-k}\"]\n                df[cross[i]+f\"{timestep-k}-\"+cross[j]+f\"{timestep-k}\"]=df[cross[i]+f\"{timestep-k}\"]-df[cross[j]+f\"{timestep-k}\"]\n                df[cross[i]+f\"{timestep-k}*\"+cross[j]+f\"{timestep-k}\"]=df[cross[i]+f\"{timestep-k}\"]*df[cross[j]+f\"{timestep-k}\"]\n                df[cross[i]+f\"{timestep-k}/\"+cross[j]+f\"{timestep-k}\"]=df[cross[i]+f\"{timestep-k}\"]/(df[cross[j]+f\"{timestep-k}\"]+1e-15)\n            df[cross[i]+f\"{timestep-1}-\"+cross[j]+f\"{timestep-1}-\"+cross[i]+f\"{timestep-2}-\"+cross[j]+f\"{timestep-2}\"]=\\\n            df[cross[i]+f\"{timestep-1}-\"+cross[j]+f\"{timestep-1}\"]-df[cross[i]+f\"{timestep-2}-\"+cross[j]+f\"{timestep-2}\"]\n    \n    \n    for col in ['bg', 'insulin','steps','hr','cals']:\n        for i in range(1,timestep):\n            df[col+f\"{i}\"+f\"-{col}{i-1}\"]=df[col+f\"{i}\"]-df[col+f\"{i-1}\"]\n    \n    #strong correlation between nearest columns\n    df.drop([f'bg{i}'for i in range(timestep) if i%2!=0],axis=1,inplace=True)\n    return df\n\ntrain=FE(train,mode='train')\ntest=FE(test,mode='test')\ntotal=pd.concat((train,test))\nprint(len(train),len(test),len(total))\ntest=total[total['bg+1:00'].isna()]\ntrain=total[~total['bg+1:00'].isna()]\nprint(len(train),len(test),len(total))\ntrain.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"yunbase=Yunbase(num_folds=10,\n                  models=[],\n                  FE=None,\n                  drop_cols=[],\n                  seed=2024,\n                  objective='regression',\n                  metric='rmse',\n                  nan_margin=0.95,\n                  group_col='p_num',\n                  target_col='bg+1:00',\n                  device='gpu',\n                  early_stop=250,\n                  use_high_corr_feat=False,\n                  text_cols=['activity_str'],\n                  word2vec_models=[(TfidfVectorizer(max_features=150,ngram_range=(1,2)),'activity_str','tfidf'),\n                                   (CountVectorizer(max_features=150,ngram_range=(3,4)),'activity_str','wordcnt')\n                                  ],\n               )\ncategory_cols=['activity0', 'activity1', 'activity2', 'activity3', 'activity4', 'activity5', 'activity6', 'activity7', 'activity8']\nyunbase.fit(train_path_or_file=train,category_cols=category_cols)\ntest_preds=yunbase.predict(test_path_or_file=test,weights=[5,2.5,2.5])\nyunbase.submit(submission_path_or_file='/kaggle/input/brist1d/sample_submission.csv',test_preds=test_preds)","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}