import%20marimo%0A%0A__generated_with%20%3D%20%220.23.6%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20mo.md(%22%23%20Titanic%20-%20Kaggle%20Competition%22)%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20import%20kagglehub%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20seaborn%20as%20sns%0A%20%20%20%20from%20sklearn.model_selection%20import%20train_test_split%0A%20%20%20%20from%20sklearn.ensemble%20import%20RandomForestClassifier%0A%20%20%20%20from%20sklearn.metrics%20import%20accuracy_score%0A%0A%20%20%20%20return%20RandomForestClassifier%2C%20accuracy_score%2C%20kagglehub%2C%20np%2C%20pd%2C%20plt%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(kagglehub)%3A%0A%20%20%20%20import%20os%0A%20%20%20%20from%20pathlib%20import%20Path%0A%20%20%20%20os.environ%5B%22KAGGLEHUB_CACHE%22%5D%20%3D%20str(Path(__file__).parent%20%2F%20%22datasets%22)%0A%20%20%20%20path%20%3D%20kagglehub.competition_download(%22titanic%22)%0A%20%20%20%20return%20Path%2C%20path%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(Path%2C%20path%2C%20pd)%3A%0A%20%20%20%20data_dir%20%3D%20Path(path)%0A%20%20%20%20train_df%20%3D%20pd.read_csv(data_dir%20%2F%20%22train.csv%22)%0A%20%20%20%20test_df%20%3D%20pd.read_csv(data_dir%20%2F%20%22test.csv%22)%0A%20%20%20%20train_df.head()%0A%20%20%20%20return%20test_df%2C%20train_df%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%20%F0%9F%94%8D%20EDA%20%E2%80%94%20%E3%83%87%E3%83%BC%E3%82%BF%E5%85%A8%E6%99%AF%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo%2C%20pd%2C%20test_df%2C%20train_df)%3A%0A%20%20%20%20overview%20%3D%20pd.DataFrame(%7B%0A%20%20%20%20%20%20%20%20%22dtype%22%3A%20train_df.dtypes.astype(str)%2C%0A%20%20%20%20%20%20%20%20%22n_missing%22%3A%20train_df.isna().sum()%2C%0A%20%20%20%20%20%20%20%20%22pct_missing%22%3A%20(train_df.isna().mean()%20*%20100).round(2)%2C%0A%20%20%20%20%20%20%20%20%22n_unique%22%3A%20train_df.nunique()%2C%0A%20%20%20%20%20%20%20%20%22sample%22%3A%20%5Btrain_df%5Bc%5D.dropna().iloc%5B0%5D%20if%20train_df%5Bc%5D.notna().any()%20else%20None%20for%20c%20in%20train_df.columns%5D%2C%0A%20%20%20%20%7D)%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(f%22**train**%3A%20%7Btrain_df.shape%5B0%5D%3A%2C%7D%20%E8%A1%8C%20%C3%97%20%7Btrain_df.shape%5B1%5D%7D%20%E5%88%97%20%EF%BD%9C%20**test**%3A%20%7Btest_df.shape%5B0%5D%3A%2C%7D%20%E8%A1%8C%20%C3%97%20%7Btest_df.shape%5B1%5D%7D%20%E5%88%97%22)%2C%0A%20%20%20%20%20%20%20%20overview%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%23%20%E7%94%9F%E5%AD%98%E7%8E%87%E3%81%AE%E5%86%85%E8%A8%B3%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo%2C%20pd%2C%20train_df)%3A%0A%20%20%20%20def%20_rate(g)%3A%0A%20%20%20%20%20%20%20%20return%20pd.DataFrame(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22n%22%3A%20g.size()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22survived%22%3A%20g%5B%22Survived%22%5D.sum()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22rate%22%3A%20g%5B%22Survived%22%5D.mean().round(3)%2C%0A%20%20%20%20%20%20%20%20%7D)%0A%0A%20%20%20%20by_sex%20%3D%20_rate(train_df.groupby(%22Sex%22))%0A%20%20%20%20by_pclass%20%3D%20_rate(train_df.groupby(%22Pclass%22))%0A%20%20%20%20by_sex_pclass%20%3D%20train_df.pivot_table(%0A%20%20%20%20%20%20%20%20index%3D%22Sex%22%2C%20columns%3D%22Pclass%22%2C%20values%3D%22Survived%22%2C%20aggfunc%3D%22mean%22%0A%20%20%20%20).round(3)%0A%0A%20%20%20%20overall%20%3D%20train_df%5B%22Survived%22%5D.mean()%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(f%22**%E5%85%A8%E4%BD%93%E7%94%9F%E5%AD%98%E7%8E%87**%3A%20%7Boverall%3A.1%25%7D%EF%BC%88%7Bint(train_df%5B'Survived'%5D.sum())%7D%20%2F%20%7Blen(train_df)%7D%EF%BC%89%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**by%20Sex**%22)%2C%20by_sex%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**by%20Pclass**%22)%2C%20by_pclass%5D)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%20justify%3D%22start%22%2C%20gap%3D2)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22**Sex%20%C3%97%20Pclass%20%E7%94%9F%E5%AD%98%E7%8E%87**%22)%2C%0A%20%20%20%20%20%20%20%20by_sex_pclass%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%23%20%E6%95%B0%E5%80%A4%E7%89%B9%E5%BE%B4%E3%81%A8%E7%94%9F%E5%AD%98%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(plt%2C%20train_df)%3A%0A%20%20%20%20fig%2C%20axes%20%3D%20plt.subplots(1%2C%202%2C%20figsize%3D(10%2C%203.5))%0A%20%20%20%20for%20ax%2C%20col%20in%20zip(axes%2C%20%5B%22Age%22%2C%20%22Fare%22%5D)%3A%0A%20%20%20%20%20%20%20%20for%20s%2C%20label%2C%20color%20in%20%5B(0%2C%20%22Died%22%2C%20%22%23888%22)%2C%20(1%2C%20%22Survived%22%2C%20%22%233a7%22)%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20train_df.loc%5Btrain_df%5B%22Survived%22%5D%20%3D%3D%20s%2C%20col%5D.dropna().plot(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind%3D%22hist%22%2C%20bins%3D30%2C%20alpha%3D0.55%2C%20ax%3Dax%2C%20label%3Dlabel%2C%20color%3Dcolor%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20ax.set_title(col)%0A%20%20%20%20%20%20%20%20ax.set_xlabel(col)%0A%20%20%20%20%20%20%20%20ax.legend()%0A%20%20%20%20plt.tight_layout()%0A%20%20%20%20fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%23%20%E6%95%AC%E7%A7%B0%EF%BC%88Title%EF%BC%89%E3%81%8B%E3%82%89%E8%A6%8B%E3%82%8B%E7%94%9F%E5%AD%98%E7%8E%87%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo%2C%20pd%2C%20train_df)%3A%0A%20%20%20%20title_raw%20%3D%20train_df%5B%22Name%22%5D.str.extract(r%22%2C%5Cs*(%5B%5E.%5D%2B)%5C.%22%2C%20expand%3DFalse).str.strip()%0A%0A%20%20%20%20_title_map%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22Mlle%22%3A%20%22Miss%22%2C%20%22Ms%22%3A%20%22Miss%22%2C%0A%20%20%20%20%20%20%20%20%22Mme%22%3A%20%22Mrs%22%2C%0A%20%20%20%20%20%20%20%20%22Lady%22%3A%20%22Royalty%22%2C%20%22Sir%22%3A%20%22Royalty%22%2C%20%22the%20Countess%22%3A%20%22Royalty%22%2C%0A%20%20%20%20%20%20%20%20%22Don%22%3A%20%22Royalty%22%2C%20%22Jonkheer%22%3A%20%22Royalty%22%2C%0A%20%20%20%20%20%20%20%20%22Dr%22%3A%20%22Officer%22%2C%20%22Rev%22%3A%20%22Officer%22%2C%20%22Col%22%3A%20%22Officer%22%2C%0A%20%20%20%20%20%20%20%20%22Major%22%3A%20%22Officer%22%2C%20%22Capt%22%3A%20%22Officer%22%2C%0A%20%20%20%20%7D%0A%20%20%20%20title%20%3D%20title_raw.replace(_title_map)%0A%0A%20%20%20%20by_title%20%3D%20pd.DataFrame(%7B%0A%20%20%20%20%20%20%20%20%22n%22%3A%20title.value_counts()%2C%0A%20%20%20%20%20%20%20%20%22survived%22%3A%20train_df.groupby(title)%5B%22Survived%22%5D.sum()%2C%0A%20%20%20%20%20%20%20%20%22rate%22%3A%20train_df.groupby(title)%5B%22Survived%22%5D.mean().round(3)%2C%0A%20%20%20%20%7D).sort_values(%22n%22%2C%20ascending%3DFalse)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22**Name%20%E3%81%AE%20%60Foo%2C%20Title.%20Bar%60%20%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%8B%E3%82%89%20Title%20%E6%8A%BD%E5%87%BA%20%E2%86%92%2017%E2%86%926%20%E7%A8%AE%E3%81%AB%E9%9B%86%E7%B4%84**%22)%2C%0A%20%20%20%20%20%20%20%20by_title%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%23%20%E5%AE%B6%E6%97%8F%E6%A7%8B%E6%88%90%E3%81%A8%E7%94%9F%E5%AD%98%E7%8E%87%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo%2C%20pd%2C%20train_df)%3A%0A%20%20%20%20family_size%20%3D%20train_df%5B%22SibSp%22%5D%20%2B%20train_df%5B%22Parch%22%5D%20%2B%201%0A%20%20%20%20family_bin%20%3D%20pd.cut(%0A%20%20%20%20%20%20%20%20family_size%2C%0A%20%20%20%20%20%20%20%20bins%3D%5B0%2C%201%2C%204%2C%20100%5D%2C%0A%20%20%20%20%20%20%20%20labels%3D%5B%22Alone%20(1)%22%2C%20%22Small%20(2-4)%22%2C%20%22Large%20(5%2B)%22%5D%2C%0A%20%20%20%20)%0A%0A%20%20%20%20by_fs%20%3D%20pd.DataFrame(%7B%0A%20%20%20%20%20%20%20%20%22n%22%3A%20train_df.groupby(family_size).size()%2C%0A%20%20%20%20%20%20%20%20%22rate%22%3A%20train_df.groupby(family_size)%5B%22Survived%22%5D.mean().round(3)%2C%0A%20%20%20%20%7D)%0A%20%20%20%20by_fs_bin%20%3D%20pd.DataFrame(%7B%0A%20%20%20%20%20%20%20%20%22n%22%3A%20train_df.groupby(family_bin%2C%20observed%3DTrue).size()%2C%0A%20%20%20%20%20%20%20%20%22survived%22%3A%20train_df.groupby(family_bin%2C%20observed%3DTrue)%5B%22Survived%22%5D.sum()%2C%0A%20%20%20%20%20%20%20%20%22rate%22%3A%20train_df.groupby(family_bin%2C%20observed%3DTrue)%5B%22Survived%22%5D.mean().round(3)%2C%0A%20%20%20%20%7D)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22**FamilySize%20%3D%20SibSp%20%2B%20Parch%20%2B%201**%EF%BC%88%E6%9C%AC%E4%BA%BA%E5%90%AB%E3%82%80%EF%BC%89%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**%E3%82%B5%E3%82%A4%E3%82%BA%E5%88%A5**%22)%2C%20by_fs%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**3%E5%8C%BA%E5%88%86**%22)%2C%20by_fs_bin%5D)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%20justify%3D%22start%22%2C%20gap%3D2)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22%E2%86%92%20%E5%8D%98%E8%BA%AB%E3%81%AF%E4%B8%8D%E5%88%A9%E3%80%812%E3%80%9C4%E4%BA%BA%E3%81%8C%E3%82%B9%E3%82%A4%E3%83%BC%E3%83%88%E3%82%B9%E3%83%9D%E3%83%83%E3%83%88%E3%80%815%E4%BA%BA%E4%BB%A5%E4%B8%8A%E3%81%AF%E5%86%8D%E3%81%B3%E5%8D%B1%E9%99%BA%E3%80%82%22)%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%23%20%E4%B9%97%E8%88%B9%E6%B8%AF%EF%BC%88Embarked%EF%BC%89%E3%81%A8%E7%94%9F%E5%AD%98%E7%8E%87%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo%2C%20pd%2C%20train_df)%3A%0A%20%20%20%20by_emb%20%3D%20pd.DataFrame(%7B%0A%20%20%20%20%20%20%20%20%22n%22%3A%20train_df.groupby(%22Embarked%22%2C%20dropna%3DFalse).size()%2C%0A%20%20%20%20%20%20%20%20%22survived%22%3A%20train_df.groupby(%22Embarked%22%2C%20dropna%3DFalse)%5B%22Survived%22%5D.sum()%2C%0A%20%20%20%20%20%20%20%20%22rate%22%3A%20train_df.groupby(%22Embarked%22%2C%20dropna%3DFalse)%5B%22Survived%22%5D.mean().round(3)%2C%0A%20%20%20%20%7D)%0A%0A%20%20%20%20emb_pclass%20%3D%20pd.crosstab(train_df%5B%22Embarked%22%5D%2C%20train_df%5B%22Pclass%22%5D%2C%20margins%3DTrue)%0A%0A%20%20%20%20emb_rate_by_pclass%20%3D%20train_df.pivot_table(%0A%20%20%20%20%20%20%20%20index%3D%22Embarked%22%2C%20columns%3D%22Pclass%22%2C%20values%3D%22Survived%22%2C%20aggfunc%3D%22mean%22%0A%20%20%20%20).round(3)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22**S%3DSouthampton%20%2F%20C%3DCherbourg%20%2F%20Q%3DQueenstown**%EF%BC%88NaN%20%E3%81%AF2%E4%BB%B6%EF%BC%89%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**%E6%B8%AF%E5%88%A5%20%E7%94%9F%E5%AD%98%E7%8E%87**%22)%2C%20by_emb%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**%E6%B8%AF%20%C3%97%20Pclass%20%E4%BA%BA%E6%95%B0**%22)%2C%20emb_pclass%5D)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%20justify%3D%22start%22%2C%20gap%3D2)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22**%E6%B8%AF%20%C3%97%20Pclass%20%E3%81%AE%E7%94%9F%E5%AD%98%E7%8E%87**%22)%2C%0A%20%20%20%20%20%20%20%20emb_rate_by_pclass%2C%0A%20%20%20%20%20%20%20%20mo.md(%22%E2%86%92%20C%E6%B8%AF%E3%81%AF1%E7%AD%89%E6%AF%94%E7%8E%87%E3%81%8C%E9%AB%98%E3%81%84%EF%BC%8885%2F168%EF%BC%89%E3%81%9F%E3%82%81%E7%94%9F%E5%AD%98%E7%8E%87%E3%81%8C%E9%AB%98%E3%81%8F%E8%A6%8B%E3%81%88%E3%82%8B%E3%80%82Pclass%20%E3%81%A7%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%91%E3%82%8B%E3%81%A8%E5%8A%B9%E6%9E%9C%E3%81%AF%E6%B8%9B%E8%A1%B0%E3%81%99%E3%82%8B%E3%81%8C%E3%80%81%E5%90%8C%E3%82%AF%E3%83%A9%E3%82%B9%E5%86%85%E3%81%A7%E3%82%82C%E3%81%AF%20S%2FQ%20%E3%82%88%E3%82%8A%E7%94%9F%E5%AD%98%E7%8E%87%E3%81%8C%E9%AB%98%E3%81%84%E5%82%BE%E5%90%91%E3%80%82%22)%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%23%20Cabin%20%E3%81%AE%E6%AC%A0%E6%90%8D%E3%81%A8%E7%94%9F%E5%AD%98%E7%8E%87%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo%2C%20pd%2C%20train_df)%3A%0A%20%20%20%20has_cabin%20%3D%20train_df%5B%22Cabin%22%5D.notna()%0A%20%20%20%20deck%20%3D%20train_df%5B%22Cabin%22%5D.fillna(%22Unknown%22).str%5B0%5D%0A%0A%20%20%20%20by_has%20%3D%20pd.DataFrame(%7B%0A%20%20%20%20%20%20%20%20%22n%22%3A%20has_cabin.value_counts()%2C%0A%20%20%20%20%20%20%20%20%22survived%22%3A%20train_df.groupby(has_cabin)%5B%22Survived%22%5D.sum()%2C%0A%20%20%20%20%20%20%20%20%22rate%22%3A%20train_df.groupby(has_cabin)%5B%22Survived%22%5D.mean().round(3)%2C%0A%20%20%20%20%7D).rename(index%3D%7BTrue%3A%20%22has%20Cabin%22%2C%20False%3A%20%22missing%22%7D)%0A%0A%20%20%20%20by_deck%20%3D%20pd.DataFrame(%7B%0A%20%20%20%20%20%20%20%20%22n%22%3A%20train_df.groupby(deck).size()%2C%0A%20%20%20%20%20%20%20%20%22rate%22%3A%20train_df.groupby(deck)%5B%22Survived%22%5D.mean().round(3)%2C%0A%20%20%20%20%7D).sort_values(%22n%22%2C%20ascending%3DFalse)%0A%0A%20%20%20%20n_missing%20%3D%20int(train_df%5B%22Cabin%22%5D.isna().sum())%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(f%22**Cabin%20%E6%AC%A0%E6%90%8D%3A%20%7Bn_missing%7D%20%2F%20%7Blen(train_df)%7D%20%E4%BB%B6%20(%7Bn_missing%2Flen(train_df)%3A.0%25%7D)**%20%E2%80%94%20%E6%AC%A0%E6%90%8D%E8%87%AA%E4%BD%93%E3%81%8C%E6%83%85%E5%A0%B1%E9%87%8F%E3%82%92%E6%8C%81%E3%81%A4%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**%E6%9C%89%E7%84%A1**%22)%2C%20by_has%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%5Bmo.md(%22**Deck%20%E5%88%A5**%EF%BC%88Cabin%20%E9%A0%AD%E6%96%87%E5%AD%97%2C%20U%3D%E6%AC%A0%E6%90%8D%EF%BC%89%22)%2C%20by_deck%5D)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%20justify%3D%22start%22%2C%20gap%3D2)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22%E2%86%92%20Cabin%20%E8%A8%98%E8%BC%89%E3%81%82%E3%82%8A%3D66.7%25%20vs%20%E3%81%AA%E3%81%97%3D30.0%25%E3%80%81%E3%81%BB%E3%81%BC%20Pclass%201%20%E3%81%AE%E4%BB%A3%E7%90%86%E5%A4%89%E6%95%B0%E3%81%A0%E3%81%8C%E3%80%81B%2FD%2FE%20%E3%81%AF%E8%A8%98%E8%BC%89%E3%81%AE%E3%81%82%E3%82%8B%E4%B8%AD%E3%81%A7%E3%82%82%E7%89%B9%E3%81%AB%E9%AB%98%E3%81%84%E3%80%82%22)%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%20%F0%9F%8C%B2%20%E3%83%99%E3%83%BC%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%B3%3A%20RandomForest%0A%0A%20%20%20%20EDA%20%E3%81%A7%E8%A6%8B%E3%81%9F%E5%8A%B9%E3%81%8D%E3%81%9D%E3%81%86%E3%81%AA%E7%89%B9%E5%BE%B4%E3%82%92%E6%9C%80%E5%B0%8F%E6%A7%8B%E6%88%90%E3%81%A7%E7%B5%84%E3%82%93%E3%81%A7%E3%80%81CV%20%E3%81%A7%E8%A9%95%E4%BE%A1%20%E2%86%92%20submission.csv%20%E7%94%9F%E6%88%90%E3%81%BE%E3%81%A7%E3%82%84%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20pd%2C%20test_df%2C%20train_df)%3A%0A%20%20%20%20_TITLE_MAP%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22Mlle%22%3A%20%22Miss%22%2C%20%22Ms%22%3A%20%22Miss%22%2C%20%22Mme%22%3A%20%22Mrs%22%2C%0A%20%20%20%20%20%20%20%20%22Lady%22%3A%20%22Royalty%22%2C%20%22Sir%22%3A%20%22Royalty%22%2C%20%22the%20Countess%22%3A%20%22Royalty%22%2C%0A%20%20%20%20%20%20%20%20%22Don%22%3A%20%22Royalty%22%2C%20%22Dona%22%3A%20%22Royalty%22%2C%20%22Jonkheer%22%3A%20%22Royalty%22%2C%0A%20%20%20%20%20%20%20%20%22Dr%22%3A%20%22Officer%22%2C%20%22Rev%22%3A%20%22Officer%22%2C%20%22Col%22%3A%20%22Officer%22%2C%0A%20%20%20%20%20%20%20%20%22Major%22%3A%20%22Officer%22%2C%20%22Capt%22%3A%20%22Officer%22%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20def%20_make_title(name_series)%3A%0A%20%20%20%20%20%20%20%20raw%20%3D%20name_series.str.extract(r%22%2C%5Cs*(%5B%5E.%5D%2B)%5C.%22%2C%20expand%3DFalse).str.strip()%0A%20%20%20%20%20%20%20%20return%20raw.replace(_TITLE_MAP)%0A%0A%20%20%20%20%23%20%E8%A8%93%E7%B7%B4%E3%83%87%E3%83%BC%E3%82%BF%E3%81%8B%E3%82%89%E8%A3%9C%E5%AE%8C%E5%80%A4%E3%82%92%E5%AD%A6%E7%BF%92%EF%BC%88%E3%83%AA%E3%83%BC%E3%82%AF%E9%98%B2%E6%AD%A2%EF%BC%89%0A%20%20%20%20_train_title%20%3D%20_make_title(train_df%5B%22Name%22%5D)%0A%20%20%20%20_age_median_by_title%20%3D%20train_df.assign(_t%3D_train_title).groupby(%22_t%22)%5B%22Age%22%5D.median()%0A%20%20%20%20_age_median_overall%20%3D%20train_df%5B%22Age%22%5D.median()%0A%20%20%20%20_fare_median_by_pclass%20%3D%20train_df.groupby(%22Pclass%22)%5B%22Fare%22%5D.median()%0A%0A%20%20%20%20def%20preprocess(df)%3A%0A%20%20%20%20%20%20%20%20out%20%3D%20df.copy()%0A%20%20%20%20%20%20%20%20out%5B%22Title%22%5D%20%3D%20_make_title(out%5B%22Name%22%5D)%0A%20%20%20%20%20%20%20%20out%5B%22FamilySize%22%5D%20%3D%20out%5B%22SibSp%22%5D%20%2B%20out%5B%22Parch%22%5D%20%2B%201%0A%20%20%20%20%20%20%20%20out%5B%22IsAlone%22%5D%20%3D%20(out%5B%22FamilySize%22%5D%20%3D%3D%201).astype(int)%0A%20%20%20%20%20%20%20%20out%5B%22HasCabin%22%5D%20%3D%20out%5B%22Cabin%22%5D.notna().astype(int)%0A%0A%20%20%20%20%20%20%20%20age_fill%20%3D%20out%5B%22Title%22%5D.map(_age_median_by_title).fillna(_age_median_overall)%0A%20%20%20%20%20%20%20%20out%5B%22Age%22%5D%20%3D%20out%5B%22Age%22%5D.fillna(age_fill)%0A%0A%20%20%20%20%20%20%20%20fare_fill%20%3D%20out%5B%22Pclass%22%5D.map(_fare_median_by_pclass)%0A%20%20%20%20%20%20%20%20out%5B%22Fare%22%5D%20%3D%20out%5B%22Fare%22%5D.fillna(fare_fill)%0A%0A%20%20%20%20%20%20%20%20out%5B%22Embarked%22%5D%20%3D%20out%5B%22Embarked%22%5D.fillna(%22S%22)%0A%0A%20%20%20%20%20%20%20%20out%20%3D%20out%5B%5B%22Pclass%22%2C%20%22Sex%22%2C%20%22Age%22%2C%20%22SibSp%22%2C%20%22Parch%22%2C%20%22Fare%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Embarked%22%2C%20%22Title%22%2C%20%22FamilySize%22%2C%20%22IsAlone%22%2C%20%22HasCabin%22%5D%5D%0A%20%20%20%20%20%20%20%20out%20%3D%20pd.get_dummies(out%2C%20columns%3D%5B%22Sex%22%2C%20%22Embarked%22%2C%20%22Title%22%5D%2C%20drop_first%3DTrue)%0A%20%20%20%20%20%20%20%20return%20out%0A%0A%20%20%20%20X_train%20%3D%20preprocess(train_df)%0A%20%20%20%20X_test%20%3D%20preprocess(test_df).reindex(columns%3DX_train.columns%2C%20fill_value%3D0)%0A%20%20%20%20y%20%3D%20train_df%5B%22Survived%22%5D%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(f%22**%E7%89%B9%E5%BE%B4%E9%87%8F%20%7BX_train.shape%5B1%5D%7D%20%E5%80%8B**%20%EF%BD%9C%20train%20%7BX_train.shape%5B0%5D%7D%20%E8%A1%8C%20%EF%BD%9C%20test%20%7BX_test.shape%5B0%5D%7D%20%E8%A1%8C%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(f%22%E5%88%97%3A%20%60%7B'%2C%20'.join(X_train.columns)%7D%60%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(f%22%E6%AE%8B%E5%AD%98%E6%AC%A0%E6%90%8D%3A%20train%3D%7Bint(X_train.isna().sum().sum())%7D%2C%20test%3D%7Bint(X_test.isna().sum().sum())%7D%22)%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%20X_train%2C%20preprocess%2C%20y%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(RandomForestClassifier%2C%20X_train%2C%20mo%2C%20pd%2C%20y)%3A%0A%20%20%20%20from%20sklearn.model_selection%20import%20StratifiedKFold%2C%20cross_val_score%0A%0A%20%20%20%20clf%20%3D%20RandomForestClassifier(%0A%20%20%20%20%20%20%20%20n_estimators%3D400%2C%0A%20%20%20%20%20%20%20%20max_depth%3D8%2C%0A%20%20%20%20%20%20%20%20min_samples_leaf%3D2%2C%0A%20%20%20%20%20%20%20%20random_state%3D42%2C%0A%20%20%20%20%20%20%20%20n_jobs%3D-1%2C%0A%20%20%20%20)%0A%20%20%20%20cv%20%3D%20StratifiedKFold(n_splits%3D5%2C%20shuffle%3DTrue%2C%20random_state%3D42)%0A%20%20%20%20cv_scores%20%3D%20cross_val_score(clf%2C%20X_train%2C%20y%2C%20cv%3Dcv%2C%20scoring%3D%22accuracy%22%2C%20n_jobs%3D-1)%0A%0A%20%20%20%20clf.fit(X_train%2C%20y)%0A%20%20%20%20importances%20%3D%20(%0A%20%20%20%20%20%20%20%20pd.Series(clf.feature_importances_%2C%20index%3DX_train.columns)%0A%20%20%20%20%20%20%20%20.sort_values(ascending%3DFalse)%0A%20%20%20%20%20%20%20%20.round(4)%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22**5-fold%20CV%20Accuracy%3A%20%7Bcv_scores.mean()%3A.4f%7D%20%C2%B1%20%7Bcv_scores.std()%3A.4f%7D**%20%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%EF%BC%88folds%3A%20%7B'%2C%20'.join(f'%7Bs%3A.3f%7D'%20for%20s%20in%20cv_scores)%7D%EF%BC%89%22%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22**Feature%20importances**%20(full-fit%20on%20train)%22)%2C%0A%20%20%20%20%20%20%20%20importances.to_frame(%22importance%22)%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%20StratifiedKFold%2C%20cross_val_score%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%20%F0%9F%91%AA%20%E6%94%B9%E5%96%84%203%3A%20Family%20Survival%20Rate%0A%0A%20%20%20%20Titanic%20%E3%81%A7%E6%AD%B4%E5%8F%B2%E7%9A%84%E3%81%AB%E6%9C%80%E5%BC%B7%E3%81%AE%E7%89%B9%E5%BE%B4%E3%80%82%E5%AE%B6%E6%97%8F%E3%81%AE%E7%94%9F%E5%AD%98%E6%9C%89%E7%84%A1%E3%81%AF%E5%BC%B7%E3%81%84%E7%9B%B8%E9%96%A2%E3%82%92%E6%8C%81%E3%81%A4%E3%80%82%0A%0A%20%20%20%20-%20**Family%20ID**%20%3D%20%60LastName%20%2B%20Ticket%60%20%EF%BC%88%E8%8B%97%E5%AD%97%20%2B%20%E5%90%8C%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%20%3D%20%E5%AE%B6%E6%97%8F%E3%83%BB%E5%90%8C%E8%A1%8C%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%EF%BC%89%0A%20%20%20%20-%20**train**%3A%20%E8%87%AA%E5%88%86%E4%BB%A5%E5%A4%96%E3%81%AE%E5%AE%B6%E6%97%8F%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%81%AE%E5%B9%B3%E5%9D%87%E7%94%9F%E5%AD%98%EF%BC%88LOO%20%E3%81%A7%E8%87%AA%E5%B7%B1%E9%99%A4%E5%A4%96%EF%BC%89%0A%20%20%20%20-%20**test**%3A%20train%20%E5%86%85%E3%81%AE%E5%90%8C%20family%20%E3%81%AE%E5%B9%B3%E5%9D%87%E7%94%9F%E5%AD%98%0A%20%20%20%20-%20%E5%AE%B6%E6%97%8F%E4%B8%8D%E5%9C%A8%E3%81%AE%E5%A0%B4%E5%90%88%3A%20%E5%85%A8%E4%BD%93%E7%94%9F%E5%AD%98%E7%8E%87%200.384%20%E3%81%A7%E5%9F%8B%E3%82%81%E3%82%8B%0A%0A%20%20%20%20%E2%9A%A0%EF%B8%8F%20CV%20%E5%86%85%E3%81%AB%E5%BE%AE%E9%87%8F%20leakage%20%E6%AE%8B%E3%82%8B%E3%81%8C%20LB%20%E3%81%A8%E3%81%AE%E7%AA%81%E5%90%88%E3%81%9B%E3%81%A7%E5%88%A4%E5%AE%9A%E3%81%99%E3%82%8B%E6%A8%99%E6%BA%96%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20np%2C%20pd%2C%20preprocess_v2%2C%20test_df%2C%20train_df)%3A%0A%20%20%20%20def%20_get_family_id(df)%3A%0A%20%20%20%20%20%20%20%20surname%20%3D%20df%5B%22Name%22%5D.str.extract(r%22%5E(%5B%5E%2C%5D%2B)%2C%22%2C%20expand%3DFalse).str.strip()%0A%20%20%20%20%20%20%20%20return%20surname%20%2B%20%22_%22%20%2B%20df%5B%22Ticket%22%5D.astype(str)%0A%0A%20%20%20%20_train_fid%20%3D%20_get_family_id(train_df)%0A%20%20%20%20_fam_stats%20%3D%20train_df.assign(_fid%3D_train_fid).groupby(%22_fid%22)%5B%22Survived%22%5D.agg(%5B%22sum%22%2C%20%22count%22%5D)%0A%20%20%20%20_overall%20%3D%20float(train_df%5B%22Survived%22%5D.mean())%0A%0A%20%20%20%20def%20_family_rate(df%2C%20is_train)%3A%0A%20%20%20%20%20%20%20%20fids%20%3D%20_get_family_id(df)%0A%20%20%20%20%20%20%20%20fam_sum%20%3D%20fids.map(_fam_stats%5B%22sum%22%5D).fillna(0).astype(float)%0A%20%20%20%20%20%20%20%20fam_n%20%3D%20fids.map(_fam_stats%5B%22count%22%5D).fillna(0).astype(float)%0A%20%20%20%20%20%20%20%20if%20is_train%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20fam_sum%20%3D%20fam_sum%20-%20df%5B%22Survived%22%5D.astype(float).values%0A%20%20%20%20%20%20%20%20%20%20%20%20fam_n%20%3D%20fam_n%20-%201%0A%20%20%20%20%20%20%20%20rate%20%3D%20np.where(fam_n%20%3E%200%2C%20fam_sum%20%2F%20np.maximum(fam_n%2C%201)%2C%20_overall)%0A%20%20%20%20%20%20%20%20return%20pd.Series(rate%2C%20index%3Ddf.index)%2C%20(fam_n%20%3E%200).astype(int)%0A%0A%20%20%20%20_train_rate%2C%20_train_has%20%3D%20_family_rate(train_df%2C%20is_train%3DTrue)%0A%20%20%20%20_test_rate%2C%20_test_has%20%3D%20_family_rate(test_df%2C%20is_train%3DFalse)%0A%0A%20%20%20%20def%20preprocess_v3(df%2C%20fam_rate%2C%20has_fam)%3A%0A%20%20%20%20%20%20%20%20out%20%3D%20preprocess_v2(df).copy()%0A%20%20%20%20%20%20%20%20out%5B%22FamilySurvivalRate%22%5D%20%3D%20fam_rate.values%0A%20%20%20%20%20%20%20%20out%5B%22HasKnownFamily%22%5D%20%3D%20has_fam.values%0A%20%20%20%20%20%20%20%20return%20out%0A%0A%20%20%20%20X_train_v3%20%3D%20preprocess_v3(train_df%2C%20_train_rate%2C%20_train_has)%0A%20%20%20%20X_test_v3%20%3D%20preprocess_v3(test_df%2C%20_test_rate%2C%20_test_has).reindex(columns%3DX_train_v3.columns%2C%20fill_value%3D0)%0A%0A%20%20%20%20_n_with_fam_train%20%3D%20int(_train_has.sum())%0A%20%20%20%20_n_with_fam_test%20%3D%20int(_test_has.sum())%0A%20%20%20%20_family_view%20%3D%20pd.DataFrame(%7B%0A%20%20%20%20%20%20%20%20%22FamilySurvivalRate%22%3A%20_train_rate%2C%0A%20%20%20%20%20%20%20%20%22HasKnownFamily%22%3A%20_train_has%2C%0A%20%20%20%20%20%20%20%20%22Survived%22%3A%20train_df%5B%22Survived%22%5D%2C%0A%20%20%20%20%7D).head(8)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(f%22**v3%20%E7%89%B9%E5%BE%B4%E9%87%8F%20%7BX_train_v3.shape%5B1%5D%7D%20%E5%80%8B**%20(%2B2%3A%20FamilySurvivalRate%2C%20HasKnownFamily)%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(f%22%E5%AE%B6%E6%97%8F%E6%83%85%E5%A0%B1%E3%81%82%E3%82%8A%3A%20train%20%7B_n_with_fam_train%7D%2F%7Blen(train_df)%7D%20(%7B_n_with_fam_train%2Flen(train_df)%3A.0%25%7D)%20%EF%BD%9C%20test%20%7B_n_with_fam_test%7D%2F%7Blen(test_df)%7D%20(%7B_n_with_fam_test%2Flen(test_df)%3A.0%25%7D)%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22**%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%20(train%20%E5%85%88%E9%A0%AD8%E4%BB%B6)**%22)%2C%0A%20%20%20%20%20%20%20%20_family_view%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%20X_test_v3%2C%20X_train_v3%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(%0A%20%20%20%20X_train_v3%2C%0A%20%20%20%20cross_val_score%2C%0A%20%20%20%20cv_compare%2C%0A%20%20%20%20cv_compare_v2%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20models%2C%0A%20%20%20%20pd%2C%0A%20%20%20%20rcv%2C%0A%20%20%20%20y%2C%0A)%3A%0A%20%20%20%20_rows_v3%20%3D%20%5B%5D%0A%20%20%20%20for%20_name%2C%20_m%20in%20models.items()%3A%0A%20%20%20%20%20%20%20%20_scores%20%3D%20cross_val_score(_m%2C%20X_train_v3%2C%20y%2C%20cv%3Drcv%2C%20scoring%3D%22accuracy%22%2C%20n_jobs%3D-1)%0A%20%20%20%20%20%20%20%20_rows_v3.append(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22model%22%3A%20_name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22v1%22%3A%20cv_compare.loc%5B_name%2C%20%22mean%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22v2%22%3A%20cv_compare_v2.loc%5B_name%2C%20%22mean%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22v3%22%3A%20round(_scores.mean()%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22v3_std%22%3A%20round(_scores.std()%2C%204)%2C%0A%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20cv_compare_v3%20%3D%20pd.DataFrame(_rows_v3).set_index(%22model%22)%0A%20%20%20%20cv_compare_v3%5B%22%CE%94%20v2%E2%86%92v3%22%5D%20%3D%20(cv_compare_v3%5B%22v3%22%5D%20-%20cv_compare_v3%5B%22v2%22%5D).round(4).map(lambda%20x%3A%20f%22%7Bx%3A%2B.4f%7D%22)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22**v3%20CV**%20(RepeatedStratifiedKFold%205%C3%973)%20%E3%81%A8%20v1%2Fv2%20%E3%81%AE%E4%B8%A6%E3%81%B3%E6%AF%94%E8%BC%83%22)%2C%0A%20%20%20%20%20%20%20%20cv_compare_v3%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%20(cv_compare_v3%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%20%F0%9F%8E%9A%20%E6%94%B9%E5%96%84%204%3A%20%E3%83%8F%E3%82%A4%E3%83%91%E3%83%A9%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%20%2B%20%E3%83%96%E3%83%AC%E3%83%B3%E3%83%89%0A%0A%20%20%20%20-%20RF%20%2F%20HistGB%20%E3%82%92%20%60RandomizedSearchCV%60%20%E3%81%A7%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E6%9C%80%E9%81%A9%E5%8C%96%EF%BC%88n_iter%3D40%2C%205%C3%973%20CV%EF%BC%89%0A%20%20%20%20-%20%E3%83%96%E3%83%AC%E3%83%B3%E3%83%89%E3%81%AF%20%60predict_proba%60%20%E3%81%AE%E5%B9%B3%E5%9D%87%E3%81%A7%E7%94%9F%E6%88%90%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20HistGradientBoostingClassifier%2C%0A%20%20%20%20RandomForestClassifier%2C%0A%20%20%20%20X_train_v3%2C%0A%20%20%20%20cv_compare_v3%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20pd%2C%0A%20%20%20%20rcv%2C%0A%20%20%20%20y%2C%0A)%3A%0A%20%20%20%20from%20sklearn.model_selection%20import%20RandomizedSearchCV%0A%0A%20%20%20%20_rf_space%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22n_estimators%22%3A%20%5B300%2C%20500%2C%20800%5D%2C%0A%20%20%20%20%20%20%20%20%22max_depth%22%3A%20%5B6%2C%208%2C%2010%2C%2012%2C%20None%5D%2C%0A%20%20%20%20%20%20%20%20%22min_samples_leaf%22%3A%20%5B1%2C%202%2C%204%5D%2C%0A%20%20%20%20%20%20%20%20%22min_samples_split%22%3A%20%5B2%2C%205%2C%2010%5D%2C%0A%20%20%20%20%20%20%20%20%22max_features%22%3A%20%5B%22sqrt%22%2C%20%22log2%22%2C%200.5%5D%2C%0A%20%20%20%20%7D%0A%20%20%20%20_hgb_space%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22max_iter%22%3A%20%5B200%2C%20400%2C%20600%5D%2C%0A%20%20%20%20%20%20%20%20%22learning_rate%22%3A%20%5B0.03%2C%200.05%2C%200.08%2C%200.1%5D%2C%0A%20%20%20%20%20%20%20%20%22max_depth%22%3A%20%5BNone%2C%204%2C%206%2C%208%5D%2C%0A%20%20%20%20%20%20%20%20%22min_samples_leaf%22%3A%20%5B10%2C%2020%2C%2040%5D%2C%0A%20%20%20%20%20%20%20%20%22l2_regularization%22%3A%20%5B0.0%2C%200.5%2C%201.0%5D%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20rf_search%20%3D%20RandomizedSearchCV(%0A%20%20%20%20%20%20%20%20RandomForestClassifier(random_state%3D42%2C%20n_jobs%3D1)%2C%0A%20%20%20%20%20%20%20%20_rf_space%2C%20n_iter%3D40%2C%20cv%3Drcv%2C%20scoring%3D%22accuracy%22%2C%0A%20%20%20%20%20%20%20%20n_jobs%3D-1%2C%20random_state%3D42%2C%20refit%3DTrue%2C%0A%20%20%20%20).fit(X_train_v3%2C%20y)%0A%0A%20%20%20%20hgb_search%20%3D%20RandomizedSearchCV(%0A%20%20%20%20%20%20%20%20HistGradientBoostingClassifier(random_state%3D42)%2C%0A%20%20%20%20%20%20%20%20_hgb_space%2C%20n_iter%3D40%2C%20cv%3Drcv%2C%20scoring%3D%22accuracy%22%2C%0A%20%20%20%20%20%20%20%20n_jobs%3D-1%2C%20random_state%3D42%2C%20refit%3DTrue%2C%0A%20%20%20%20).fit(X_train_v3%2C%20y)%0A%0A%20%20%20%20tune_summary%20%3D%20pd.DataFrame(%7B%0A%20%20%20%20%20%20%20%20%22model%22%3A%20%5B%22RF%20(v3%20baseline)%22%2C%20%22RF%20tuned%22%2C%20%22HistGB%20(v3%20baseline)%22%2C%20%22HistGB%20tuned%22%5D%2C%0A%20%20%20%20%20%20%20%20%22CV%20mean%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20cv_compare_v3.loc%5B%22RandomForest%20(baseline)%22%2C%20%22v3%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20round(rf_search.best_score_%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20cv_compare_v3.loc%5B%22HistGradientBoosting%22%2C%20%22v3%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20round(hgb_search.best_score_%2C%204)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%7D).set_index(%22model%22)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22**RandomizedSearchCV**%20(40%20candidates%20%C3%97%2015%20folds%20%3D%20600%20fits%20per%20model)%22)%2C%0A%20%20%20%20%20%20%20%20tune_summary%2C%0A%20%20%20%20%20%20%20%20mo.md(%22**RF%20best%20params**%22)%2C%0A%20%20%20%20%20%20%20%20pd.DataFrame(%5Brf_search.best_params_%5D).T.rename(columns%3D%7B0%3A%20%22value%22%7D)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22**HistGB%20best%20params**%22)%2C%0A%20%20%20%20%20%20%20%20pd.DataFrame(%5Bhgb_search.best_params_%5D).T.rename(columns%3D%7B0%3A%20%22value%22%7D)%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%20hgb_search%2C%20rf_search%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20StratifiedKFold%2C%0A%20%20%20%20X_train_v3%2C%0A%20%20%20%20accuracy_score%2C%0A%20%20%20%20hgb_search%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20pd%2C%0A%20%20%20%20rf_search%2C%0A%20%20%20%20y%2C%0A)%3A%0A%20%20%20%20from%20sklearn.model_selection%20import%20cross_val_predict%0A%0A%20%20%20%20_oof_cv%20%3D%20StratifiedKFold(n_splits%3D5%2C%20shuffle%3DTrue%2C%20random_state%3D42)%0A%20%20%20%20_rf_oof%20%3D%20cross_val_predict(rf_search.best_estimator_%2C%20X_train_v3%2C%20y%2C%20cv%3D_oof_cv%2C%20method%3D%22predict_proba%22%2C%20n_jobs%3D-1)%5B%3A%2C%201%5D%0A%20%20%20%20_hgb_oof%20%3D%20cross_val_predict(hgb_search.best_estimator_%2C%20X_train_v3%2C%20y%2C%20cv%3D_oof_cv%2C%20method%3D%22predict_proba%22%2C%20n_jobs%3D-1)%5B%3A%2C%201%5D%0A%20%20%20%20_blend_oof%20%3D%20(_rf_oof%20%2B%20_hgb_oof)%20%2F%202%0A%0A%20%20%20%20blend_scores%20%3D%20pd.DataFrame(%7B%0A%20%20%20%20%20%20%20%20%22OOF%20accuracy%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20accuracy_score(y%2C%20_rf_oof%20%3E%3D%200.5)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20accuracy_score(y%2C%20_hgb_oof%20%3E%3D%200.5)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20accuracy_score(y%2C%20_blend_oof%20%3E%3D%200.5)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%7D%2C%20index%3D%5B%22RF%20tuned%20(OOF)%22%2C%20%22HistGB%20tuned%20(OOF)%22%2C%20%22Blend%20(avg%20proba)%22%5D).round(4)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22**OOF%20accuracy**%20(single%205-fold%2C%20%60cross_val_predict%60%20for%20proba%20averaging)%22)%2C%0A%20%20%20%20%20%20%20%20blend_scores%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(X_test_v3%2C%20hgb_search%2C%20mo%2C%20pd%2C%20rf_search%2C%20test_df)%3A%0A%20%20%20%20from%20pathlib%20import%20Path%20as%20_Path%0A%0A%20%20%20%20clf_rf%20%3D%20rf_search.best_estimator_%0A%20%20%20%20clf_hgb%20%3D%20hgb_search.best_estimator_%0A%0A%20%20%20%20_rf_proba%20%3D%20clf_rf.predict_proba(X_test_v3)%5B%3A%2C%201%5D%0A%20%20%20%20_hgb_proba%20%3D%20clf_hgb.predict_proba(X_test_v3)%5B%3A%2C%201%5D%0A%20%20%20%20_blend_proba%20%3D%20(_rf_proba%20%2B%20_hgb_proba)%20%2F%202%0A%0A%20%20%20%20preds%20%3D%20(_blend_proba%20%3E%3D%200.5).astype(int)%0A%20%20%20%20submission%20%3D%20pd.DataFrame(%7B%0A%20%20%20%20%20%20%20%20%22PassengerId%22%3A%20test_df%5B%22PassengerId%22%5D%2C%0A%20%20%20%20%20%20%20%20%22Survived%22%3A%20preds%2C%0A%20%20%20%20%7D)%0A%0A%20%20%20%20submission_path%20%3D%20_Path(__file__).parent%20%2F%20%22submission.csv%22%0A%20%20%20%20submission.to_csv(submission_path%2C%20index%3DFalse)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(f%22**%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%97%20(v4%3A%20tuned%20RF%20%2B%20tuned%20HistGB%20blend)**%3A%20%60%7Bsubmission_path.name%7D%60%20(%7Blen(submission)%7D%20%E8%A1%8C)%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(f%22**%E7%94%9F%E5%AD%98%E4%BA%88%E6%B8%AC**%3A%20%7Bint(submission%5B'Survived'%5D.sum())%7D%20%2F%20%7Blen(submission)%7D%20%3D%20%7Bsubmission%5B'Survived'%5D.mean()%3A.1%25%7D%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(f%22**%E3%83%96%E3%83%AC%E3%83%B3%E3%83%89%20proba%20%E5%88%86%E5%B8%83**%3A%20mean%3D%7B_blend_proba.mean()%3A.3f%7D%2C%20%E2%89%A50.5%20%3D%20%7B(_blend_proba%20%3E%3D%200.5).sum()%7D%22)%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%20%F0%9F%94%81%20%E6%94%B9%E5%96%84%201%3A%20CV%20%E3%82%92%20repeated%20%E3%81%AB%20%2B%20GBM%20%E3%82%92%E4%BD%B5%E8%B5%B0%0A%0A%20%20%20%205-fold%20%E3%81%AF%E4%B9%B1%E6%95%B0%E3%81%A7%20%C2%B11pt%20%E3%81%90%E3%82%89%E3%81%84%E5%8B%95%E3%81%8F%E3%80%82%60RepeatedStratifiedKFold(5%2C%20n_repeats%3D3)%60%20%E3%81%A7%2015%E5%9B%9E%E5%B9%B3%E5%9D%87%E3%81%AB%E3%81%99%E3%82%8B%E3%81%A8%20CV%20%E6%8E%A8%E5%AE%9A%E5%80%A4%E3%81%8C%E5%AE%89%E5%AE%9A%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%81%A4%E3%81%84%E3%81%A7%E3%81%AB%20RF%20%E3%81%A8%20HistGradientBoostingClassifier%20%E3%82%92%E5%90%8C%E3%81%98%20CV%20%E3%81%A7%E6%AF%94%E8%BC%83%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(RandomForestClassifier%2C%20X_train%2C%20cross_val_score%2C%20mo%2C%20pd%2C%20y)%3A%0A%20%20%20%20from%20sklearn.model_selection%20import%20RepeatedStratifiedKFold%0A%20%20%20%20from%20sklearn.ensemble%20import%20HistGradientBoostingClassifier%0A%0A%20%20%20%20rcv%20%3D%20RepeatedStratifiedKFold(n_splits%3D5%2C%20n_repeats%3D3%2C%20random_state%3D42)%0A%0A%20%20%20%20models%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22RandomForest%20(baseline)%22%3A%20RandomForestClassifier(%0A%20%20%20%20%20%20%20%20%20%20%20%20n_estimators%3D400%2C%20max_depth%3D8%2C%20min_samples_leaf%3D2%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20random_state%3D42%2C%20n_jobs%3D-1%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%22HistGradientBoosting%22%3A%20HistGradientBoostingClassifier(%0A%20%20%20%20%20%20%20%20%20%20%20%20max_iter%3D300%2C%20learning_rate%3D0.05%2C%20max_depth%3D6%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20min_samples_leaf%3D20%2C%20random_state%3D42%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20_rows%20%3D%20%5B%5D%0A%20%20%20%20for%20_name%2C%20_m%20in%20models.items()%3A%0A%20%20%20%20%20%20%20%20_scores%20%3D%20cross_val_score(_m%2C%20X_train%2C%20y%2C%20cv%3Drcv%2C%20scoring%3D%22accuracy%22%2C%20n_jobs%3D-1)%0A%20%20%20%20%20%20%20%20_rows.append(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22model%22%3A%20_name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22mean%22%3A%20round(_scores.mean()%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22std%22%3A%20round(_scores.std()%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min%22%3A%20round(_scores.min()%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max%22%3A%20round(_scores.max()%2C%204)%2C%0A%20%20%20%20%20%20%20%20%7D)%0A%0A%20%20%20%20cv_compare%20%3D%20pd.DataFrame(_rows).set_index(%22model%22)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22**RepeatedStratifiedKFold(5%C3%973%20%3D%2015%20folds)**%20%E3%81%A7%E6%AF%94%E8%BC%83%22)%2C%0A%20%20%20%20%20%20%20%20cv_compare%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%20HistGradientBoostingClassifier%2C%20cv_compare%2C%20models%2C%20rcv%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%20%F0%9F%8E%AB%20%E6%94%B9%E5%96%84%202%3A%20Ticket%20%E3%83%99%E3%83%BC%E3%82%B9%E7%89%B9%E5%BE%B4%E9%87%8F%0A%0A%20%20%20%20%60Ticket%60%20%E3%82%92%E8%A6%8B%E3%82%8B%E3%81%A8%E3%80%81%E5%90%8C%E3%81%98%E7%95%AA%E5%8F%B7%E3%81%A7%E8%A4%87%E6%95%B0%E4%BA%BA%E3%81%8C%E4%B9%97%E8%88%B9%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%8C%E5%A4%9A%E3%81%84%EF%BC%88%E5%AE%B6%E6%97%8F%E3%83%BB%E5%8F%8B%E4%BA%BA%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%EF%BC%89%E3%80%82%0A%0A%20%20%20%20-%20**TicketGroupSize**%3A%20%E5%90%8C%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%BA%BA%E6%95%B0%EF%BC%88train%2Btest%20%E7%B5%90%E5%90%88%E3%81%A7%E9%9B%86%E8%A8%88%E3%80%81%E3%81%93%E3%82%8C%E3%81%AF%20target%20leakage%20%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%EF%BC%89%0A%20%20%20%20-%20**FarePerPerson**%3A%20%60Fare%20%2F%20TicketGroupSize%60%E3%80%81%E9%81%8B%E8%B3%83%E3%81%AE%E7%94%9F%E5%80%A4%E3%82%88%E3%82%8A%E6%95%B4%E7%90%86%E3%81%95%E3%82%8C%E3%81%9F%E6%94%AF%E6%89%95%E3%81%84%E8%83%BD%E5%8A%9B%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(X_train%2C%20mo%2C%20pd%2C%20preprocess%2C%20test_df%2C%20train_df)%3A%0A%20%20%20%20_all_tickets%20%3D%20pd.concat(%5Btrain_df%5B%22Ticket%22%5D%2C%20test_df%5B%22Ticket%22%5D%5D)%0A%20%20%20%20_ticket_count%20%3D%20_all_tickets.value_counts()%0A%0A%20%20%20%20def%20preprocess_v2(df)%3A%0A%20%20%20%20%20%20%20%20out%20%3D%20preprocess(df).copy()%0A%20%20%20%20%20%20%20%20tg%20%3D%20df%5B%22Ticket%22%5D.map(_ticket_count).fillna(1).astype(int)%0A%20%20%20%20%20%20%20%20out%5B%22TicketGroupSize%22%5D%20%3D%20tg%0A%20%20%20%20%20%20%20%20out%5B%22FarePerPerson%22%5D%20%3D%20(out%5B%22Fare%22%5D%20%2F%20tg).round(4)%0A%20%20%20%20%20%20%20%20return%20out%0A%0A%20%20%20%20X_train_v2%20%3D%20preprocess_v2(train_df)%0A%20%20%20%20X_test_v2%20%3D%20preprocess_v2(test_df).reindex(columns%3DX_train_v2.columns%2C%20fill_value%3D0)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(f%22**v2%20%E7%89%B9%E5%BE%B4%E9%87%8F%20%7BX_train_v2.shape%5B1%5D%7D%20%E5%80%8B**%20(v1%3A%20%7BX_train.shape%5B1%5D%7D%20%E2%86%92%20%2B2)%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22%E6%96%B0%E8%A6%8F%E5%88%97%3A%20%60TicketGroupSize%60%2C%20%60FarePerPerson%60%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22**TicketGroupSize%20%E3%81%AE%E5%88%86%E5%B8%83%3A**%22)%2C%0A%20%20%20%20%20%20%20%20X_train_v2%5B%22TicketGroupSize%22%5D.value_counts().sort_index().to_frame(%22n%22)%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%20X_train_v2%2C%20preprocess_v2%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(X_train_v2%2C%20cross_val_score%2C%20cv_compare%2C%20mo%2C%20models%2C%20pd%2C%20rcv%2C%20y)%3A%0A%20%20%20%20_rows_v2%20%3D%20%5B%5D%0A%20%20%20%20for%20_name%2C%20_m%20in%20models.items()%3A%0A%20%20%20%20%20%20%20%20_scores%20%3D%20cross_val_score(_m%2C%20X_train_v2%2C%20y%2C%20cv%3Drcv%2C%20scoring%3D%22accuracy%22%2C%20n_jobs%3D-1)%0A%20%20%20%20%20%20%20%20_rows_v2.append(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22model%22%3A%20_name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22mean%22%3A%20round(_scores.mean()%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22std%22%3A%20round(_scores.std()%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22min%22%3A%20round(_scores.min()%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22max%22%3A%20round(_scores.max()%2C%204)%2C%0A%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20cv_compare_v2%20%3D%20pd.DataFrame(_rows_v2).set_index(%22model%22)%0A%0A%20%20%20%20_delta%20%3D%20(cv_compare_v2%5B%22mean%22%5D%20-%20cv_compare%5B%22mean%22%5D).round(4)%0A%20%20%20%20_summary%20%3D%20cv_compare_v2.copy()%0A%20%20%20%20_summary%5B%22%CE%94%20vs%20v1%22%5D%20%3D%20_delta.map(lambda%20x%3A%20f%22%7Bx%3A%2B.4f%7D%22)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22**v2%20%E7%89%B9%E5%BE%B4%E9%87%8F%E3%81%A7%E3%81%AE%20CV**%20(RepeatedStratifiedKFold%205%C3%973)%22)%2C%0A%20%20%20%20%20%20%20%20_summary%2C%0A%20%20%20%20%5D)%0A%20%20%20%20return%20(cv_compare_v2%2C)%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
1c6ebf7b0fed88c1896a06e6d7a8f43a