{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Install Required Packages","metadata":{"id":"o7byPYKN3oZW"}},{"cell_type":"code","source":"! pip install nb_black sentence-transformers faiss-gpu h3 > /dev/null","metadata":{"execution":{"iopub.status.busy":"2022-07-11T00:03:35.274897Z","iopub.execute_input":"2022-07-11T00:03:35.275725Z","iopub.status.idle":"2022-07-11T00:03:57.753071Z","shell.execute_reply.started":"2022-07-11T00:03:35.275634Z","shell.execute_reply":"2022-07-11T00:03:57.751912Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!nvidia-smi","metadata":{"id":"tDnP7Pt2X551","outputId":"aa38710b-f676-4e55-d988-01212edf785d","execution":{"iopub.status.busy":"2022-07-11T00:03:57.755453Z","iopub.execute_input":"2022-07-11T00:03:57.756087Z","iopub.status.idle":"2022-07-11T00:03:58.464344Z","shell.execute_reply.started":"2022-07-11T00:03:57.756044Z","shell.execute_reply":"2022-07-11T00:03:58.463274Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import math\nimport pathlib\nimport unicodedata as ud\n\nfrom enum import Enum\nfrom functools import partial\nfrom sys import getsizeof\n\nimport faiss\nimport h3\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom humanize import naturalsize\n\nimport pyarrow.parquet as pq\nimport pyarrow as pa\nimport sentence_transformers\n\nfrom numpy import sin, cos, deg2rad, rad2deg\nfrom numpy.linalg import inv\nfrom pandas import CategoricalDtype\nfrom sentence_transformers import SentenceTransformer\nfrom sklearn.metrics.pairwise import haversine_distances\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.neighbors import KNeighborsRegressor\nfrom tqdm.auto import tqdm\n\npd.set_option(\"max_colwidth\", 900)\npd.set_option(\"max_rows\", 100)\nplt.style.use(\"ggplot\")\n\n\n%load_ext lab_black","metadata":{"id":"ce3eb2d4","execution":{"iopub.status.busy":"2022-07-11T00:03:58.467407Z","iopub.execute_input":"2022-07-11T00:03:58.467707Z","iopub.status.idle":"2022-07-11T00:04:06.366702Z","shell.execute_reply.started":"2022-07-11T00:03:58.467677Z","shell.execute_reply":"2022-07-11T00:04:06.365784Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CFG:\n    H3_COL = \"h3_res1\"\n    MODELS = {\n        \"stsb-xlm-r-multilingual\": \"sentence-transformers/stsb-xlm-r-multilingual\",\n        \"all-mpnet-base-v2\": \"sentence-transformers/all-mpnet-base-v2\",\n        \"all-distilroberta-v1\": \"sentence-transformers/all-distilroberta-v1\",\n        \"all-MiniLM-L6-v2\": \"sentence-transformers/all-MiniLM-L6-v2\",\n        \"all-MiniLM-L12-v2\": \"sentence-transformers/all-MiniLM-L12-v2\",\n    }\n    MODEL_KEY = \"all-MiniLM-L6-v2\"\n    EMBEDDING_KEYS = [\"name\", \"categories\"]\n    EMBEDDING_MODEL = MODELS[MODEL_KEY]\n    RANDOM_SEED = 1234\n    ALPHA = 0.3","metadata":{"id":"2sh0oaGWpA1y","execution":{"iopub.status.busy":"2022-07-11T00:04:06.369626Z","iopub.execute_input":"2022-07-11T00:04:06.369955Z","iopub.status.idle":"2022-07-11T00:04:06.382954Z","shell.execute_reply.started":"2022-07-11T00:04:06.369919Z","shell.execute_reply":"2022-07-11T00:04:06.382070Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ntrain = pd.read_csv(f\"../input/foursquare-location-matching/train.csv\")\nh3_df = pq.read_table(f\"../input/4sq-h3/h3.parquet\").to_pandas()\ntrain = train.merge(h3_df, on=\"id\")\ndel h3_df","metadata":{"id":"lMRmvhFzCIBz","outputId":"6b4d944e-676f-4060-f5d9-f45c9723c8a2","execution":{"iopub.status.busy":"2022-07-11T00:04:06.384382Z","iopub.execute_input":"2022-07-11T00:04:06.385021Z","iopub.status.idle":"2022-07-11T00:04:17.273115Z","shell.execute_reply.started":"2022-07-11T00:04:06.384967Z","shell.execute_reply":"2022-07-11T00:04:17.272035Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def drop_na(df, cols):\n    print(f\"drop NaN {cols}:\")\n    df = df.dropna(subset=cols)\n    return df","metadata":{"id":"jDz_lta7mkcc","execution":{"iopub.status.busy":"2022-07-11T00:04:17.274633Z","iopub.execute_input":"2022-07-11T00:04:17.274978Z","iopub.status.idle":"2022-07-11T00:04:17.283673Z","shell.execute_reply.started":"2022-07-11T00:04:17.274932Z","shell.execute_reply":"2022-07-11T00:04:17.281907Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def normalize(df, cols):\n    print(f\"normalize: {cols}\")\n    df = df.copy()\n    for col in cols:\n        ser = df[col]\n        ser = ser.str.lower()\n        ser = ser.str.replace(\"\\s\", \" \", regex=True)\n        ser = ser.str.replace(\" +\", \" \", regex=True)\n        ser = ser.str.replace(\"^ $\", \"\", regex=True)\n        df[f\"{col}\"] = ser\n\n        print(f\"  #blank rows in {col}: {len(df[df[col] == '']):,}\")\n    return df","metadata":{"id":"0ec15018","execution":{"iopub.status.busy":"2022-07-11T00:04:17.285162Z","iopub.execute_input":"2022-07-11T00:04:17.285737Z","iopub.status.idle":"2022-07-11T00:04:17.307900Z","shell.execute_reply.started":"2022-07-11T00:04:17.285702Z","shell.execute_reply":"2022-07-11T00:04:17.306918Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def fill_na(df, cols):\n    df = df.copy()\n    df[cols] = df[cols].fillna(\"\")\n    return df","metadata":{"id":"c3183319","execution":{"iopub.status.busy":"2022-07-11T00:04:17.309373Z","iopub.execute_input":"2022-07-11T00:04:17.309998Z","iopub.status.idle":"2022-07-11T00:04:17.323780Z","shell.execute_reply.started":"2022-07-11T00:04:17.309902Z","shell.execute_reply":"2022-07-11T00:04:17.322872Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def drop_duplicated(df, cols):\n    print(f\"drop duplicated {cols}:\")\n    print(f\"  #locations before: {len(df):,}\")\n    df = df.drop_duplicates(cols)\n    print(f\"  #locations after: {len(df):,}\")\n    return df","metadata":{"id":"5e0GkjaLh-RW","execution":{"iopub.status.busy":"2022-07-11T00:04:17.324905Z","iopub.execute_input":"2022-07-11T00:04:17.325380Z","iopub.status.idle":"2022-07-11T00:04:17.338136Z","shell.execute_reply.started":"2022-07-11T00:04:17.325344Z","shell.execute_reply":"2022-07-11T00:04:17.337138Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def drop_single_poi(df):\n    print(\"drop single POI:\")\n    poi_df = df.groupby(\"point_of_interest\").agg(count=(\"id\", \"count\")).reset_index()\n    print(f\"  #POIs before: {len(poi_df):,}\")\n    poi_df = poi_df.query(\"count > 1\")\n    print(f\"  #POIs after: {len(poi_df):,}\")\n    pois = set(poi_df[\"point_of_interest\"].to_numpy())\n    print(f\"  #locations before: {len(df):,}\")\n    df = df.query(\"point_of_interest in @pois\")\n    print(f\"  #locations after: {len(df):,}\")\n    return df","metadata":{"id":"ODildc7fi9CW","execution":{"iopub.status.busy":"2022-07-11T00:04:17.342298Z","iopub.execute_input":"2022-07-11T00:04:17.342566Z","iopub.status.idle":"2022-07-11T00:04:17.358272Z","shell.execute_reply.started":"2022-07-11T00:04:17.342535Z","shell.execute_reply":"2022-07-11T00:04:17.356904Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def compose(transforms):\n    def transform_func(df):\n        for transform in transforms:\n            df = transform(df)\n        return df\n\n    return transform_func","metadata":{"id":"9d29a1db","execution":{"iopub.status.busy":"2022-07-11T00:04:17.360575Z","iopub.execute_input":"2022-07-11T00:04:17.361549Z","iopub.status.idle":"2022-07-11T00:04:17.373266Z","shell.execute_reply.started":"2022-07-11T00:04:17.361511Z","shell.execute_reply":"2022-07-11T00:04:17.372233Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def dev_test_split(df, test_size=0.5, random_state=1234):\n    poi_df = df.groupby(\"point_of_interest\").agg(count=(\"id\", \"count\")).reset_index()\n    pois = poi_df.index.to_numpy()\n    idx_dev, idx_test, _, _ = train_test_split(\n        pois, np.zeros_like(pois), test_size=test_size, random_state=random_state\n    )\n    pois_dev = set(poi_df.loc[idx_dev, \"point_of_interest\"].to_list())\n    pois_test = set(poi_df.loc[idx_test, \"point_of_interest\"].to_list())\n    df_dev = df.query(\"point_of_interest in @pois_dev\")\n    df_test = df.query(\"point_of_interest in @pois_test\")\n    return df_dev, df_test","metadata":{"id":"mwUW6e7WnzLy","execution":{"iopub.status.busy":"2022-07-11T00:04:17.374784Z","iopub.execute_input":"2022-07-11T00:04:17.375385Z","iopub.status.idle":"2022-07-11T00:04:17.394837Z","shell.execute_reply.started":"2022-07-11T00:04:17.375349Z","shell.execute_reply":"2022-07-11T00:04:17.393807Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transforms = compose(\n    [\n        partial(drop_na, cols=[\"name\"]),\n        partial(fill_na, cols=[\"name\", \"categories\", \"address\"]),\n        partial(normalize, cols=[\"name\", \"categories\", \"address\"]),\n        partial(drop_duplicated, cols=[\"name\"]),\n        drop_single_poi,\n    ]\n)","metadata":{"id":"809838f5","execution":{"iopub.status.busy":"2022-07-11T00:04:17.397020Z","iopub.execute_input":"2022-07-11T00:04:17.397925Z","iopub.status.idle":"2022-07-11T00:04:17.411840Z","shell.execute_reply.started":"2022-07-11T00:04:17.397887Z","shell.execute_reply":"2022-07-11T00:04:17.410549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ntrain_ext = transforms(train)","metadata":{"id":"8c8a8d0e","outputId":"2edf0575-6ef9-4fa0-e5a2-e91da20eaa9b","execution":{"iopub.status.busy":"2022-07-11T00:04:17.413347Z","iopub.execute_input":"2022-07-11T00:04:17.413796Z","iopub.status.idle":"2022-07-11T00:04:39.839474Z","shell.execute_reply.started":"2022-07-11T00:04:17.413761Z","shell.execute_reply":"2022-07-11T00:04:39.838227Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train_ext)","metadata":{"execution":{"iopub.status.busy":"2022-07-11T00:04:39.841088Z","iopub.execute_input":"2022-07-11T00:04:39.841459Z","iopub.status.idle":"2022-07-11T00:04:39.852062Z","shell.execute_reply.started":"2022-07-11T00:04:39.841423Z","shell.execute_reply":"2022-07-11T00:04:39.850973Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train_ext) // 16","metadata":{"execution":{"iopub.status.busy":"2022-07-11T00:04:39.855101Z","iopub.execute_input":"2022-07-11T00:04:39.855375Z","iopub.status.idle":"2022-07-11T00:04:39.864089Z","shell.execute_reply.started":"2022-07-11T00:04:39.855351Z","shell.execute_reply":"2022-07-11T00:04:39.863064Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"_, sim = dev_test_split(train_ext, test_size=1 / 16, random_state=CFG.RANDOM_SEED)\ndevelop, test = dev_test_split(sim, random_state=CFG.RANDOM_SEED)\nfold0, fold1 = dev_test_split(develop, random_state=CFG.RANDOM_SEED)","metadata":{"id":"cuRT2GMSnx_2","execution":{"iopub.status.busy":"2022-07-11T00:04:44.829625Z","iopub.execute_input":"2022-07-11T00:04:44.830253Z","iopub.status.idle":"2022-07-11T00:04:45.806546Z","shell.execute_reply.started":"2022-07-11T00:04:44.830217Z","shell.execute_reply":"2022-07-11T00:04:45.805595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"_, test_leaked = dev_test_split(sim, random_state=CFG.RANDOM_SEED + 1)","metadata":{"execution":{"iopub.status.busy":"2022-07-11T00:04:45.808124Z","iopub.execute_input":"2022-07-11T00:04:45.808479Z","iopub.status.idle":"2022-07-11T00:04:45.915040Z","shell.execute_reply.started":"2022-07-11T00:04:45.808443Z","shell.execute_reply":"2022-07-11T00:04:45.914069Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(fold0), len(fold1), len(develop), len(test), len(test_leaked)","metadata":{"execution":{"iopub.status.busy":"2022-07-11T00:07:55.521359Z","iopub.execute_input":"2022-07-11T00:07:55.522595Z","iopub.status.idle":"2022-07-11T00:07:55.534165Z","shell.execute_reply.started":"2022-07-11T00:07:55.522549Z","shell.execute_reply":"2022-07-11T00:07:55.533208Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"duplicated_ratio = len(\n    develop.merge(test_leaked, on=(\"name\", \"longitude\", \"latitude\"))\n) / len(develop)\nprint(f\"duplicated ratio of develp and test_leaked: {duplicated_ratio:.3f}\")","metadata":{"execution":{"iopub.status.busy":"2022-07-11T00:07:41.714441Z","iopub.execute_input":"2022-07-11T00:07:41.714788Z","iopub.status.idle":"2022-07-11T00:07:41.774757Z","shell.execute_reply.started":"2022-07-11T00:07:41.714759Z","shell.execute_reply":"2022-07-11T00:07:41.773350Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_fill_ratio(df):\n    fig, ax = plt.subplots()\n    df_ = (1 - (df.isna().sum(axis=0) / len(df))).reset_index()\n    sns.barplot(data=df_, x=0, y=\"index\", ax=ax)\n    ax.set(title=\"Proportion of filled rows\", xlabel=\"proportion\", ylabel=None)\n    plt.show()\n    print(df_)","metadata":{"id":"3e9c8915","execution":{"iopub.status.busy":"2022-07-11T00:08:29.203217Z","iopub.execute_input":"2022-07-11T00:08:29.204130Z","iopub.status.idle":"2022-07-11T00:08:29.219308Z","shell.execute_reply.started":"2022-07-11T00:08:29.204091Z","shell.execute_reply":"2022-07-11T00:08:29.218162Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_fill_ratio(fold0)","metadata":{"id":"3af034db","outputId":"9c7bd393-948d-453b-98e0-7649ce86d2f5","execution":{"iopub.status.busy":"2022-07-11T00:08:29.382331Z","iopub.execute_input":"2022-07-11T00:08:29.382949Z","iopub.status.idle":"2022-07-11T00:08:29.696294Z","shell.execute_reply.started":"2022-07-11T00:08:29.382911Z","shell.execute_reply":"2022-07-11T00:08:29.695173Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_num_record(df, top_n=10):\n    vc = df[\"country\"].value_counts()\n    fig, ax = plt.subplots()\n    ax.plot(vc.cumsum() / vc.sum())\n    ax.set(\n        xscale=\"log\",\n        xlabel=\"number of record\",\n        ylabel=\"Proportion\",\n        title=\"Cumulative plot of #country\",\n    )\n    plt.show()\n    print(vc[:top_n].cumsum() / vc.sum())","metadata":{"id":"87dee675","execution":{"iopub.status.busy":"2022-07-11T00:08:29.698177Z","iopub.execute_input":"2022-07-11T00:08:29.698923Z","iopub.status.idle":"2022-07-11T00:08:29.714862Z","shell.execute_reply.started":"2022-07-11T00:08:29.698883Z","shell.execute_reply":"2022-07-11T00:08:29.713664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_num_record(fold0)","metadata":{"id":"18c524e1","outputId":"9e83bc5a-9e36-45bd-9c50-6b48dfb5663d","execution":{"iopub.status.busy":"2022-07-11T00:08:29.717147Z","iopub.execute_input":"2022-07-11T00:08:29.717656Z","iopub.status.idle":"2022-07-11T00:08:30.225741Z","shell.execute_reply.started":"2022-07-11T00:08:29.717620Z","shell.execute_reply":"2022-07-11T00:08:30.224443Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# H3 segments","metadata":{"id":"0a6bccab"}},{"cell_type":"code","source":"vc = fold0.value_counts(CFG.H3_COL)\nfig, ax = plt.subplots()\ndf = pd.DataFrame({\"count\": vc})\nsns.boxenplot(data=df, x=\"count\", ax=ax)\nax.set(xscale=\"log\")\nplt.show()","metadata":{"id":"874813ce","outputId":"7e167a2c-15a5-45e6-988a-c205f00e20d3","execution":{"iopub.status.busy":"2022-07-11T00:08:30.554529Z","iopub.execute_input":"2022-07-11T00:08:30.556906Z","iopub.status.idle":"2022-07-11T00:08:30.876893Z","shell.execute_reply.started":"2022-07-11T00:08:30.556868Z","shell.execute_reply":"2022-07-11T00:08:30.875923Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Sort DataFrame by H3 ids","metadata":{"id":"629626af"}},{"cell_type":"code","source":"def sort_by_h3(df, col):\n    df = df.copy()\n    vc = df.value_counts(col)\n    vc_df = pd.DataFrame({\"count\": vc}).reset_index()\n    cat = pd.CategoricalDtype(vc_df[col], ordered=True)\n    df[col] = pd.Categorical(df[col].astype(cat))\n    df.sort_values(col, inplace=True)\n    df = df.reset_index(drop=True)\n    return df","metadata":{"id":"_ih_X8HOy8fP","execution":{"iopub.status.busy":"2022-07-11T00:08:35.327342Z","iopub.execute_input":"2022-07-11T00:08:35.327692Z","iopub.status.idle":"2022-07-11T00:08:35.345571Z","shell.execute_reply.started":"2022-07-11T00:08:35.327663Z","shell.execute_reply":"2022-07-11T00:08:35.344365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fold0, fold1, develop, test, test_leaked = [\n    sort_by_h3(df, CFG.H3_COL) for df in [fold0, fold1, develop, test, test_leaked]\n]","metadata":{"id":"CwaMlHehsZ_H","execution":{"iopub.status.busy":"2022-07-11T00:08:51.986611Z","iopub.execute_input":"2022-07-11T00:08:51.986979Z","iopub.status.idle":"2022-07-11T00:08:52.066930Z","shell.execute_reply.started":"2022-07-11T00:08:51.986948Z","shell.execute_reply":"2022-07-11T00:08:52.065995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fold0.to_parquet(\"fold0.parquet\")\nfold1.to_parquet(\"fold1.parquet\")\ndevelop.to_parquet(\"develop.parquet\")\ntest.to_parquet(\"test.parquet\")\ntest_leaked.to_parquet(\"test_leaked.parquet\")","metadata":{"execution":{"iopub.status.busy":"2022-07-11T00:09:17.422072Z","iopub.execute_input":"2022-07-11T00:09:17.423043Z","iopub.status.idle":"2022-07-11T00:09:17.633050Z","shell.execute_reply.started":"2022-07-11T00:09:17.422973Z","shell.execute_reply":"2022-07-11T00:09:17.632059Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Calculate Embeddings","metadata":{"id":"cb2298e7"}},{"cell_type":"code","source":"def calc_embeddings(model, df, col, batch_size=256):\n    sentences = df[col].to_numpy()\n    embeddings = model.encode(sentences, show_progress_bar=True, batch_size=batch_size)\n\n    return embeddings","metadata":{"id":"380331fa","execution":{"iopub.status.busy":"2022-07-11T00:09:23.842476Z","iopub.execute_input":"2022-07-11T00:09:23.842823Z","iopub.status.idle":"2022-07-11T00:09:23.853489Z","shell.execute_reply.started":"2022-07-11T00:09:23.842793Z","shell.execute_reply":"2022-07-11T00:09:23.852237Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_gpos(df):\n    lat = df[\"latitude\"].apply(deg2rad).to_numpy(dtype=np.float32)\n    lon = df[\"longitude\"].apply(deg2rad).to_numpy(dtype=np.float32)\n    x = cos(lat) * cos(lon)\n    y = cos(lat) * sin(lon)\n    z = sin(lat)\n    gpos = np.stack([x, y, z], axis=-1)\n    return gpos","metadata":{"id":"Lq0jo5OLCXDz","execution":{"iopub.status.busy":"2022-07-11T00:09:24.016151Z","iopub.execute_input":"2022-07-11T00:09:24.017226Z","iopub.status.idle":"2022-07-11T00:09:24.031759Z","shell.execute_reply.started":"2022-07-11T00:09:24.017181Z","shell.execute_reply":"2022-07-11T00:09:24.030724Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def replace_category_sep(df, col=\"categories\"):\n    df = df.copy()\n    df[col] = df[col].str.replace(\", \", \" [SEP] \")\n    return df","metadata":{"id":"WwkdZNVFuaLi","execution":{"iopub.status.busy":"2022-07-11T00:09:24.164720Z","iopub.execute_input":"2022-07-11T00:09:24.165609Z","iopub.status.idle":"2022-07-11T00:09:24.174719Z","shell.execute_reply.started":"2022-07-11T00:09:24.165567Z","shell.execute_reply":"2022-07-11T00:09:24.173689Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def eliminate_mean_embedding(embeddings):\n    return embeddings - embeddings.mean(axis=0, keepdims=True)","metadata":{"id":"JWIpZWRBFaiG","execution":{"iopub.status.busy":"2022-07-11T00:09:24.311575Z","iopub.execute_input":"2022-07-11T00:09:24.313383Z","iopub.status.idle":"2022-07-11T00:09:24.320896Z","shell.execute_reply.started":"2022-07-11T00:09:24.313353Z","shell.execute_reply":"2022-07-11T00:09:24.319674Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def normalize_L2(embeddings):\n    return embeddings / ((embeddings**2).sum(axis=1) ** 0.5).reshape(-1, 1)","metadata":{"id":"S3nQJrR0ITHQ","execution":{"iopub.status.busy":"2022-07-11T00:09:25.668042Z","iopub.execute_input":"2022-07-11T00:09:25.668957Z","iopub.status.idle":"2022-07-11T00:09:25.676891Z","shell.execute_reply.started":"2022-07-11T00:09:25.668914Z","shell.execute_reply":"2022-07-11T00:09:25.675920Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fold0, fold1, develop, test, test_leaked = [\n    replace_category_sep(df) for df in [fold0, fold1, develop, test, test_leaked]\n]","metadata":{"id":"dL0ZJl6mMCn7","execution":{"iopub.status.busy":"2022-07-11T00:09:45.978561Z","iopub.execute_input":"2022-07-11T00:09:45.978985Z","iopub.status.idle":"2022-07-11T00:09:46.063983Z","shell.execute_reply.started":"2022-07-11T00:09:45.978954Z","shell.execute_reply":"2022-07-11T00:09:46.063021Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filtr = fold0[\"categories\"].str.contains(\"[SEP]\")\nfold0.loc[filtr, \"categories\"]","metadata":{"execution":{"iopub.status.busy":"2022-07-11T00:09:55.845544Z","iopub.execute_input":"2022-07-11T00:09:55.846623Z","iopub.status.idle":"2022-07-11T00:09:55.868028Z","shell.execute_reply.started":"2022-07-11T00:09:55.846584Z","shell.execute_reply":"2022-07-11T00:09:55.867022Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = SentenceTransformer(CFG.EMBEDDING_MODEL)\nembeddings_list_fold0 = [\n    calc_embeddings(model, fold0, \"name\"),\n    calc_embeddings(model, fold0, \"categories\"),\n]\nembeddings_list_fold1 = [\n    calc_embeddings(model, fold1, \"name\"),\n    calc_embeddings(model, fold1, \"categories\"),\n]\nembeddings_list_develop = [\n    calc_embeddings(model, develop, \"name\"),\n    calc_embeddings(model, develop, \"categories\"),\n]\nembeddings_list_test = [\n    calc_embeddings(model, test, \"name\"),\n    calc_embeddings(model, test, \"categories\"),\n]\nembeddings_list_test_leaked = [\n    calc_embeddings(model, test_leaked, \"name\"),\n    calc_embeddings(model, test_leaked, \"categories\"),\n]","metadata":{"id":"R1D_K-MFLfci","outputId":"c7fb7863-2bc2-46c0-858f-dde40c4350dc","execution":{"iopub.status.busy":"2022-07-11T00:10:47.306917Z","iopub.execute_input":"2022-07-11T00:10:47.307614Z","iopub.status.idle":"2022-07-11T00:11:30.433017Z","shell.execute_reply.started":"2022-07-11T00:10:47.307579Z","shell.execute_reply":"2022-07-11T00:11:30.431959Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def transform_embedding(embeddings_list):\n    embeddings_list_gm = [ebd.copy() for ebd in embeddings_list]\n    embeddings_list_gm = [eliminate_mean_embedding(embds) for embds in embeddings_list]\n\n    embeddings_list_gm_norm = [ebd.copy() for ebd in embeddings_list_gm]\n    embeddings_list_gm_norm = [normalize_L2(embds) for embds in embeddings_list_gm_norm]\n\n    return embeddings_list_gm_norm","metadata":{"id":"j1FxitwCqXol","execution":{"iopub.status.busy":"2022-07-11T00:11:30.435107Z","iopub.execute_input":"2022-07-11T00:11:30.435466Z","iopub.status.idle":"2022-07-11T00:11:30.448127Z","shell.execute_reply.started":"2022-07-11T00:11:30.435431Z","shell.execute_reply":"2022-07-11T00:11:30.446793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"embeddings_list_fold0_gm_norm = transform_embedding(embeddings_list_fold0)\nembeddings_list_fold1_gm_norm = transform_embedding(embeddings_list_fold1)\nembeddings_list_develop_gm_norm = transform_embedding(embeddings_list_develop)\nembeddings_list_test_gm_norm = transform_embedding(embeddings_list_test)\nembeddings_list_test_leaked_gm_norm = transform_embedding(embeddings_list_test_leaked)","metadata":{"id":"k7ITh1EQqn7u","execution":{"iopub.status.busy":"2022-07-11T00:11:34.759295Z","iopub.execute_input":"2022-07-11T00:11:34.759657Z","iopub.status.idle":"2022-07-11T00:11:34.986821Z","shell.execute_reply.started":"2022-07-11T00:11:34.759626Z","shell.execute_reply":"2022-07-11T00:11:34.985863Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Split Pos/Neg","metadata":{"id":"v9kVI0n7NEUs"}},{"cell_type":"code","source":"def concat_embeddings(embeddings_list, weights):\n    assert len(embeddings_list) == len(weights)\n    return np.concatenate(\n        [w * ebd for ebd, w in zip(embeddings_list, weights)], axis=-1\n    )","metadata":{"id":"b19adedf","execution":{"iopub.status.busy":"2022-07-11T00:11:38.063417Z","iopub.execute_input":"2022-07-11T00:11:38.063763Z","iopub.status.idle":"2022-07-11T00:11:38.074720Z","shell.execute_reply.started":"2022-07-11T00:11:38.063734Z","shell.execute_reply":"2022-07-11T00:11:38.073614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class kNN:\n    def __init__(self, k_neighbor, normalize):\n        self.k_neighbor = k_neighbor\n        self.index = None\n        self.normalize = normalize\n\n    def fit(self, X):\n        dims = X.shape[-1]\n        X = np.ascontiguousarray(X)\n\n        if self.normalize:\n            faiss.normalize_L2(X)\n        res = faiss.StandardGpuResources()\n        flat_config = faiss.GpuIndexFlatConfig()\n        flat_config.device = 0\n        flat_config\n        index = faiss.GpuIndexFlatL2(res, dims, flat_config)\n        index.add(X)\n        self.index = index\n\n    def search(self, Xq):\n        Xq = np.ascontiguousarray(Xq)\n        if self.normalize:\n            faiss.normalize_L2(Xq)\n        D, I = self.index.search(Xq, self.k_neighbor)\n        return I, D","metadata":{"id":"150d7668","execution":{"iopub.status.busy":"2022-07-11T00:12:01.479890Z","iopub.execute_input":"2022-07-11T00:12:01.480478Z","iopub.status.idle":"2022-07-11T00:12:01.503575Z","shell.execute_reply.started":"2022-07-11T00:12:01.480445Z","shell.execute_reply":"2022-07-11T00:12:01.502428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Predictor:\n    def __init__(self, k_neighbor, normalize):\n        self.k_neighbor = k_neighbor\n        self.normalize = normalize\n\n    def predict(self, search, query, idx2id):\n        assert query.shape[-1] == search.shape[-1]\n        assert query.shape[0] <= search.shape[0], f\"{query.shape[0]} {search.shape[0]}\"\n\n        knn = kNN(self.k_neighbor, self.normalize)\n        knn.fit(search)\n\n        I, D = knn.search(query)\n        preds = I.tolist()\n        distances = D.tolist()\n        preds = [[idx2id[p] for p in pred] for pred in preds]\n        return preds, distances","metadata":{"id":"200beb36","execution":{"iopub.status.busy":"2022-07-11T00:12:13.534632Z","iopub.execute_input":"2022-07-11T00:12:13.535661Z","iopub.status.idle":"2022-07-11T00:12:13.558640Z","shell.execute_reply.started":"2022-07-11T00:12:13.535609Z","shell.execute_reply":"2022-07-11T00:12:13.557635Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_gts(df, col=\"id\"):\n    gt_df = (\n        df.groupby(\"point_of_interest\").agg(gt=(col, lambda x: list(x))).reset_index()\n    )\n    df = pd.merge(df, gt_df, on=\"point_of_interest\", how=\"left\")\n    gts = df[\"gt\"].to_numpy()\n    return gts","metadata":{"id":"74d1bffc","execution":{"iopub.status.busy":"2022-07-11T00:12:17.184948Z","iopub.execute_input":"2022-07-11T00:12:17.185950Z","iopub.status.idle":"2022-07-11T00:12:17.200027Z","shell.execute_reply.started":"2022-07-11T00:12:17.185894Z","shell.execute_reply":"2022-07-11T00:12:17.198550Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def evaluate(preds, gts, eps=1e-15):\n    preds_ = [set(pred) for pred in preds]\n    gts_ = [set(gt) for gt in gts]\n    intersections = [pred.intersection(gt) for pred, gt in zip(preds_, gts_)]\n    unions = [pred.union(gt) for pred, gt in zip(preds_, gts_)]\n    ious = [\n        len(intersec) / len(union) for intersec, union in zip(intersections, unions)\n    ]\n    recalls = [len(intersec) / len(gt) for intersec, gt in zip(intersections, gts_)]\n    precisions = [\n        len(intersec) / len(pred) for intersec, pred in zip(intersections, preds_)\n    ]\n    f1 = np.mean([2 * r * p / (r + p + eps) for r, p in zip(recalls, precisions)])\n\n    result = {\n        \"IoU\": np.mean(ious),\n        \"Recall\": np.mean(recalls),\n        \"Precision\": np.mean(precisions),\n        \"F1\": f1,\n    }\n\n    return result","metadata":{"id":"9661d5f5","execution":{"iopub.status.busy":"2022-07-11T00:12:18.077796Z","iopub.execute_input":"2022-07-11T00:12:18.078535Z","iopub.status.idle":"2022-07-11T00:12:18.124335Z","shell.execute_reply.started":"2022-07-11T00:12:18.078494Z","shell.execute_reply":"2022-07-11T00:12:18.123438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Logger:\n    def __init__(self, is_debug=True):\n        self.is_debug = is_debug\n\n    def set_debug(self, is_debug):\n        self.is_debug = is_debug\n\n    def log(self, text):\n        if self.is_debug:\n            print(text)","metadata":{"id":"54b792a4","execution":{"iopub.status.busy":"2022-07-11T00:12:20.616048Z","iopub.execute_input":"2022-07-11T00:12:20.616998Z","iopub.status.idle":"2022-07-11T00:12:20.628379Z","shell.execute_reply.started":"2022-07-11T00:12:20.616952Z","shell.execute_reply":"2022-07-11T00:12:20.627395Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_search_points(origin):\n    s1, s2 = h3.k_ring_distances(origin, 1)\n    return list(s1.union(s2))\n\n\ndef set_exponential_monitor(logger, n):\n    if n < 10:\n        is_monitor = True\n    elif n < 100:\n        is_monitor = n % 10 == 0\n    elif n < 1000:\n        is_monitor = n % 100 == 0\n    else:\n        is_monitor = n % 1000 == 0\n\n    logger.set_debug(is_monitor)\n\n\ndef simple_eval(recalls, weights, n_total):\n    return np.sum([r * w for r, w in zip(recalls, weights)]) / np.sum(weights)\n\n\ndef evaluate_all(\n    df, embeddings_list, weight_list, k=25, normalize=True, monitor=True, debug_iter=0\n):\n    grouped = df.groupby(CFG.H3_COL)\n    vc = df.value_counts(CFG.H3_COL)\n    origin2sp = {origin: get_search_points(origin) for origin in vc.keys()}\n    point_set = set(df[CFG.H3_COL].unique().tolist())\n    logger = Logger()\n\n    recalls = []\n    weights = []\n    h3_res4s = []\n    preds_list = []\n    ids_list = []\n    distances_list = []\n    score = 0.0\n    weight_processed = 0.0\n\n    n = 0\n    for i, (origin, query_df) in enumerate(tqdm(grouped)):\n        if debug_iter > 0:\n            if i > debug_iter:\n                continue\n        n += 1\n        if monitor:\n            set_exponential_monitor(logger, n)\n        else:\n            logger.set_debug(False)\n\n        logger.log(\"=\" * 36 + f\" ROUND {i + 1} \" + \"=\" * 36)\n        logger.log(f\"Constructing search & query of {origin}:\")\n        query_df = query_df.reset_index()\n        search_points = origin2sp[origin]\n        search_points = [pt for pt in search_points if pt in point_set]\n        search_df = pd.concat([grouped.get_group(pt) for pt in search_points])\n        search_df = search_df.reset_index()\n        query_set = set(query_df[CFG.H3_COL].unique().tolist())\n        query_idx = search_df.query(f\"{CFG.H3_COL} in @query_set\").index\n\n        logger.log(f\"  - #points in query: {len(query_df)}\")\n        logger.log(f\"  - #points in search space: {len(search_df)}\")\n\n        k_neighbor = min(len(search_df), k)\n        if len(search_df) > 1:\n            logger.log(\"Calculate Embeddings:\")\n            global_search_index = search_df[\"index\"].to_numpy()\n\n            embeddings_local = [\n                embds[global_search_index].copy() for embds in embeddings_list\n            ]\n            # embeddings_local = [eliminate_mean_embedding(embds) for embds in embeddings_local]\n            # embeddings_local = [normalize_L2(embds) for embds in embeddings_local]\n\n            embeddings_concat = concat_embeddings(embeddings_local, weight_list)\n            search = embeddings_concat\n            query = search[query_idx]\n\n            predictor = Predictor(k_neighbor=k_neighbor, normalize=normalize)\n            idx2id = search_df[\"id\"].to_dict()\n            preds, distances = predictor.predict(search, query, idx2id)\n        else:\n            logger.log(\"Skip calculating Embeddings:\")\n            preds = search_df[\"id\"].to_numpy().reshape(1, -1).tolist()\n            distances = [[0.0]]\n\n        logger.log(f\"  - len(pred[0]): {len(preds[0])}\")\n        logger.log(\"Evaluation without post process:\")\n        gts = create_gts(query_df)\n        result = evaluate(preds, gts, eps=1e-15)\n        logger.log(\", \".join([f\"{key}: {value:.4f}\" for key, value in result.items()]))\n\n        recall = result[\"Recall\"]\n        weight = len(query_df)\n        score += weight * recall\n        weight_processed += weight\n        logger.log(f\"score (running mean): {score / weight_processed:4f}\")\n        logger.log(f\"processed: {weight_processed / len(df):4f}\")\n\n        recalls.append(recall)\n        weights.append(weight)\n        h3_res4s.append(origin)\n        preds_list.append(preds)\n        ids_list.append(query_df[\"id\"].to_numpy())\n        distances_list.append(distances)\n\n    score = simple_eval(recalls, weights, len(df))\n    if monitor:\n        print(\"=\" * 80)\n        print(f\"approximate score: {score:.4f}\")\n        print(f\"processed: {sum(weights) / len(df):.4f}\")\n\n    return score, recalls, weights, h3_res4s, preds_list, ids_list, distances_list","metadata":{"id":"66f0dec5","execution":{"iopub.status.busy":"2022-07-11T00:12:20.984741Z","iopub.execute_input":"2022-07-11T00:12:20.985436Z","iopub.status.idle":"2022-07-11T00:12:21.076355Z","shell.execute_reply.started":"2022-07-11T00:12:20.985380Z","shell.execute_reply":"2022-07-11T00:12:21.075412Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Train set","metadata":{"id":"-L2fvE8FvvMN"}},{"cell_type":"code","source":"def blocking(df, embeddings_list, weights):\n    (\n        score,\n        recalls,\n        weights,\n        h3_res4s,\n        preds_list,\n        ids_list,\n        distances_list,\n    ) = evaluate_all(\n        df, embeddings_list, weights, k=25, normalize=True, monitor=True, debug_iter=0\n    )\n\n    preds_flat, ids_flat, distances_flat = [], [], []\n    for ids, preds, distances in zip(ids_list, preds_list, distances_list):\n        preds_flat.extend(preds)\n        ids_flat.extend(ids)\n        distances_flat.extend(distances)\n\n    preds_df = pd.DataFrame(\n        {\"id\": ids_flat, \"preds\": preds_flat, \"distances\": distances_flat}\n    )\n    stat_df = pd.DataFrame({CFG.H3_COL: h3_res4s, \"recall\": recalls, \"weight\": weights})\n\n    return preds_df, stat_df","metadata":{"id":"xbccSYB6xiAL","execution":{"iopub.status.busy":"2022-07-11T00:12:25.574873Z","iopub.execute_input":"2022-07-11T00:12:25.575576Z","iopub.status.idle":"2022-07-11T00:12:25.600784Z","shell.execute_reply.started":"2022-07-11T00:12:25.575536Z","shell.execute_reply":"2022-07-11T00:12:25.599884Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_fold0_df, stat_fold0_df = blocking(\n    fold0, embeddings_list_fold0_gm_norm, [1, CFG.ALPHA]\n)","metadata":{"id":"-CKJRniOyQ4u","outputId":"73c376f6-1055-4c18-c900-7010c35a9d14","_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-07-11T00:13:07.227527Z","iopub.execute_input":"2022-07-11T00:13:07.227879Z","iopub.status.idle":"2022-07-11T00:13:36.365296Z","shell.execute_reply.started":"2022-07-11T00:13:07.227849Z","shell.execute_reply":"2022-07-11T00:13:36.364067Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_fold1_df, stat_fold1_df = blocking(\n    fold1, embeddings_list_fold1_gm_norm, [1, CFG.ALPHA]\n)","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-07-11T00:13:36.367880Z","iopub.execute_input":"2022-07-11T00:13:36.368629Z","iopub.status.idle":"2022-07-11T00:14:04.341705Z","shell.execute_reply.started":"2022-07-11T00:13:36.368589Z","shell.execute_reply":"2022-07-11T00:14:04.340707Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_develop_df, stat_develop_df = blocking(\n    develop, embeddings_list_develop_gm_norm, [1, CFG.ALPHA]\n)","metadata":{"execution":{"iopub.status.busy":"2022-07-11T00:14:04.343195Z","iopub.execute_input":"2022-07-11T00:14:04.344091Z","iopub.status.idle":"2022-07-11T00:14:38.775507Z","shell.execute_reply.started":"2022-07-11T00:14:04.344038Z","shell.execute_reply":"2022-07-11T00:14:38.774433Z"},"_kg_hide-output":true,"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_test_df, stat_test_df = blocking(\n    test, embeddings_list_test_gm_norm, [1, CFG.ALPHA]\n)","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-07-11T00:14:38.778149Z","iopub.execute_input":"2022-07-11T00:14:38.778999Z","iopub.status.idle":"2022-07-11T00:15:15.648612Z","shell.execute_reply.started":"2022-07-11T00:14:38.778957Z","shell.execute_reply":"2022-07-11T00:15:15.647551Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_test_leaked_df, stat_test_leaked_df = blocking(\n    test_leaked, embeddings_list_test_leaked_gm_norm, [1, CFG.ALPHA]\n)","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-07-11T00:17:21.588286Z","iopub.execute_input":"2022-07-11T00:17:21.588896Z","iopub.status.idle":"2022-07-11T00:17:58.559584Z","shell.execute_reply.started":"2022-07-11T00:17:21.588860Z","shell.execute_reply":"2022-07-11T00:17:58.558612Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_fold0_df.to_parquet(\n    f\"preds_fold0_{CFG.H3_COL}_{CFG.MODEL_KEY}_text_seed{CFG.RANDOM_SEED}.parquet\"\n)\npreds_fold1_df.to_parquet(\n    f\"preds_fold1_{CFG.H3_COL}_{CFG.MODEL_KEY}_text_seed{CFG.RANDOM_SEED}.parquet\"\n)\npreds_develop_df.to_parquet(\n    f\"preds_develop_{CFG.H3_COL}_{CFG.MODEL_KEY}_text_seed{CFG.RANDOM_SEED}.parquet\"\n)\npreds_test_df.to_parquet(\n    f\"preds_test_{CFG.H3_COL}_{CFG.MODEL_KEY}_text_seed{CFG.RANDOM_SEED}.parquet\"\n)\npreds_test_leaked_df.to_parquet(\n    f\"preds_test_leaked_{CFG.H3_COL}_{CFG.MODEL_KEY}_text_seed{CFG.RANDOM_SEED}.parquet\"\n)","metadata":{"id":"ngjltaYvvmJL","execution":{"iopub.status.busy":"2022-07-11T00:15:57.923521Z","iopub.execute_input":"2022-07-11T00:15:57.923863Z","iopub.status.idle":"2022-07-11T00:15:58.512352Z","shell.execute_reply.started":"2022-07-11T00:15:57.923834Z","shell.execute_reply":"2022-07-11T00:15:58.511373Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"stat_fold0_df.to_csv(\n    f\"stat_fold0_{CFG.H3_COL}_{CFG.MODEL_KEY}_text_seed{CFG.RANDOM_SEED}.csv\",\n    index=False,\n)\nstat_fold1_df.to_csv(\n    f\"stat_fold1_{CFG.H3_COL}_{CFG.MODEL_KEY}_text_seed{CFG.RANDOM_SEED}.csv\",\n    index=False,\n)\nstat_develop_df.to_csv(\n    f\"stat_develop_{CFG.H3_COL}_{CFG.MODEL_KEY}_text_seed{CFG.RANDOM_SEED}.csv\",\n    index=False,\n)\nstat_test_df.to_csv(\n    f\"stat_test_{CFG.H3_COL}_{CFG.MODEL_KEY}_text_seed{CFG.RANDOM_SEED}.csv\",\n    index=False,\n)\nstat_test_leaked_df.to_csv(\n    f\"stat_test_leaked_{CFG.H3_COL}_{CFG.MODEL_KEY}_text_seed{CFG.RANDOM_SEED}.csv\",\n    index=False,\n)","metadata":{"id":"fqcF8KWgwAh8","execution":{"iopub.status.busy":"2022-07-11T00:15:58.514126Z","iopub.execute_input":"2022-07-11T00:15:58.514484Z","iopub.status.idle":"2022-07-11T00:15:58.538819Z","shell.execute_reply.started":"2022-07-11T00:15:58.514450Z","shell.execute_reply":"2022-07-11T00:15:58.538013Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nax = sns.histplot(data=stat_fold0_df, x=\"weight\", y=\"recall\", log_scale=(True, False), bins=50)\nax.set(xscale=\"log\")\nplt.show()","metadata":{"id":"SUVo0MRjwU7a","outputId":"6b2606a0-51f2-49e1-af6e-3b2d36d7b70d","execution":{"iopub.status.busy":"2022-07-11T00:15:58.960956Z","iopub.execute_input":"2022-07-11T00:15:58.961989Z","iopub.status.idle":"2022-07-11T00:15:59.345391Z","shell.execute_reply.started":"2022-07-11T00:15:58.961953Z","shell.execute_reply":"2022-07-11T00:15:59.344321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nax = sns.histplot(data=stat_fold1_df, x=\"weight\", y=\"recall\", log_scale=(True, False), bins=50)\nax.set(xscale=\"log\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-11T00:15:59.510173Z","iopub.execute_input":"2022-07-11T00:15:59.510551Z","iopub.status.idle":"2022-07-11T00:15:59.893181Z","shell.execute_reply.started":"2022-07-11T00:15:59.510520Z","shell.execute_reply":"2022-07-11T00:15:59.892205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nax = sns.histplot(data=stat_develop_df, x=\"weight\", y=\"recall\", log_scale=(True, False), bins=50)\nax.set(xscale=\"log\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-11T00:16:33.048470Z","iopub.execute_input":"2022-07-11T00:16:33.048820Z","iopub.status.idle":"2022-07-11T00:16:33.526350Z","shell.execute_reply.started":"2022-07-11T00:16:33.048790Z","shell.execute_reply":"2022-07-11T00:16:33.525355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nax = sns.histplot(data=stat_test_df, x=\"weight\", y=\"recall\", log_scale=(True, False), bins=50)\nax.set(xscale=\"log\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-11T00:16:00.540225Z","iopub.execute_input":"2022-07-11T00:16:00.540573Z","iopub.status.idle":"2022-07-11T00:16:00.906553Z","shell.execute_reply.started":"2022-07-11T00:16:00.540542Z","shell.execute_reply":"2022-07-11T00:16:00.905626Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nax = sns.histplot(data=stat_test_leaked_df, x=\"weight\", y=\"recall\", log_scale=(True, False), bins=50)\nax.set(xscale=\"log\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-11T00:18:14.801077Z","iopub.execute_input":"2022-07-11T00:18:14.801431Z","iopub.status.idle":"2022-07-11T00:18:15.179127Z","shell.execute_reply.started":"2022-07-11T00:18:14.801395Z","shell.execute_reply":"2022-07-11T00:18:15.178213Z"},"trusted":true},"execution_count":null,"outputs":[]}]}