{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Neural Network Starter for NCAA March Madness\n![](https://upload.wikimedia.org/wikipedia/en/thumb/2/28/March_Madness_logo.svg/440px-March_Madness_logo.svg.png)\n#### Credits - [https://www.kaggle.com/hiromoon166/2020-women-s-starter-kernel](https://www.kaggle.com/hiromoon166/2020-women-s-starter-kernel)"},{"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)\n\nimport tensorflow as tf\nfrom sklearn.utils import shuffle","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Reading .csv Files\n* Compact Results - Winner/Loser, Points, etc\n* Seeds - A seed is a competitor or team in a sport or other tournament who is given a preliminary ranking for the purposes of the draw.\n* Season Results - Total Points throughout the seasons"},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"res = pd.read_csv('../input/google-cloud-ncaa-march-madness-2020-division-1-womens-tournament/WDataFiles_Stage1/WNCAATourneyCompactResults.csv')\nseed = pd.read_csv('../input/google-cloud-ncaa-march-madness-2020-division-1-womens-tournament/WDataFiles_Stage1/WNCAATourneySeeds.csv')\n\nseason_res = pd.read_csv('../input/google-cloud-ncaa-march-madness-2020-division-1-womens-tournament/WDataFiles_Stage1/WRegularSeasonCompactResults.csv')\n\ntest = pd.read_csv('../input/google-cloud-ncaa-march-madness-2020-division-1-womens-tournament/WSampleSubmissionStage1_2020.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"season_res.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Utility function for preprocessing\n1. Match Teams with their respective seed\n2. Match Teams with their season scores"},{"metadata":{"trusted":true},"cell_type":"code","source":"def prepare(df, seed, season_score):\n    merged = pd.merge(df, seed, left_on = ['Season', 'WTeamID'], right_on = ['Season', 'TeamID'], how = 'left')\n    merged.rename(columns = {'Seed':'WSeed'}, inplace = True)\n    merged.drop(['TeamID'], axis = 1, inplace = True)\n    merged = pd.merge(merged, seed, left_on = ['Season', 'LTeamID'], right_on = ['Season', 'TeamID'], how = 'left')\n    merged.rename(columns = {'Seed':'LSeed'}, inplace = True)\n    merged.drop(['TeamID'], axis = 1, inplace = True)\n    \n    merged['WSeed'] = merged['WSeed'].apply(lambda x: int(x[1:3]))\n    merged['LSeed'] = merged['LSeed'].apply(lambda x: int(x[1:3]))\n    \n    merged = pd.merge(merged, season_score, left_on = ['Season', 'WTeamID'], right_on = ['Season', 'TeamID'], how = 'left')\n    merged.rename(columns = {'Score':'WScoreT'}, inplace = True)\n    merged.drop(['TeamID'], axis = 1, inplace = True)\n    merged = pd.merge(merged, season_score, left_on = ['Season', 'LTeamID'], right_on = ['Season', 'TeamID'], how = 'left')\n    merged.rename(columns = {'Score':'LScoreT'}, inplace = True)\n    merged.drop(['TeamID'], axis = 1, inplace = True)\n    \n    return merged","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Drop irrelevant columns\nres.drop(['DayNum', 'NumOT', 'WLoc', 'WScore', 'LScore'], axis = 1, inplace = True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"season_res_w = season_res[['Season', 'WScore', 'WTeamID']]\nseason_res_l = season_res[['Season', 'LScore', 'LTeamID']]\nseason_res_w.rename(columns = {'WScore':'Score', 'WTeamID':'TeamID'}, inplace = True)\nseason_res_l.rename(columns = {'LScore':'Score', 'LTeamID':'TeamID'}, inplace = True)\nseason_res = pd.concat((season_res_w, season_res_l)).reset_index(drop = True)\nseason_score = season_res.groupby(['Season', 'TeamID']).sum().reset_index()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Extracting Season, Winning Team Id, Losing Team Id form test csv file\ntest['Season'] = test['ID'].map(lambda x: int(x[:4]))\ntest['WTeamID'] = test['ID'].map(lambda x: int(x[5:9]))\ntest['LTeamID'] = test['ID'].map(lambda x: int(x[10:14]))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Preprocessing"},{"metadata":{"trusted":true},"cell_type":"code","source":"df = prepare(res, seed, season_score)\ndf_test = prepare(test, seed, season_score)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.drop(['Season', 'WTeamID', 'LTeamID'], inplace = True, axis = 1)\ndf_test.drop(['ID', 'Season', 'WTeamID', 'LTeamID'], inplace = True, axis = 1)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Labelling Training Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"wins = df\nloss = wins.copy()\n\nloss['WSeed'] = wins['LSeed']\nloss['LSeed'] = wins['WSeed']\nloss['WScoreT'] = wins['LScoreT']\nloss['LScoreT'] = wins['WScoreT']\n\nwins['Margin'] = wins['WScoreT'] - wins['LScoreT']\nloss['Margin'] = loss['WScoreT'] - loss['LScoreT']\nwins['Margin_seed'] = wins['WSeed'] - wins['LSeed']\nloss['Margin_seed'] = loss['WSeed'] - loss['LSeed']\n\nwins['result'] = 1\nloss['result'] = 0\n\ntrain = pd.concat((wins, loss)).reset_index(drop = True)\nx_train = train.drop(['result'], axis = 1)\ny_train = train['result']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Shuffle to avoid bias\nfrom sklearn.utils import shuffle\nx_train, y_train = shuffle(x_train, y_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Extracting additionsl features\ndf_test['Margin'] = df_test['WScoreT'] - df_test['LScoreT']\ndf_test['Margin_seed'] = df_test['WSeed'] - df_test['LSeed']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_test.drop(['Pred'], axis = 1, inplace = True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Scaling Score data "},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\n\nscaler = StandardScaler()\n\nx_train['WScoreT'] = scaler.fit_transform(x_train['WScoreT'].to_numpy().reshape(-1, 1))\nx_train['LScoreT'] = scaler.fit_transform(x_train['LScoreT'].to_numpy().reshape(-1, 1))\n\ndf_test['WScoreT'] = scaler.fit_transform(df_test['WScoreT'].to_numpy().reshape(-1, 1))\ndf_test['LScoreT'] = scaler.fit_transform(df_test['LScoreT'].to_numpy().reshape(-1, 1))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = tf.keras.models.Sequential([ \n    tf.keras.layers.Dense(128, input_shape=(6,), activation='relu'),\n    tf.keras.layers.BatchNormalization(),\n    tf.keras.layers.Dropout(0.5),\n    tf.keras.layers.Dense(128, activation='relu'),\n    tf.keras.layers.BatchNormalization(),\n    tf.keras.layers.Dropout(0.5),\n    tf.keras.layers.Dense(128, activation='relu'),\n    tf.keras.layers.BatchNormalization(),\n    tf.keras.layers.Dropout(0.5),\n    tf.keras.layers.Dense(128, activation='relu'),\n    tf.keras.layers.BatchNormalization(),\n    tf.keras.layers.Dropout(0.5),\n    tf.keras.layers.Dense(128, activation='relu'),\n    tf.keras.layers.BatchNormalization(),\n    tf.keras.layers.Dropout(0.5),     \n    tf.keras.layers.Dense(1, activation='sigmoid')\n])\n\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(loss='binary_crossentropy',optimizer=tf.keras.optimizers.Adam(0.0001))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit(x_train, y_train,\n                    epochs=100,\n                    verbose=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Prediction\n\ny_test = model.predict(df_test)\n\nsub = pd.read_csv('../input/google-cloud-ncaa-march-madness-2020-division-1-womens-tournament/WSampleSubmissionStage1_2020.csv')\n\nsub['Pred'] = y_test\nsub['Pred'].hist()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sub.to_csv('submission.csv', index = False)","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":1}