{"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":"none","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"},{"sourceId":213169289,"sourceType":"kernelVersion"}],"dockerImageVersionId":30786,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"source_file_path = '/kaggle/input/yunbase/Yunbase/baseline.py'\ntarget_file_path = '/kaggle/working/baseline.py'\nwith open(source_file_path, 'r', encoding='utf-8') as file:\n    content = file.read()\nwith open(target_file_path, 'w', encoding='utf-8') as file:\n    file.write(content)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q --requirement /kaggle/input/yunbase/Yunbase/requirements.txt  \\\n--no-index --find-links file:/kaggle/input/yunbase/","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from baseline import Yunbase\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\nfrom  lightgbm import LGBMRegressor\nfrom sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer#word2vec feature\n#gene(topic) similarity   \nfrom gensim.models import Word2Vec\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=pd.read_csv(\"/kaggle/input/child-mind-institute-problematic-internet-use/train.csv\")\ntrain=train[~train['sii'].isna()]\ntest=pd.read_csv(\"/kaggle/input/child-mind-institute-problematic-internet-use/test.csv\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"colnotintest=[col for col in train.columns if col not in test.columns and col!='sii']\ndef FE(df):\n    #useless\n    df.drop(['id']+colnotintest,axis=1,inplace=True,errors='ignore')\n    print(\"< season str feature >\")\n    seasons_cols=['Basic_Demos-Enroll_Season','CGAS-Season','Physical-Season',\n                  'Fitness_Endurance-Season','FGC-Season','BIA-Season','PAQ_A-Season',\n                  'PAQ_C-Season','SDS-Season','PreInt_EduHx-Season']\n    seasons=df[seasons_cols].values.astype(str)\n    season_str=[]\n    for i in range(len(seasons)):\n        season_str.append(\" \".join(seasons[i]))\n    df['season_str']=season_str\n    return df\ntrain=FE(train)\ntest=FE(test)\ntrain['sii']=train['sii'].astype(np.float32)\ntrain['weight']=train['sii'].values+1\ntrain.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#weighted kappa的手写\ndef custom_metric(y_true,y_pred):\n    #y_true是label,y_pred是我的预测结果\n    #y_true为0,1,2,……,i,所以类别数为i+1\n    N=int(np.max(y_true)+1)\n    #混淆矩阵 真实值为i预测为j的count\n    O=np.zeros((N,N))\n    for i in range(len(y_true)):\n        O[y_true[i]][y_pred[i]]+=1\n    #W权重系数\n    W=np.zeros((N,N))\n    for i in range(N):\n        for j in range(N):\n            W[i][j]=(i-j)**2/(N-1)**2\n    #E\n    true_count=np.zeros(N)\n    pred_count=np.zeros(N)\n    for i in range(len(y_true)):\n        true_count[y_true[i]]+=1\n        pred_count[y_pred[i]]+=1\n    \n    E=np.zeros((N,N))\n    for i in range(len(true_count)):\n        for j in range(len(pred_count)):\n            E[i][j]=true_count[i]*pred_count[j]\n            \n    O=O/O.sum()\n    E=E/E.sum()\n    \n    weighted_kappa=1-np.sum(W*O)/np.sum(W*E)\n    \n    return weighted_kappa\n\nyunbase=Yunbase(      \n                      num_folds=10,\n                      n_repeats=1,\n                      models=[(LGBMRegressor(n_estimators=256),'lgb')],\n                      FE=None,\n                      drop_cols=[],\n                      seed=2024,\n                      objective='regression',\n                      metric='rmse',\n                      nan_margin=0.95,\n                      group_col=None,\n                      target_col='sii',\n                      save_oof_preds=True,\n                      save_test_preds=False,\n                      device='cpu',\n                      one_hot_max=10,\n                      early_stop=250,\n                      text_cols=['season_str'],\n                      word2vec_models=[\n                                       (Word2Vec(vector_size=256, window=3, min_count=2, workers=16),'season_str','word2vec'),\n                                       (TfidfVectorizer(analyzer='word',max_features=300,ngram_range=(1,4)),'season_str','tfidf'),\n                                       (CountVectorizer(analyzer='char',max_features=300,ngram_range=(4,8)),'season_str','cnt')\n                                       ],\n                      use_data_augmentation=True,\n                      use_eval_metric=False,\n                      use_pseudo_label=True,\n                      use_high_corr_feat=False,\n                      plot_feature_importance=True,\n)\n\nyunbase.fit(train)\n#add test_preds to testset.\ntest_preds=yunbase.predict(test.copy())\n\nyunbase.submit(submission_path_or_file='/kaggle/input/child-mind-institute-problematic-internet-use/sample_submission.csv',save_name='submission',test_preds=test_preds)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"oofs_0,oofs_1,oofs_2=[],[],[]\nfor repeat  in range(yunbase.n_repeats):\n    oof_preds=np.load(yunbase.model_save_path+f\"lgb_seed{yunbase.seed}_repeat{repeat}_fold{yunbase.num_folds}.npy\")\n    sort_oof=sorted(oof_preds)\n    ##distribution  0.5826,0.8494,0.9875\n    oof_0=sort_oof[int(len(oof_preds)*0.5826)]\n    oof_1=sort_oof[int(len(oof_preds)*0.8494)]\n    oof_2=sort_oof[int(len(oof_preds)*0.9875)]\n    oof_preds_class=np.zeros(len(oof_preds))\n    oof_preds_class[np.where(oof_preds>=oof_0)[0]]=1\n    oof_preds_class[np.where(oof_preds>=oof_1)[0]]=2\n    oof_preds_class[np.where(oof_preds>=oof_2)[0]]=3\n    print(oof_0,oof_1,oof_2)\n    print(custom_metric(yunbase.target.astype(np.int8),oof_preds_class.astype(np.int8)))\n    oofs_0.append(oof_0)\n    oofs_1.append(oof_1)\n    oofs_2.append(oof_2)\noof_0,oof_1,oof_2=np.mean(oofs_0),np.mean(oofs_1),np.mean(oofs_2)\ntest_preds_class=np.zeros(len(test_preds))\ntest_preds_class[np.where(test_preds>=oof_0)[0]]=1\ntest_preds_class[np.where(test_preds>=oof_1)[0]]=2\ntest_preds_class[np.where(test_preds>=oof_2)[0]]=3\nsubmission=pd.read_csv(\"/kaggle/input/child-mind-institute-problematic-internet-use/sample_submission.csv\")\nsubmission['sii']=test_preds_class.astype(np.int8)\nsubmission.to_csv(\"submission.csv\",index=None)\nsubmission.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}