{"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 matplotlib.pyplot as plt\n\n# from keras.models import Sequential\n# from keras.layers import Dense,Dropout,Conv2D,InputLayer,TimeDistributed,MaxPooling2D,Flatten\n# from keras.layers import LSTM\n\nfrom numpy import array\n#from keras.models import Sequential, load_model\nfrom tqdm import tqdm\nimport seaborn as sns\n\nimport lightgbm as lgb\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.model_selection import StratifiedKFold, KFold\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"train_df = pd.read_csv('../input/conways-reverse-game-of-life-2020/train.csv')\ntest_df = pd.read_csv(\"../input/conways-reverse-game-of-life-2020/test.csv\")\nprint(train_df.shape)\nprint(test_df.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_size = 300\ntrain = train_df.drop([\"id\",'delta'], axis=1)  #Let's drop delta first, And we will use it in the later version.\ntrain_x = train.iloc[:sample_size,625:].astype('int32') #Only use part of data for this demo. For quick update and modify.\ntrain_y = train.iloc[:sample_size,:625].astype('int32')\ntest = test_df.drop([\"id\",'delta'], axis=1)\ntest_x = test.iloc[:,:]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_x.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"view_size = 1\nsize = 25\n\nown_cell_pos = [[i//25,i%25] for i in range(625)]\nown_cell_pos_rec = [[pos[0] + size, pos[1] + size] for pos in own_cell_pos]\n\n#Get train obs\ntrain_sample = np.array(train_x.iloc[:sample_size,:]).reshape(sample_size,25,25)\ntile_obs_layer = np.tile(train_sample, [1, 3, 3])\nown_cell_obs_layer = [np.sum(np.array([tile_obs_layer[i,pos[0] - view_size: pos[0] + view_size + 1, pos[1] - view_size: pos[1] + view_size + 1] \n                                       for pos in own_cell_pos_rec]).reshape(625,9),axis=1) for i in range(sample_size)]\n\ndeltas = train_df['delta'][:sample_size].values\ndeltas_ = np.array([[delta]*625 for delta in deltas]).reshape(sample_size,625,1)\n\norigin_loc =  train_sample.reshape(sample_size,625,1)\nown_cell_obs_layer =  np.array(own_cell_obs_layer).reshape(sample_size,625,1)\n\ntrain_df = np.concatenate((own_cell_obs_layer,deltas_),axis=2).astype('int32')\ntrain_df = np.concatenate((train_df,origin_loc),axis=2).astype('int32')\nprint('train_set shape',train_df.shape)\ntrain_target = np.array(train_y)\n\n\n#Get test obs\ntest_set = np.array(test_x.iloc[:,:]).reshape(test_x.shape[0],25,25)\norigin_loc =  test_set.reshape(test_x.shape[0],625,1)\n\ntile_obs_layer = np.tile(test_set, [1, 3, 3])\nown_cell_obs_layer = [tile_obs_layer[:,pos[0] - view_size: pos[0] + view_size + 1, pos[1] - view_size: pos[1] + view_size + 1] for pos in own_cell_pos_rec]\nown_cell_obs_layer = [np.sum(np.array([tile_obs_layer[i,pos[0] - view_size: pos[0] + view_size + 1, pos[1] - view_size: pos[1] + view_size + 1] \n                                       for pos in own_cell_pos_rec]).reshape(625,9),axis=1) for i in range(test_x.shape[0])]\ndeltas = test_df['delta'][:].values\ndeltas_ = np.array([[delta]*625 for delta in deltas]).reshape(test_x.shape[0],625,1)\n\nown_cell_obs_layer =np.array(own_cell_obs_layer).reshape(test_x.shape[0],625,1)\ntest_df = np.concatenate((own_cell_obs_layer,deltas_),axis=2).astype('int32')\ntest_df = np.concatenate((test_df,origin_loc),axis=2).astype('int32')\n\nprint('test_set shape',test_df.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"del own_cell_obs_layer,deltas_","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(train_target.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"num_folds = 5\nfeatures = ['round_num','delta','origin']\nprint('Features:',features)\nfolds = KFold(n_splits=num_folds, random_state=2020)\noof = np.zeros(sample_size*625)\ngetVal = np.zeros(sample_size*625)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.DataFrame(train_df.reshape(sample_size*625,3)).astype('int32')\ntrain_df.columns = features\n\ntest_df = pd.DataFrame(test_df.reshape(test_df.shape[0]*625,3)).astype('int32')\ntest_df.columns = features\n\ntarget_df = pd.DataFrame(train_target.reshape(sample_size*625,1)).astype('int32')\ntarget_df.columns = ['start']\n\npredictions = np.zeros(test_df.shape[0])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"param = {\n    'bagging_freq': 5,\n    'bagging_fraction': 0.335,\n    'boost_from_average':'false',\n    'boost': 'gbdt',\n    'feature_fraction': 0.041,\n    'learning_rate': 0.0083,\n    'max_depth': -1,\n    'metric':{'binary_logloss', 'mae'},\n    'min_data_in_leaf': 80,\n    'min_sum_hessian_in_leaf': 10.0,\n    'num_leaves': 13,\n    'num_threads': 8,\n    'tree_learner': 'serial',\n    'objective': 'binary', \n    'verbosity': -1\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# cat_feature = ['delta']\n# train_df[cat_feature[0]] = train_df[cat_feature[0]].astype('category')\n# test_df[cat_feature[0]] = test_df[cat_feature[0]].astype('category')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# features = ['locate_1','locate_3','locate_4','locate_5','locate_7','delta']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for fold_, (trn_idx, val_idx) in enumerate(folds.split(train_df.values, target_df.values)):\n    \n    X_train, y_train = train_df.iloc[trn_idx][features].astype('int32'), target_df.iloc[trn_idx].astype('int32')\n    X_valid, y_valid = train_df.iloc[val_idx][features], target_df.iloc[val_idx].astype('int32')\n    \n    X_tr, y_tr = X_train.values,[i[0] for i in y_train.values]\n    X_tr = pd.DataFrame(X_tr)\n    \n    X_tr.columns = X_train.columns\n    #cat\n    #X_tr[cat_feature[0]] = X_tr[cat_feature[0]].astype('category')\n    print(\"Fold idx:{}\".format(fold_ + 1))\n    trn_data = lgb.Dataset(X_tr, label=y_tr)\n    val_data = lgb.Dataset(X_valid, label=y_valid)\n    \n    clf = lgb.train(param, trn_data, 5000, valid_sets = [trn_data, val_data], verbose_eval=1000, early_stopping_rounds = 100)\n    oof[val_idx] = clf.predict(train_df.iloc[val_idx][features], num_iteration=clf.best_iteration)\n    getVal[val_idx]+= clf.predict(train_df.iloc[val_idx][features], num_iteration=clf.best_iteration) / folds.n_splits\n    \n    predictions += clf.predict(test_df[features], num_iteration=clf.best_iteration) / folds.n_splits","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# print()\nprint(np.median(predictions))\nprint(np.percentile(predictions,94))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"threshold = np.percentile(predictions,94)\nresult = [1 if pred > threshold else 0 for pred in predictions]\nprint(predictions[:10])\nsubmit = pd.read_csv(\"../input/conways-reverse-game-of-life-2020/sample_submission.csv\")\n\nids = submit.iloc[:,0].values\nids = ids.reshape(ids.shape[0],1)\n\nsub = np.array(result).reshape(test_x.shape[0],test_x.shape[1])\nsub = np.hstack((ids,sub))\n\nsubmission = pd.DataFrame(sub)\nsubmission.columns = submit.columns[:]\nsubmission.index = submit.index\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.imshow(submission.iloc[0,1:].values.reshape(25,25))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.imshow(test_x.iloc[0,:].values.reshape(25,25))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"\\n >> CV score: {:<8.5f}\".format(roc_auc_score(target_df, oof)))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission.to_csv('submission.csv',index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}