{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":59093,"databundleVersionId":7469972,"sourceType":"competition"},{"sourceId":154204277,"sourceType":"kernelVersion"},{"sourceId":155730565,"sourceType":"kernelVersion"}],"dockerImageVersionId":30635,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"The competition [HMS - Harmful Brain Activity Classification](https://www.kaggle.com/competitions/hms-harmful-brain-activity-classification) uses the [Kullback Leibler Divergence](https://www.kaggle.com/code/metric/kullback-leibler-divergence) as metric. We demonstrate how to import the metric in a notebook.","metadata":{}},{"cell_type":"markdown","source":"# Assumption","metadata":{}},{"cell_type":"markdown","source":"- Add data [Kullback Leibler Divergence](https://www.kaggle.com/code/metric/kullback-leibler-divergence).\n- Add utility script [kaggle_metric_utilities](https://www.kaggle.com/code/metric/kaggle-metric-utilities) (dependency).","metadata":{}},{"cell_type":"markdown","source":"# Import metric","metadata":{}},{"cell_type":"markdown","source":"The metric script is already in a module path, so we can simply import it.","metadata":{}},{"cell_type":"code","source":"import metric","metadata":{"execution":{"iopub.status.busy":"2024-01-24T01:43:54.792304Z","iopub.execute_input":"2024-01-24T01:43:54.792801Z","iopub.status.idle":"2024-01-24T01:43:55.350301Z","shell.execute_reply.started":"2024-01-24T01:43:54.792752Z","shell.execute_reply":"2024-01-24T01:43:55.348667Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(metric.__file__)","metadata":{"execution":{"iopub.status.busy":"2024-01-24T01:43:55.352688Z","iopub.execute_input":"2024-01-24T01:43:55.353325Z","iopub.status.idle":"2024-01-24T01:43:55.360222Z","shell.execute_reply.started":"2024-01-24T01:43:55.353282Z","shell.execute_reply":"2024-01-24T01:43:55.358938Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sys\nprint(sys.path)","metadata":{"execution":{"iopub.status.busy":"2024-01-24T01:43:55.361974Z","iopub.execute_input":"2024-01-24T01:43:55.362430Z","iopub.status.idle":"2024-01-24T01:43:55.374773Z","shell.execute_reply.started":"2024-01-24T01:43:55.362367Z","shell.execute_reply":"2024-01-24T01:43:55.373724Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"help(metric.score)","metadata":{"execution":{"iopub.status.busy":"2024-01-24T01:43:55.377461Z","iopub.execute_input":"2024-01-24T01:43:55.378570Z","iopub.status.idle":"2024-01-24T01:43:55.390331Z","shell.execute_reply.started":"2024-01-24T01:43:55.378511Z","shell.execute_reply":"2024-01-24T01:43:55.388731Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Remarks","metadata":{}},{"cell_type":"code","source":"import pandas as pd","metadata":{"execution":{"iopub.status.busy":"2024-01-24T01:47:27.680055Z","iopub.execute_input":"2024-01-24T01:47:27.680519Z","iopub.status.idle":"2024-01-24T01:47:27.687291Z","shell.execute_reply.started":"2024-01-24T01:47:27.680484Z","shell.execute_reply":"2024-01-24T01:47:27.685399Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"`metric.score` is destructive.","metadata":{}},{"cell_type":"code","source":"solution = pd.DataFrame({'id': range(3), 'ham': [0, 0.5, 0.5], 'spam': [0.1, 0.5, 0.5], 'other': [0.9, 0, 0]})\nsubmission = pd.DataFrame({'id': range(3), 'ham': [0.2, 0.3, 0.5], 'spam': [0.1, 0.5, 0.5], 'other': [0.7, 0.2, 0]})\nprint('before score call')\nprint(solution)\nprint('score(solution, submission)', metric.score(solution, submission, 'id'))\nprint('after score call')\nprint(solution)","metadata":{"execution":{"iopub.status.busy":"2024-01-24T01:51:41.494432Z","iopub.execute_input":"2024-01-24T01:51:41.494926Z","iopub.status.idle":"2024-01-24T01:51:41.530479Z","shell.execute_reply.started":"2024-01-24T01:51:41.494887Z","shell.execute_reply":"2024-01-24T01:51:41.528826Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The Kullback-Leibler divergence is not symmetric.","metadata":{}},{"cell_type":"code","source":"solution = pd.DataFrame({'id': range(3), 'ham': [0, 0.5, 0.5], 'spam': [0.1, 0.5, 0.5], 'other': [0.9, 0, 0]})\nsubmission = pd.DataFrame({'id': range(3), 'ham': [0.2, 0.3, 0.5], 'spam': [0.1, 0.5, 0.5], 'other': [0.7, 0.2, 0]})\nprint('score(solution, submission)', metric.score(solution.copy(), submission.copy(), 'id'))\nprint('score(submission, solution)', metric.score(submission.copy(), solution.copy(), 'id'))","metadata":{"execution":{"iopub.status.busy":"2024-01-24T01:48:56.114203Z","iopub.execute_input":"2024-01-24T01:48:56.115182Z","iopub.status.idle":"2024-01-24T01:48:56.168675Z","shell.execute_reply.started":"2024-01-24T01:48:56.115122Z","shell.execute_reply":"2024-01-24T01:48:56.166771Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}