{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport random\nfrom sklearn.metrics import log_loss\nimport lightgbm as lgb","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"dt = {'WTeamID':'str', 'LTeamID':'str'}\ninp = '../input/google-cloud-ncaa-march-madness-2020-division-1-mens-tournament/'\nss = pd.read_csv(inp+'MSampleSubmissionStage1_2020.csv')\nsd = pd.read_csv(inp+'MDataFiles_Stage1/MRegularSeasonCompactResults.csv',dtype=dt)\ntd = pd.read_csv(inp+'MDataFiles_Stage1/MNCAATourneyCompactResults.csv',dtype=dt)\nts = pd.read_csv(inp+'MDataFiles_Stage1/MNCAATourneySeeds.csv',dtype={'TeamID':'str'})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ts['Seed'] = ts['Seed'].map(lambda s: s.replace('b',''))\nts['Seed'] = ts['Seed'].map(lambda s: s.replace('a',''))\nts['Seed'] = ts['Seed'].map(lambda s: s[1:])\nts","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sd['DScore'] = sd['WScore'] - sd['LScore']\nsd","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for i in range(len(td.index)):\n    \n    if random.choices([0,1]) == [1]:\n        td.at[i, 'Team1'] = td.at[i, 'WTeamID']\n        td.at[i, 'Team2'] = td.at[i, 'LTeamID']\n        td.at[i, 'target'] = 1.0\n    else:\n        td.at[i, 'Team1'] = td.at[i, 'LTeamID']\n        td.at[i, 'Team2'] = td.at[i, 'WTeamID']\n        td.at[i, 'target'] = 0.0\ntd","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ss['Team1'] = ss['ID'].map(lambda s: s[5:9])\nss['Team2'] = ss['ID'].map(lambda s: s[10:])\nss['Season'] = ss['ID'].map(lambda s: s[:4])\nss","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cache = {}\n\ndef cacher(season, team):\n    \n    if (season, team) in cache.keys():\n        return\n    \n    t_w = sd.loc[(sd['Season']==season)&(sd['WTeamID']==team),'DScore']\n    t_l = sd.loc[(sd['Season']==season)&(sd['LTeamID']==team),'DScore']\n    t_wc = len(t_w.index)\n    t_lc = len(t_l.index)\n    t_ws = t_w.sum()\n    t_ls = t_l.sum()\n    \n    cache[(season, team)] = {}\n    cache[(season, team)]['WinRate'] = t_wc / (t_wc+t_lc)\n    cache[(season, team)]['ScoreDiff'] = t_ws - t_ls\n    cache[(season, team)]['Seed'] = int(ts.loc[(ts['Season']==season)&(ts['TeamID']==team),'Seed'].any())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def feat(df):\n    \n    for i in range(len(df.index)):\n        \n        season = int(df.at[i, 'Season'])\n        team1 = df.at[i, 'Team1']\n        team2 = df.at[i, 'Team2']\n        \n        cacher(season, team1)\n        cacher(season, team2)\n        \n        df.at[i, 'T1WinRate'] = cache[(season, team1)]['WinRate']\n        df.at[i, 'T2WinRate'] = cache[(season, team2)]['WinRate']\n    \n        df.at[i, 'T1ScoreDiff'] = cache[(season, team1)]['ScoreDiff']\n        df.at[i, 'T2ScoreDiff'] = cache[(season, team2)]['ScoreDiff']\n    \n        df.at[i, 'T1Seed'] = cache[(season, team1)]['Seed']\n        df.at[i, 'T2Seed'] = cache[(season, team2)]['Seed']\n    \n    return df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"td = feat(td)\nss = feat(ss)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_tt(df, test_season):\n    \n    train_df = df.loc[df['Season']!=test_season, cols+['target']]\n    test_df = df.loc[df['Season']==test_season, cols+['target']]\n    \n    return train_df, test_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cols = ['T1ScoreDiff','T2ScoreDiff','T1WinRate','T2WinRate','T1Seed','T2Seed']\n\nparams = {'metric':'binary_logloss','learning_rate':0.001,'min_data_in_leaf':12,'num_leaves':31}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"gloss = 0\nseasons = [2015, 2016, 2017, 2018, 2019]\n\nfor season in seasons:\n    train, test = get_tt(td, season)\n    \n    model = lgb.train(params, lgb.Dataset(train.drop('target', axis=1), train['target']), num_boost_round=5000)\n    pred = model.predict(test.drop('target', axis=1))\n    \n    loss = log_loss(test['target'], pred)\n    print(season, loss)\n    gloss += loss\n\nprint('average', gloss/len(seasons))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"pred = model.predict(ss[cols])\nss['Pred'] = pred.clip(0, 1)\nss.to_csv('submission.csv', columns=['ID','Pred'], index=None)\nss","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}