{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":112509,"databundleVersionId":14254895,"sourceType":"competition"},{"sourceId":13844899,"sourceType":"datasetVersion","datasetId":8772581},{"sourceId":284439334,"sourceType":"kernelVersion"}],"dockerImageVersionId":31193,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import CB2025\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\n\nimport pickle","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-12-07T19:06:54.653408Z","iopub.execute_input":"2025-12-07T19:06:54.653591Z","iopub.status.idle":"2025-12-07T19:07:12.893086Z","shell.execute_reply.started":"2025-12-07T19:06:54.653568Z","shell.execute_reply":"2025-12-07T19:07:12.892204Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"nepochs = 14\nmulticrop = 10\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-07T19:07:12.894984Z","iopub.execute_input":"2025-12-07T19:07:12.895291Z","iopub.status.idle":"2025-12-07T19:07:12.898755Z","shell.execute_reply.started":"2025-12-07T19:07:12.895271Z","shell.execute_reply":"2025-12-07T19:07:12.897999Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"img_dir = '/kaggle/input/csiro-biomass/'\n\nX = CB2025.dataprep.load_train(img_dir)\ncomp = CB2025.dataprep.load_comp(img_dir)\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-07T19:07:12.899589Z","iopub.execute_input":"2025-12-07T19:07:12.899833Z","iopub.status.idle":"2025-12-07T19:07:12.981929Z","shell.execute_reply.started":"2025-12-07T19:07:12.899810Z","shell.execute_reply":"2025-12-07T19:07:12.981191Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import GroupShuffleSplit\n\n# Split X into training and testing for model early stopping evaluation:\nix_tr, ix_te = next(GroupShuffleSplit(n_splits = 6, \n                                      random_state=CB2025.param.SEED).\\\n        split(X, groups=X['group_id']))\n\nXtr = X.iloc[ix_tr,:]\nXte = X.iloc[ix_te,:]\n\ny = X.iloc[:,-5:]\nytr = Xtr.iloc[:,-5:]\nyte = Xte.iloc[:,-5:]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-07T19:07:12.982688Z","iopub.execute_input":"2025-12-07T19:07:12.983020Z","iopub.status.idle":"2025-12-07T19:07:12.990491Z","shell.execute_reply.started":"2025-12-07T19:07:12.983003Z","shell.execute_reply":"2025-12-07T19:07:12.989595Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Fit to copies of higher-weighted target columns:\n\nm0 = CB2025.modelling.BaseModel(img_dir = img_dir,\n                                nepochs=nepochs,\n                                multicrop=multicrop,\n                                linear_features=750,\n                                augmentation_jitter_max = 0.15,\n                                target_cols = ['Dry_Clover_g', \n                                               'Dry_Dead_g', \n                                               'Dry_Green_g', \n                                               'Dry_Total_g', \n                                               'GDM_g'] + \\\n                                              ['GDM_g'] + \\\n                                              ['Dry_Total_g'] * 4,\n                                VERBOSE=True,\n                                ttm = True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-07T19:07:12.991362Z","iopub.execute_input":"2025-12-07T19:07:12.991630Z","iopub.status.idle":"2025-12-07T19:07:13.004250Z","shell.execute_reply.started":"2025-12-07T19:07:12.991604Z","shell.execute_reply":"2025-12-07T19:07:13.003705Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"m0.fit(Xtr, Xy_test = (Xte, yte))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-07T19:07:13.004957Z","iopub.execute_input":"2025-12-07T19:07:13.005186Z","iopub.status.idle":"2025-12-07T19:07:38.974571Z","shell.execute_reply.started":"2025-12-07T19:07:13.005171Z","shell.execute_reply":"2025-12-07T19:07:38.973903Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Save CV fitted model and test set indices/paths\nwith open(\"cv_model.pik\", \"wb\") as fid:\n    pickle.dump(m0, file=fid)\nXte['image_path'].to_csv('test_paths.csv', index=False)    \n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-07T19:09:24.984485Z","iopub.execute_input":"2025-12-07T19:09:24.985303Z","iopub.status.idle":"2025-12-07T19:09:25.203794Z","shell.execute_reply.started":"2025-12-07T19:09:24.985277Z","shell.execute_reply":"2025-12-07T19:09:25.202995Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Refit on entire datset:\n\nm0.fit(X)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-07T19:09:31.186530Z","iopub.execute_input":"2025-12-07T19:09:31.187247Z","iopub.status.idle":"2025-12-07T19:09:53.826936Z","shell.execute_reply.started":"2025-12-07T19:09:31.187224Z","shell.execute_reply":"2025-12-07T19:09:53.826265Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"with open(\"full_model.pik\", \"wb\") as fid:\n    pickle.dump(m0, file=fid)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-07T19:09:58.634345Z","iopub.execute_input":"2025-12-07T19:09:58.634647Z","iopub.status.idle":"2025-12-07T19:09:58.812762Z","shell.execute_reply.started":"2025-12-07T19:09:58.634623Z","shell.execute_reply":"2025-12-07T19:09:58.812123Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Since we have weighted sum columns by including copies, just take\n# the first 5 columns of predictions:\n\ncomp_preds = m0.predict(comp)[:,:5]","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Now reassemble into submission.csv\n\n\ncomp2 = comp.copy()\n\ncomp2.iloc[:,-5:] = comp_preds\n\nsub = pd.melt(comp2, id_vars='image_path')\n\nsub['sample_id'] = [f'{x[1].image_path[5:-4]}__{x[1].target_name}' for x in sub.iterrows()]\n\n\nsub2 = sub[['sample_id','value']]\n\nsub2.to_csv('submission.csv', index=False)","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}