import%20marimo%0A%0A__generated_with%20%3D%20%220.24.0%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0Awith%20app.setup%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20pandas%20as%20pd%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20%E5%8B%BE%E9%85%8D%E3%83%96%E3%83%BC%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E6%B1%BA%E5%AE%9A%E6%9C%A8%20(GBDT)%20%E3%82%92%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%0A%0A%20%20%20%20%E8%A1%A8%E5%BD%A2%E5%BC%8F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%9B%9E%E5%B8%B0%E3%83%BB%E5%88%86%E9%A1%9E%E3%81%A7%E9%95%B7%E3%81%8F%E5%AE%9F%E5%8B%99%E6%A8%99%E6%BA%96%E3%81%A7%E3%81%82%E3%82%8A%E7%B6%9A%E3%81%91%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8C%0A%20%20%20%20**%E5%8B%BE%E9%85%8D%E3%83%96%E3%83%BC%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E6%B1%BA%E5%AE%9A%E6%9C%A8%20(Gradient%20Boosted%20Decision%20Trees%2C%20GBDT)**%20%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20LightGBM%20%E3%82%84%20XGBoost%20%E3%81%AF%E3%81%9D%E3%81%AE%E9%AB%98%E5%BA%A6%E3%81%AB%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E5%AE%9F%E8%A3%85%E3%81%A0%E3%81%8C%E3%80%81%E5%86%85%E9%83%A8%E3%81%AF%E3%80%8C%E6%B5%85%E3%81%84%E5%9B%9E%E5%B8%B0%E6%9C%A8%E3%82%92%0A%20%20%20%20%E6%AE%8B%E5%B7%AE%E6%96%B9%E5%90%91%E3%81%AB%E5%B0%91%E3%81%97%E3%81%9A%E3%81%A4%E8%B6%B3%E3%81%97%E8%BE%BC%E3%82%80%E3%80%8D%E3%81%A8%E3%81%84%E3%81%86%E5%8D%98%E7%B4%94%E3%81%AA%E5%8E%9F%E7%90%86%E3%81%A7%E5%8B%95%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%81%93%E3%81%AE%20notebook%20%E3%81%A7%E3%81%AF%20**%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E6%9C%AC%E4%BD%93%E3%82%92%20NumPy%20%E3%81%A0%E3%81%91**%E3%81%A7%E6%9B%B8%E3%81%8D%E8%B5%B7%E3%81%93%E3%81%97%E3%80%81%0A%20%20%20%20seaborn%20%E3%81%AE%20%60diamonds%60%20%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%EF%BC%8853%2C940%20%E4%BB%B6%EF%BC%89%E3%81%A7%E3%83%80%E3%82%A4%E3%83%A4%E3%83%A2%E3%83%B3%E3%83%89%E4%BE%A1%E6%A0%BC%E3%82%92%E5%9B%9E%E5%B8%B0%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20scikit-learn%20%E3%81%AF%20train%2Ftest%20%E5%88%86%E5%89%B2%E3%83%BB%E8%A9%95%E4%BE%A1%E6%8C%87%E6%A8%99%E3%83%BB%E6%AF%94%E8%BC%83%E5%AF%BE%E8%B1%A1%E3%81%AE%E3%83%99%E3%83%BC%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AB%E3%81%AE%E3%81%BF%E4%BD%BF%E3%81%84%E3%80%81%0A%20%20%20%20scratch%20%E5%AE%9F%E8%A3%85%E3%81%AE%E4%B8%AD%E3%81%A7%E3%81%AF%E4%B8%80%E5%88%87%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84%E3%80%82%E6%9C%80%E5%BE%8C%E3%81%AB%20LightGBM%20%2F%20scikit-learn%20%E3%81%A8%0A%20%20%20%20%E5%90%8C%E3%81%98%E3%83%86%E3%82%B9%E3%83%88%E3%83%87%E3%83%BC%E3%82%BF%E4%B8%8A%E3%81%A7%E7%B2%BE%E5%BA%A6%E3%81%A8%E9%80%9F%E5%BA%A6%E3%82%92%E6%AF%94%E8%BC%83%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%81%93%E3%81%AE%20notebook%20%E3%81%AE%E6%B5%81%E3%82%8C%0A%0A%20%20%20%201.%20**%E3%83%87%E3%83%BC%E3%82%BF%E6%BA%96%E5%82%99**%20%E2%80%94%20%60diamonds%60%20%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%80%81%E9%A0%86%E5%BA%8F%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA%E3%82%92%E6%95%B4%E6%95%B0%E3%82%B3%E3%83%BC%E3%83%89%E3%81%B8%E7%AC%A6%E5%8F%B7%E5%8C%96%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%202.%20**%E5%9B%9E%E5%B8%B0%E6%9C%A8**%20%E2%80%94%20%E5%88%86%E6%95%A3%E6%B8%9B%E5%B0%91%E5%9F%BA%E6%BA%96%E3%81%A7%E5%86%8D%E5%B8%B0%E7%9A%84%E3%81%AB%E4%BA%8C%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B%E5%9B%9E%E5%B8%B0%E6%9C%A8%E3%82%92%20NumPy%20%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%203.%20**%E5%8B%BE%E9%85%8D%E3%83%96%E3%83%BC%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0**%20%E2%80%94%20%E8%B2%A0%E3%81%AE%E5%8B%BE%E9%85%8D%EF%BC%88%3D%20%E6%AE%8B%E5%B7%AE%EF%BC%89%E3%81%AB%E6%9C%A8%E3%82%92%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%82%8B%E5%8A%A0%E6%B3%95%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E3%80%81%0A%20%20%20%20%20%20%20%E5%8F%82%E8%80%83%E5%AE%9F%E8%A3%85%E3%81%AB%E6%BD%9C%E3%82%80%20%60predict%60%20%E3%81%AE%E3%83%90%E3%82%B0%E3%82%92%E6%8C%87%E6%91%98%E3%81%97%E3%81%A6%E7%9B%B4%E3%81%99%E3%80%82%0A%20%20%20%204.%20**2%20%E6%AC%A1%E8%BF%91%E4%BC%BC%20(Newton)%20%E7%89%88**%20%E2%80%94%20XGBoost%2FLightGBM%20%E3%81%8C%E4%BD%BF%E3%81%86%E8%91%89%E5%80%A4%E3%83%BB%E5%88%86%E5%89%B2%E5%88%A9%E5%BE%97%E3%81%AE%E5%BC%8F%E3%82%92%E5%B0%8E%E3%81%8D%E3%80%81%0A%20%20%20%20%20%20%20L2%20%E6%AD%A3%E5%89%87%E5%8C%96%E3%81%A4%E3%81%8D%E3%81%AE%E6%9C%A8%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%205.%20**%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0%E5%88%86%E5%89%B2**%20%E2%80%94%20%E7%89%B9%E5%BE%B4%E9%87%8F%E3%82%92%E9%9B%A2%E6%95%A3%E3%83%93%E3%83%B3%E3%81%AB%E5%8C%BA%E5%88%87%E3%81%A3%E3%81%A6%E5%88%86%E5%89%B2%E6%8E%A2%E7%B4%A2%E3%82%92%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%97%E3%80%81%0A%20%20%20%20%20%20%20%E5%8E%B3%E5%AF%86%E6%8E%A2%E7%B4%A2%E3%81%A8%E3%81%AE%E9%80%9F%E5%BA%A6%E5%B7%AE%E3%82%92%E6%B8%AC%E3%82%8B%E3%80%82%0A%20%20%20%206.%20**%E6%AF%94%E8%BC%83**%20%E2%80%94%20scratch%20%E5%AE%9F%E8%A3%85%E3%83%BBLightGBM%E3%83%BBscikit-learn%20%E3%82%92%E5%90%8C%E4%B8%80%E3%83%86%E3%82%B9%E3%83%88%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A7%E6%AF%94%E8%BC%83%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E8%A7%A3%E8%AA%AC%E3%81%AF%E5%B8%B8%E4%BD%93%EF%BC%88%E3%81%A7%E3%81%82%E3%82%8B%E8%AA%BF%EF%BC%89%E3%81%A7%E6%9B%B8%E3%81%8D%E3%80%81%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E4%B8%80%E3%81%A4%E3%81%AE%E8%80%83%E3%81%88%E3%81%94%E3%81%A8%E3%81%AB%E5%B0%8F%E3%81%95%E3%81%AA%E3%82%BB%E3%83%AB%E3%81%AB%E5%88%86%E3%81%91%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_()%3A%0A%20%20%20%20import%20time%0A%0A%20%20%20%20import%20lightgbm%20as%20lgb%0A%20%20%20%20import%20seaborn%20as%20sns%0A%20%20%20%20from%20sklearn.ensemble%20import%20GradientBoostingRegressor%20as%20SkGradientBoostingRegressor%0A%20%20%20%20from%20sklearn.ensemble%20import%20HistGradientBoostingRegressor%20as%20SkHistGradientBoostingRegressor%0A%20%20%20%20from%20sklearn.metrics%20import%20mean_absolute_error%2C%20mean_squared_error%2C%20r2_score%0A%20%20%20%20from%20sklearn.model_selection%20import%20train_test_split%0A%0A%20%20%20%20def%20rmse(y_true%2C%20y_pred)%3A%0A%20%20%20%20%20%20%20%20return%20float(np.sqrt(mean_squared_error(y_true%2C%20y_pred)))%0A%0A%20%20%20%20versions%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22library%22%3A%20%5B%22numpy%22%2C%20%22pandas%22%2C%20%22lightgbm%22%2C%20%22seaborn%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22version%22%3A%20%5Bnp.__version__%2C%20pd.__version__%2C%20lgb.__version__%2C%20sns.__version__%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20versions%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20SkGradientBoostingRegressor%2C%0A%20%20%20%20%20%20%20%20SkHistGradientBoostingRegressor%2C%0A%20%20%20%20%20%20%20%20lgb%2C%0A%20%20%20%20%20%20%20%20mean_absolute_error%2C%0A%20%20%20%20%20%20%20%20r2_score%2C%0A%20%20%20%20%20%20%20%20rmse%2C%0A%20%20%20%20%20%20%20%20sns%2C%0A%20%20%20%20%20%20%20%20time%2C%0A%20%20%20%20%20%20%20%20train_test_split%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%201.%20%E3%83%87%E3%83%BC%E3%82%BF%E6%BA%96%E5%82%99%0A%0A%20%20%20%20%60diamonds%60%20%E3%81%AF%2053%2C940%20%E4%BB%B6%E3%81%AE%E3%83%80%E3%82%A4%E3%83%A4%E3%83%A2%E3%83%B3%E3%83%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%80%81%E9%87%8D%E3%81%95%20(%60carat%60)%E3%83%BB%E7%A0%94%E7%A3%A8%E8%A9%95%E4%BE%A1%20(%60cut%60)%E3%83%BB%0A%20%20%20%20%E8%89%B2%20(%60color%60)%E3%83%BB%E9%80%8F%E6%98%8E%E5%BA%A6%20(%60clarity%60)%20%E3%81%AA%E3%81%A9%E3%81%AE%E7%89%B9%E5%BE%B4%E9%87%8F%E3%81%A8%E4%BE%A1%E6%A0%BC%20(%60price%60%2C%20%E5%8D%98%E4%BD%8D%E3%83%89%E3%83%AB)%20%E3%82%92%E6%8C%81%E3%81%A4%E3%80%82%0A%20%20%20%20%E7%9B%AE%E7%9A%84%E3%81%AF%20%60price%60%20%E3%81%AE%E5%9B%9E%E5%B8%B0%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%60cut%60%20%2F%20%60color%60%20%2F%20%60clarity%60%20%E3%81%AE%203%20%E3%81%A4%E3%81%AF**%E9%A0%86%E5%BA%8F%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA**%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E6%B1%BA%E5%AE%9A%E6%9C%A8%E3%81%AF%E7%89%B9%E5%BE%B4%E9%87%8F%E3%81%AE%0A%20%20%20%20%E5%A4%A7%E5%B0%8F%E9%96%A2%E4%BF%82%EF%BC%88%E5%88%86%E5%89%B2%E3%81%97%E3%81%8D%E3%81%84%E5%80%A4%EF%BC%89%E3%81%97%E3%81%8B%E8%A6%8B%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%80%81%E9%A0%86%E5%BA%8F%E3%81%AB%E6%B2%BF%E3%81%A3%E3%81%9F%E6%95%B4%E6%95%B0%E3%82%B3%E3%83%BC%E3%83%89%E3%81%B8%E7%AC%A6%E5%8F%B7%E5%8C%96%E3%81%99%E3%82%8C%E3%81%B0%0A%20%20%20%20one-hot%20%E5%8C%96%E3%81%9B%E3%81%9A%E3%81%A8%E3%82%82%E8%87%AA%E7%84%B6%E3%81%AB%E6%89%B1%E3%81%88%E3%82%8B%E3%80%82%E9%A0%86%E5%BA%8F%E3%81%AF%E6%AC%A1%E3%81%AE%E3%81%A8%E3%81%8A%E3%82%8A%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20-%20%60cut%60%3A%20Fair%20%3C%20Good%20%3C%20Very%20Good%20%3C%20Premium%20%3C%20Ideal%0A%20%20%20%20-%20%60color%60%3A%20J%20%3C%20I%20%3C%20H%20%3C%20G%20%3C%20F%20%3C%20E%20%3C%20D%EF%BC%88D%20%E3%81%8C%E6%9C%80%E8%89%AF%EF%BC%89%0A%20%20%20%20-%20%60clarity%60%3A%20I1%20%3C%20SI2%20%3C%20SI1%20%3C%20VS2%20%3C%20VS1%20%3C%20VVS2%20%3C%20VVS1%20%3C%20IF%0A%0A%20%20%20%20%E3%81%BE%E3%81%9F%20%60x%60%20%2F%20%60y%60%20%2F%20%60z%60%EF%BC%88%E5%AF%B8%E6%B3%95%2C%20mm%EF%BC%89%E3%81%AB%E3%81%AF%E7%89%A9%E7%90%86%E7%9A%84%E3%81%AB%E3%81%82%E3%82%8A%E3%81%88%E3%81%AA%E3%81%84%20%600%60%20%E3%81%8C%E6%95%B0%E5%8D%81%E4%BB%B6%E6%B7%B7%E3%81%96%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF**%E3%81%9D%E3%81%AE%E8%A1%8C%E3%82%92%E9%99%A4%E5%A4%96**%E3%81%99%E3%82%8B%E6%96%B9%E9%87%9D%E3%82%92%E6%8E%A1%E3%82%8B%EF%BC%88%E6%AC%A0%E6%B8%AC%E3%82%92%200%20%E3%81%A7%E5%9F%8B%E3%82%81%E3%81%9F%E8%A8%98%E9%8C%B2%E3%81%A8%E3%81%BF%E3%81%AA%E3%81%97%E3%80%81%E6%9C%A8%E3%81%8C%0A%20%20%20%20%E5%81%BD%E3%81%AE%E5%88%86%E5%89%B2%E7%82%B9%E3%82%92%E5%AD%A6%E7%BF%92%E3%81%99%E3%82%8B%E3%81%AE%E3%82%92%E9%81%BF%E3%81%91%E3%82%8B%E3%81%9F%E3%82%81%EF%BC%89%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(sns)%3A%0A%20%20%20%20diamonds_raw%20%3D%20sns.load_dataset(%22diamonds%22)%0A%20%20%20%20_zero_dim%20%3D%20(diamonds_raw%5B%5B%22x%22%2C%20%22y%22%2C%20%22z%22%5D%5D%20%3D%3D%200).any(axis%3D1)%0A%20%20%20%20diamonds%20%3D%20diamonds_raw%5B~_zero_dim%5D.reset_index(drop%3DTrue)%0A%20%20%20%20clean_report%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22item%22%3A%20%5B%22raw%20rows%22%2C%20%22rows%20with%20zero%20x%2Fy%2Fz%22%2C%20%22rows%20after%20cleaning%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22count%22%3A%20%5Blen(diamonds_raw)%2C%20int(_zero_dim.sum())%2C%20len(diamonds)%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20clean_report%0A%20%20%20%20return%20(diamonds%2C)%0A%0A%0A%40app.cell%0Adef%20_(diamonds)%3A%0A%20%20%20%20cut_order%20%3D%20%5B%22Fair%22%2C%20%22Good%22%2C%20%22Very%20Good%22%2C%20%22Premium%22%2C%20%22Ideal%22%5D%0A%20%20%20%20color_order%20%3D%20%5B%22J%22%2C%20%22I%22%2C%20%22H%22%2C%20%22G%22%2C%20%22F%22%2C%20%22E%22%2C%20%22D%22%5D%0A%20%20%20%20clarity_order%20%3D%20%5B%22I1%22%2C%20%22SI2%22%2C%20%22SI1%22%2C%20%22VS2%22%2C%20%22VS1%22%2C%20%22VVS2%22%2C%20%22VVS1%22%2C%20%22IF%22%5D%0A%0A%20%20%20%20encoded%20%3D%20diamonds.copy()%0A%20%20%20%20encoded%5B%22cut%22%5D%20%3D%20encoded%5B%22cut%22%5D.cat.set_categories(cut_order%2C%20ordered%3DTrue).cat.codes%0A%20%20%20%20encoded%5B%22color%22%5D%20%3D%20encoded%5B%22color%22%5D.cat.set_categories(color_order%2C%20ordered%3DTrue).cat.codes%0A%20%20%20%20encoded%5B%22clarity%22%5D%20%3D%20encoded%5B%22clarity%22%5D.cat.set_categories(clarity_order%2C%20ordered%3DTrue).cat.codes%0A%0A%20%20%20%20feature_names%20%3D%20%5B%22carat%22%2C%20%22cut%22%2C%20%22color%22%2C%20%22clarity%22%2C%20%22depth%22%2C%20%22table%22%2C%20%22x%22%2C%20%22y%22%2C%20%22z%22%5D%0A%20%20%20%20X_all%20%3D%20encoded%5Bfeature_names%5D.to_numpy(dtype%3Dfloat)%0A%20%20%20%20y_all%20%3D%20encoded%5B%22price%22%5D.to_numpy(dtype%3Dfloat)%0A%20%20%20%20encoded%5Bfeature_names%20%2B%20%5B%22price%22%5D%5D.head()%0A%20%20%20%20return%20X_all%2C%20feature_names%2C%20y_all%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E5%AD%A6%E7%BF%92%E3%83%BB%E8%A9%95%E4%BE%A1%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%88%86%E5%89%B2%E3%81%A8%E3%82%B5%E3%83%96%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%0A%0A%20%20%20%20%E4%BB%96%E3%81%AE%20notebook%20%E3%81%AB%E3%81%AA%E3%82%89%E3%81%A3%E3%81%A6%20%60random_state%3D71%60%20%E3%81%A7%2075%25%20%2F%2025%25%20%E3%81%AB%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B%E3%80%82%E8%A9%95%E4%BE%A1%E3%81%AF%E3%81%A4%E3%81%AD%E3%81%AB%0A%20%20%20%20%E3%81%93%E3%81%AE**%E5%85%B1%E9%80%9A%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%83%87%E3%83%BC%E3%82%BF**%E3%81%A7%E8%A1%8C%E3%81%84%E3%80%81%E5%85%A8%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E5%85%AC%E5%B9%B3%E3%81%AB%E6%AF%94%E3%81%B9%E3%82%8B%E3%80%82%0A%0A%20%20%20%20scratch%20%E3%81%AE%20GBDT%20%E3%81%AF%E7%B4%94%E7%B2%8B%E3%81%AA%20NumPy%20%E5%AE%9F%E8%A3%85%E3%81%A7%E3%80%81%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%20C%2B%2B%20%E5%AE%9F%E8%A3%85%E3%82%88%E3%82%8A%E9%81%85%E3%81%84%E3%80%82%E3%81%9D%E3%81%93%E3%81%A7%0A%20%20%20%20**%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AF%206%2C000%20%E4%BB%B6%E3%81%AB%E3%82%B5%E3%83%96%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0**%E3%81%97%E3%81%A6%20scratch%20%E5%AE%9F%E8%A3%85%E3%81%AE%E8%A8%88%E7%AE%97%E9%87%8F%E3%82%92%E6%8A%91%E3%81%88%E3%82%8B%E3%80%82%0A%20%20%20%20LightGBM%20%E3%82%84%20scikit-learn%20%E3%81%AB%E3%82%82%E5%90%8C%E3%81%98%206%2C000%20%E4%BB%B6%E3%82%92%E4%B8%8E%E3%81%88%E3%81%A6%E6%9D%A1%E4%BB%B6%E3%82%92%E3%81%9D%E3%82%8D%E3%81%88%E3%80%81%E5%8F%82%E8%80%83%E3%81%A8%E3%81%97%E3%81%A6%0A%20%20%20%20LightGBM%20%E3%82%92%E5%85%A8%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A7%E5%AD%A6%E7%BF%92%E3%81%97%E3%81%9F%E8%A1%8C%E3%82%82%E5%88%A5%E9%80%94%E7%A4%BA%E3%81%99%E3%80%82%E3%81%95%E3%82%89%E3%81%AB%20scratch%20%E3%81%AE%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E7%94%A8%E3%81%A8%E6%A4%9C%E8%A8%BC%E7%94%A8%E3%81%AB%E5%88%86%E3%81%91%E3%80%81%E5%AD%A6%E7%BF%92%E6%9B%B2%E7%B7%9A%E3%81%A8%E6%97%A9%E6%9C%9F%E7%B5%82%E4%BA%86%E3%81%AB%E4%BD%BF%E3%81%86%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(X_all%2C%20train_test_split%2C%20y_all)%3A%0A%20%20%20%20X_train_full%2C%20X_test%2C%20y_train_full%2C%20y_test%20%3D%20train_test_split(%0A%20%20%20%20%20%20%20%20X_all%2C%20y_all%2C%20test_size%3D0.25%2C%20random_state%3D71%0A%20%20%20%20)%0A%20%20%20%20split_report%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22split%22%3A%20%5B%22train%20(full)%22%2C%20%22test%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22rows%22%3A%20%5Blen(X_train_full)%2C%20len(X_test)%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20split_report%0A%20%20%20%20return%20X_test%2C%20X_train_full%2C%20y_test%2C%20y_train_full%0A%0A%0A%40app.cell%0Adef%20_(X_train_full%2C%20train_test_split%2C%20y_train_full)%3A%0A%20%20%20%20_rng%20%3D%20np.random.default_rng(71)%0A%20%20%20%20_idx%20%3D%20_rng.choice(len(X_train_full)%2C%20size%3D6000%2C%20replace%3DFalse)%0A%20%20%20%20X_sub%20%3D%20X_train_full%5B_idx%5D%0A%20%20%20%20y_sub%20%3D%20y_train_full%5B_idx%5D%0A%20%20%20%20X_fit%2C%20X_val%2C%20y_fit%2C%20y_val%20%3D%20train_test_split(%0A%20%20%20%20%20%20%20%20X_sub%2C%20y_sub%2C%20test_size%3D0.2%2C%20random_state%3D71%0A%20%20%20%20)%0A%20%20%20%20subsample_report%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22role%22%3A%20%5B%22scratch%20train%20(sub)%22%2C%20%22%20%20-%20fit%20part%22%2C%20%22%20%20-%20valid%20part%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22rows%22%3A%20%5Blen(X_sub)%2C%20len(X_fit)%2C%20len(X_val)%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20subsample_report%0A%20%20%20%20return%20X_fit%2C%20X_sub%2C%20X_val%2C%20y_fit%2C%20y_sub%2C%20y_val%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.%20%E5%9B%9E%E5%B8%B0%E6%9C%A8%E3%82%92%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%0A%0A%20%20%20%20GBDT%20%E3%81%AE%E9%83%A8%E5%93%81%E3%81%AF**%E5%9B%9E%E5%B8%B0%E6%9C%A8**%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E5%9B%9E%E5%B8%B0%E6%9C%A8%E3%81%AF%E7%89%B9%E5%BE%B4%E9%87%8F%E7%A9%BA%E9%96%93%E3%82%92%E8%BB%B8%E3%81%AB%E5%B9%B3%E8%A1%8C%E3%81%AA%E7%9F%A9%E5%BD%A2%E3%81%B8%E5%86%8D%E5%B8%B0%E7%9A%84%E3%81%AB%0A%20%20%20%20%E5%88%86%E5%89%B2%E3%81%97%E3%80%81%E5%90%84%E9%A0%98%E5%9F%9F%EF%BC%88%E8%91%89%EF%BC%89%E3%81%A7%E5%AE%9A%E6%95%B0%E3%82%92%E4%BA%88%E6%B8%AC%E3%81%99%E3%82%8B%E3%80%82%E5%88%86%E5%89%B2%E3%81%AE%E8%89%AF%E3%81%95%E3%81%AF**%E5%88%86%E6%95%A3%E6%B8%9B%E5%B0%91**%E3%81%A7%E6%B8%AC%E3%82%8B%E3%80%82%0A%20%20%20%20%E8%A6%AA%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AE%E7%9B%AE%E7%9A%84%E5%A4%89%E6%95%B0%E3%82%92%20%24y%24%E3%80%81%E3%81%97%E3%81%8D%E3%81%84%E5%80%A4%E3%81%A7%E5%B7%A6%E5%8F%B3%E3%81%AB%E5%88%86%E3%81%91%E3%81%9F%E9%9B%86%E5%90%88%E3%82%92%20%24y_L%2C%20y_R%24%20%E3%81%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cmathrm%7BVarRed%7D%20%3D%20%5Cmathrm%7BVar%7D(y)%20-%20%5Ctfrac%7B%7Cy_L%7C%7D%7B%7Cy%7C%7D%5Cmathrm%7BVar%7D(y_L)%20-%20%5Ctfrac%7B%7Cy_R%7C%7D%7B%7Cy%7C%7D%5Cmathrm%7BVar%7D(y_R)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%82%92%E6%9C%80%E5%A4%A7%E5%8C%96%E3%81%99%E3%82%8B%E3%81%97%E3%81%8D%E3%81%84%E5%80%A4%E3%82%92%E5%85%A8%E7%89%B9%E5%BE%B4%E9%87%8F%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%8E%A2%E3%81%99%E3%80%82%E7%B4%A0%E6%9C%B4%E3%81%AB%E6%9B%B8%E3%81%8F%E3%81%A8%E5%90%84%E7%89%B9%E5%BE%B4%E9%87%8F%E3%81%AE%0A%20%20%20%20%E3%83%A6%E3%83%8B%E3%83%BC%E3%82%AF%E5%80%A4%E3%81%94%E3%81%A8%E3%81%AB%E5%B7%A6%E5%8F%B3%E3%81%B8%E5%88%86%E3%81%91%E3%81%A6%E5%88%86%E6%95%A3%E3%82%92%E6%B8%AC%E3%82%8B%E3%81%AE%E3%81%A7%0A%20%20%20%20%24O(%5Ctext%7B%E7%89%B9%E5%BE%B4%E9%87%8F%E6%95%B0%7D%20%5Ctimes%20%5Ctext%7B%E3%83%A6%E3%83%8B%E3%83%BC%E3%82%AF%E5%80%A4%E6%95%B0%7D%20%5Ctimes%20n)%24%20%E3%81%8B%E3%81%8B%E3%82%8B%E3%80%82%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E7%89%B9%E5%BE%B4%E9%87%8F%E3%81%94%E3%81%A8%E3%81%AB%0A%20%20%20%20%E4%B8%80%E5%BA%A6%E3%81%A0%E3%81%91%E3%82%BD%E3%83%BC%E3%83%88%E3%81%97%E3%80%81**%E7%B4%AF%E7%A9%8D%E5%92%8C%E3%81%A7%E5%85%A8%E5%88%86%E5%89%B2%E7%82%B9%E3%81%AE%E5%88%86%E6%95%A3%E3%82%92%E4%B8%80%E6%8B%AC%E8%A8%88%E7%AE%97**%E3%81%97%E3%81%A6%0A%20%20%20%20%24O(%5Ctext%7B%E7%89%B9%E5%BE%B4%E9%87%8F%E6%95%B0%7D%20%5Ctimes%20n%20%5Clog%20n)%24%20%E3%81%AB%E8%90%BD%E3%81%A8%E3%81%99%E3%80%82%E5%88%86%E6%95%A3%E3%81%AF%0A%20%20%20%20%24%5Cmathrm%7BVar%7D(S)%20%3D%20%5Cfrac%7B1%7D%7B%7CS%7C%7D%5Csum%20s%5E2%20-%20%5Cbar%7Bs%7D%5E2%24%20%E3%81%A8%E5%B1%95%E9%96%8B%E3%81%A7%E3%81%8D%E3%80%81%0A%20%20%20%20%24%5Csum%20s%24%20%E3%81%A8%20%24%5Csum%20s%5E2%24%20%E3%81%AE%E7%B4%AF%E7%A9%8D%E5%92%8C%E3%81%8C%E3%81%82%E3%82%8C%E3%81%B0%E4%BB%BB%E6%84%8F%E3%81%AE%E5%88%86%E5%89%B2%E4%BD%8D%E7%BD%AE%E3%81%A7%E5%AE%9A%E6%95%B0%E6%99%82%E9%96%93%E3%81%AB%E6%B1%82%E3%81%BE%E3%82%8B%E3%80%82%0A%20%20%20%20%E8%91%89%E3%81%AE%E4%BA%88%E6%B8%AC%E5%80%A4%E3%81%AF%E3%81%9D%E3%81%AE%E9%A0%98%E5%9F%9F%E3%81%AE%E7%9B%AE%E7%9A%84%E5%A4%89%E6%95%B0%E3%81%AE%E5%B9%B3%E5%9D%87%E3%81%A8%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.class_definition%0Aclass%20RegressionTree%3A%0A%20%20%20%20%22%22%22%E5%88%86%E6%95%A3%E6%B8%9B%E5%B0%91%E5%9F%BA%E6%BA%96%E3%81%A7%E6%88%90%E9%95%B7%E3%81%95%E3%81%9B%E3%82%8B%E5%9B%9E%E5%B8%B0%E6%9C%A8%EF%BC%88NumPy%20%E5%AE%9F%E8%A3%85%EF%BC%89%E3%80%82%0A%0A%20%20%20%20%E7%B4%AF%E7%A9%8D%E5%92%8C%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%90%84%E7%89%B9%E5%BE%B4%E9%87%8F%E3%81%AE%E5%85%A8%E5%88%86%E5%89%B2%E7%82%B9%E3%82%92%E4%B8%80%E6%8B%AC%E8%A9%95%E4%BE%A1%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E7%B4%A0%E6%9C%B4%E3%81%AA%E5%AE%9F%E8%A3%85%E3%82%88%E3%82%8A%E9%80%9F%E3%81%84%E3%80%82%0A%20%20%20%20%E8%91%89%E3%81%AE%E5%80%A4%E3%81%AF%E9%A0%98%E5%9F%9F%E5%86%85%E3%81%AE%E7%9B%AE%E7%9A%84%E5%A4%89%E6%95%B0%E3%81%AE%E5%B9%B3%E5%9D%87%E3%80%82%0A%20%20%20%20%22%22%22%0A%0A%20%20%20%20def%20__init__(self%2C%20max_depth%3D6%2C%20min_samples_split%3D20%2C%20min_impurity%3D1e-7)%3A%0A%20%20%20%20%20%20%20%20self.max_depth%20%3D%20max_depth%0A%20%20%20%20%20%20%20%20self.min_samples_split%20%3D%20min_samples_split%0A%20%20%20%20%20%20%20%20self.min_impurity%20%3D%20min_impurity%0A%20%20%20%20%20%20%20%20self.root%20%3D%20None%0A%0A%20%20%20%20def%20fit(self%2C%20X%2C%20y)%3A%0A%20%20%20%20%20%20%20%20self.root%20%3D%20self._grow(X%2C%20np.asarray(y%2C%20dtype%3Dfloat)%2C%20depth%3D0)%0A%20%20%20%20%20%20%20%20return%20self%0A%0A%20%20%20%20def%20_best_split(self%2C%20X%2C%20y)%3A%0A%20%20%20%20%20%20%20%20n%2C%20n_features%20%3D%20X.shape%0A%20%20%20%20%20%20%20%20best_gain%2C%20best_feat%2C%20best_thr%20%3D%200.0%2C%20-1%2C%200.0%0A%20%20%20%20%20%20%20%20total_sum%20%3D%20y.sum()%0A%20%20%20%20%20%20%20%20total_sq%20%3D%20(y%20*%20y).sum()%0A%20%20%20%20%20%20%20%20parent_var%20%3D%20total_sq%20%2F%20n%20-%20(total_sum%20%2F%20n)%20**%202%0A%20%20%20%20%20%20%20%20for%20feature_i%20in%20range(n_features)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20order%20%3D%20np.argsort(X%5B%3A%2C%20feature_i%5D%2C%20kind%3D%22stable%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20x_sorted%20%3D%20X%5Border%2C%20feature_i%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20y_sorted%20%3D%20y%5Border%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20sum_left%20%3D%20np.cumsum(y_sorted)%5B%3A-1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20sq_left%20%3D%20np.cumsum(y_sorted%20*%20y_sorted)%5B%3A-1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20count_left%20%3D%20np.arange(1%2C%20n)%0A%20%20%20%20%20%20%20%20%20%20%20%20count_right%20%3D%20n%20-%20count_left%0A%20%20%20%20%20%20%20%20%20%20%20%20sum_right%20%3D%20total_sum%20-%20sum_left%0A%20%20%20%20%20%20%20%20%20%20%20%20sq_right%20%3D%20total_sq%20-%20sq_left%0A%20%20%20%20%20%20%20%20%20%20%20%20var_left%20%3D%20sq_left%20%2F%20count_left%20-%20(sum_left%20%2F%20count_left)%20**%202%0A%20%20%20%20%20%20%20%20%20%20%20%20var_right%20%3D%20sq_right%20%2F%20count_right%20-%20(sum_right%20%2F%20count_right)%20**%202%0A%20%20%20%20%20%20%20%20%20%20%20%20gain%20%3D%20parent_var%20-%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20count_left%20%2F%20n%20*%20var_left%20%2B%20count_right%20%2F%20n%20*%20var_right%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20boundary%20%3D%20x_sorted%5B1%3A%5D%20%3E%20x_sorted%5B%3A-1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20gain%20%3D%20np.where(boundary%2C%20gain%2C%20-np.inf)%0A%20%20%20%20%20%20%20%20%20%20%20%20k%20%3D%20int(np.argmax(gain))%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20gain%5Bk%5D%20%3E%20best_gain%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_gain%20%3D%20float(gain%5Bk%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_feat%20%3D%20feature_i%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_thr%20%3D%200.5%20*%20(x_sorted%5Bk%5D%20%2B%20x_sorted%5Bk%20%2B%201%5D)%0A%20%20%20%20%20%20%20%20return%20best_gain%2C%20best_feat%2C%20best_thr%0A%0A%20%20%20%20def%20_grow(self%2C%20X%2C%20y%2C%20depth)%3A%0A%20%20%20%20%20%20%20%20n%20%3D%20len(y)%0A%20%20%20%20%20%20%20%20leaf%20%3D%20%7B%22value%22%3A%20float(y.mean())%7D%0A%20%20%20%20%20%20%20%20if%20depth%20%3E%3D%20self.max_depth%20or%20n%20%3C%20self.min_samples_split%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20leaf%0A%20%20%20%20%20%20%20%20gain%2C%20feature_i%2C%20threshold%20%3D%20self._best_split(X%2C%20y)%0A%20%20%20%20%20%20%20%20if%20feature_i%20%3C%200%20or%20gain%20%3C%3D%20self.min_impurity%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20leaf%0A%20%20%20%20%20%20%20%20mask%20%3D%20X%5B%3A%2C%20feature_i%5D%20%3C%3D%20threshold%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22feature_i%22%3A%20feature_i%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22threshold%22%3A%20threshold%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22left%22%3A%20self._grow(X%5Bmask%5D%2C%20y%5Bmask%5D%2C%20depth%20%2B%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22right%22%3A%20self._grow(X%5B~mask%5D%2C%20y%5B~mask%5D%2C%20depth%20%2B%201)%2C%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20def%20predict(self%2C%20X)%3A%0A%20%20%20%20%20%20%20%20X%20%3D%20np.asarray(X%2C%20dtype%3Dfloat)%0A%20%20%20%20%20%20%20%20out%20%3D%20np.empty(len(X)%2C%20dtype%3Dfloat)%0A%20%20%20%20%20%20%20%20self._predict_into(self.root%2C%20X%2C%20np.arange(len(X))%2C%20out)%0A%20%20%20%20%20%20%20%20return%20out%0A%0A%20%20%20%20def%20_predict_into(self%2C%20node%2C%20X%2C%20rows%2C%20out)%3A%0A%20%20%20%20%20%20%20%20if%20%22value%22%20in%20node%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20out%5Brows%5D%20%3D%20node%5B%22value%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20go_left%20%3D%20X%5Brows%2C%20node%5B%22feature_i%22%5D%5D%20%3C%3D%20node%5B%22threshold%22%5D%0A%20%20%20%20%20%20%20%20self._predict_into(node%5B%22left%22%5D%2C%20X%2C%20rows%5Bgo_left%5D%2C%20out)%0A%20%20%20%20%20%20%20%20self._predict_into(node%5B%22right%22%5D%2C%20X%2C%20rows%5B~go_left%5D%2C%20out)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E5%8D%98%E4%BD%93%E3%81%AE%E5%9B%9E%E5%B8%B0%E6%9C%A8%E3%81%AE%E5%AE%9F%E5%8A%9B%E3%82%92%E8%A6%8B%E3%82%8B%0A%0A%20%20%20%20%E3%81%BE%E3%81%9A%201%20%E6%9C%AC%E3%81%AE%E5%9B%9E%E5%B8%B0%E6%9C%A8%E3%81%A7%E4%BE%A1%E6%A0%BC%E3%82%92%E7%9B%B4%E6%8E%A5%E4%BA%88%E6%B8%AC%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%82%E6%B7%B1%E3%81%95%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B%E3%81%A8%E3%80%81%E6%B5%85%E3%81%84%E6%9C%A8%E3%81%AF%E8%A1%A8%E7%8F%BE%E5%8A%9B%E4%B8%8D%E8%B6%B3%E3%81%A7%0A%20%20%20%20%E8%AA%A4%E5%B7%AE%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%8F%E3%80%81%E6%B7%B1%E3%81%8F%E3%81%99%E3%82%8B%E3%81%A8%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AB%E9%81%8E%E5%89%B0%E9%81%A9%E5%90%88%E3%81%97%E3%81%A6%E3%81%84%E3%81%8F%E6%A7%98%E5%AD%90%E3%81%8C%E5%88%86%E3%81%8B%E3%82%8B%E3%80%82%E5%8D%98%E4%BD%93%E3%81%AE%E6%9C%A8%E3%81%AF%0A%20%20%20%20%E5%88%86%E6%95%A3%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%8F%E4%B8%8D%E5%AE%89%E5%AE%9A%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81%E3%81%93%E3%82%8C%E3%81%8C%E3%83%96%E3%83%BC%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A7%E5%A4%9A%E6%95%B0%E3%81%AE%E6%B5%85%E3%81%84%E6%9C%A8%E3%82%92%E8%B6%B3%E3%81%97%E8%BE%BC%E3%82%80%E5%8B%95%E6%A9%9F%E3%81%AB%E3%81%AA%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_(X_fit%2C%20X_test%2C%20rmse%2C%20y_fit%2C%20y_test)%3A%0A%20%20%20%20single_tree_rows%20%3D%20%5B%5D%0A%20%20%20%20for%20_depth%20in%20%5B2%2C%204%2C%206%2C%208%5D%3A%0A%20%20%20%20%20%20%20%20_tree%20%3D%20RegressionTree(max_depth%3D_depth).fit(X_fit%2C%20y_fit)%0A%20%20%20%20%20%20%20%20single_tree_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22max_depth%22%3A%20_depth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22train_RMSE%22%3A%20round(rmse(y_fit%2C%20_tree.predict(X_fit))%2C%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22test_RMSE%22%3A%20round(rmse(y_test%2C%20_tree.predict(X_test))%2C%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20single_tree_table%20%3D%20pd.DataFrame(single_tree_rows)%0A%20%20%20%20single_tree_table%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%203.%20%E5%8B%BE%E9%85%8D%E3%83%96%E3%83%BC%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%0A%0A%20%20%20%20%E3%83%96%E3%83%BC%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AF%E5%BC%B1%E5%AD%A6%E7%BF%92%E5%99%A8%E3%82%92%E9%80%90%E6%AC%A1%E7%9A%84%E3%81%AB%E8%B6%B3%E3%81%97%E8%BE%BC%E3%82%80%E5%8A%A0%E6%B3%95%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%24m%24%20%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E7%9B%AE%E3%81%AE%0A%20%20%20%20%E4%BA%88%E6%B8%AC%E3%82%92%20%24F_m%24%E3%80%81%E6%96%B0%E3%81%97%E3%81%8F%E8%B6%B3%E3%81%99%E6%9C%A8%E3%82%92%20%24h_m%24%E3%80%81%E5%AD%A6%E7%BF%92%E7%8E%87%EF%BC%88%E7%B8%AE%E5%B0%8F%E7%8E%87%2C%20shrinkage%EF%BC%89%E3%82%92%20%24%5Cnu%24%20%E3%81%A8%E3%81%99%E3%82%8B%E3%81%A8%0A%0A%20%20%20%20%24%24%0A%20%20%20%20F_m(x)%20%3D%20F_%7Bm-1%7D(x)%20%2B%20%5Cnu%5C%2C%20h_m(x)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E5%88%9D%E6%9C%9F%E5%80%A4%E3%81%AF%E7%9B%AE%E7%9A%84%E5%A4%89%E6%95%B0%E3%81%AE%E5%B9%B3%E5%9D%87%20%24F_0(x)%20%3D%20%5Cbar%7By%7D%24%20%E3%81%AB%E7%BD%AE%E3%81%8F%E3%80%82%E5%90%84%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E3%81%AF%E6%90%8D%E5%A4%B1%20%24L%24%20%E3%81%AE%0A%20%20%20%20%E8%B2%A0%E3%81%AE%E5%8B%BE%E9%85%8D%E3%81%AB%E6%9C%A8%E3%82%92%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%82%8B%E3%80%82%E4%BA%8C%E4%B9%97%E6%90%8D%E5%A4%B1%20%24L(y%2C%20F)%20%3D%20%5Ctfrac%7B1%7D%7B2%7D(y%20-%20F)%5E2%24%20%E3%81%AE%E5%A0%B4%E5%90%88%E3%80%81%0A%0A%20%20%20%20%24%24%0A%20%20%20%20-%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20F%7D%20%3D%20y%20-%20F_%7Bm-1%7D(x)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E3%81%A8%E3%81%AA%E3%82%8A%E3%80%81**%E8%B2%A0%E3%81%AE%E5%8B%BE%E9%85%8D%E3%81%AF%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E6%AE%8B%E5%B7%AE**%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E3%81%97%E3%81%9F%E3%81%8C%E3%81%A3%E3%81%A6%E4%BA%8C%E4%B9%97%E6%90%8D%E5%A4%B1%E3%81%AE%E5%8B%BE%E9%85%8D%E3%83%96%E3%83%BC%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AF%0A%20%20%20%20%E3%80%8C%E7%8F%BE%E5%9C%A8%E3%81%AE%E6%AE%8B%E5%B7%AE%E3%81%AB%E5%9B%9E%E5%B8%B0%E6%9C%A8%E3%82%92%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%80%81%E3%81%9D%E3%81%AE%E4%BA%88%E6%B8%AC%E3%82%92%20%24%5Cnu%24%20%E5%80%8D%E3%81%97%E3%81%A6%E8%B6%B3%E3%81%99%E3%80%8D%E3%81%93%E3%81%A8%E3%81%AB%E7%AD%89%E3%81%97%E3%81%84%E3%80%82%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E7%8E%87%20%24%5Cnu%24%20%E3%82%92%E5%B0%8F%E3%81%95%E3%81%8F%E3%81%99%E3%82%8B%E3%81%A8%201%20%E6%9C%AC%E3%81%82%E3%81%9F%E3%82%8A%E3%81%AE%E5%AF%84%E4%B8%8E%E3%81%8C%E6%B8%9B%E3%82%8A%E3%80%81%E9%81%8E%E5%89%B0%E9%81%A9%E5%90%88%E3%81%97%E3%81%AB%E3%81%8F%E3%81%8F%E3%81%AA%E3%82%8B%E3%81%8C%E3%80%81%0A%20%20%20%20%E5%90%8C%E3%81%98%E7%B2%BE%E5%BA%A6%E3%81%AB%E5%88%B0%E9%81%94%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E6%9C%A8%E3%81%AE%E6%9C%AC%E6%95%B0%E3%81%AF%E5%A2%97%E3%81%88%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E5%8F%82%E8%80%83%E5%AE%9F%E8%A3%85%E3%81%AE%20%60predict%60%20%E3%83%90%E3%82%B0%0A%0A%20%20%20%20%E6%9C%89%E5%90%8D%E3%81%AA%E6%95%99%E6%9D%90%20%60eriklindernoren%2FML-From-Scratch%60%20%E3%81%AE%20%60GradientBoosting%60%20%E3%81%AF%E3%80%81%0A%20%20%20%20%60fit%60%20%E3%81%A7%E3%81%AF%E5%88%9D%E6%9C%9F%E5%80%A4%E3%82%92%20%24%5Cbar%7By%7D%24%20%E3%81%AB%E5%8F%96%E3%82%8A%E3%81%AA%E3%81%8C%E3%82%89%E3%80%81%60predict%60%20%E3%81%A7%E3%81%AF%200%20%E3%81%8B%E3%82%89%E6%9C%A8%E3%81%AE%E5%AF%84%E4%B8%8E%E3%82%92%0A%20%20%20%20%E8%B6%B3%E3%81%97%E5%A7%8B%E3%82%81%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%E3%81%A4%E3%81%BE%E3%82%8A**%E5%88%9D%E6%9C%9F%E3%82%AA%E3%83%95%E3%82%BB%E3%83%83%E3%83%88%20%24F_0%20%3D%20%5Cbar%7By%7D%24%20%E3%82%92%E8%90%BD%E3%81%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B**%E3%80%82%0A%20%20%20%20%E4%BE%A1%E6%A0%BC%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%B9%B3%E5%9D%87%E3%81%8C%200%20%E3%81%8B%E3%82%89%E5%A4%A7%E3%81%8D%E3%81%8F%E9%9B%A2%E3%82%8C%E3%81%9F%E7%9B%AE%E7%9A%84%E5%A4%89%E6%95%B0%E3%81%A7%E3%81%AF%E3%80%81%E3%81%93%E3%81%AE%E6%8A%9C%E3%81%91%E3%81%AF%E4%BA%88%E6%B8%AC%E5%85%A8%E4%BD%93%E3%82%92%0A%20%20%20%20%E5%AE%9A%E6%95%B0%E5%88%86%E3%81%A0%E3%81%91%E3%81%9A%E3%82%89%E3%81%97%E3%80%81%E8%87%B4%E5%91%BD%E7%9A%84%E3%81%AA%E8%AA%A4%E5%B7%AE%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E4%BB%A5%E4%B8%8B%E3%81%A7%E3%81%AF%E5%88%9D%E6%9C%9F%E5%80%A4%20%60f0%60%20%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%E6%AD%A3%E3%81%97%E3%81%84%20%60predict%60%20%E3%81%A8%E3%80%81%E3%83%90%E3%82%B0%E3%82%92%E5%86%8D%E7%8F%BE%E3%81%97%E3%81%9F%0A%20%20%20%20%60predict_buggy%60%20%E3%81%AE%E4%B8%A1%E6%96%B9%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%80%81%E6%95%B0%E5%80%A4%E3%81%A7%E5%B7%AE%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.class_definition%0Aclass%20GradientBoostingRegressor%3A%0A%20%20%20%20%22%22%22%E4%BA%8C%E4%B9%97%E6%90%8D%E5%A4%B1%E3%81%AE%E5%8B%BE%E9%85%8D%E3%83%96%E3%83%BC%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%EF%BC%88%E5%9B%9E%E5%B8%B0%E6%9C%A8%E3%82%92%E6%AE%8B%E5%B7%AE%E3%81%AB%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%82%8B%E6%95%99%E8%82%B2%E7%94%A8%E5%AE%9F%E8%A3%85%EF%BC%89%E3%80%82%0A%0A%20%20%20%20%60predict%60%20%E3%81%AF%E5%88%9D%E6%9C%9F%E5%80%A4%20f0%20%E3%82%92%E5%90%AB%E3%82%80%E6%AD%A3%E3%81%97%E3%81%84%E5%AE%9F%E8%A3%85%E3%80%81%60predict_buggy%60%20%E3%81%AF%E5%8F%82%E8%80%83%E5%AE%9F%E8%A3%85%E3%81%AE%0A%20%20%20%20%E3%83%90%E3%82%B0%EF%BC%88f0%20%E3%82%92%E8%90%BD%E3%81%A8%E3%81%99%EF%BC%89%E3%82%92%E5%86%8D%E7%8F%BE%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%80%82%0A%20%20%20%20%22%22%22%0A%0A%20%20%20%20def%20__init__(self%2C%20n_estimators%3D100%2C%20learning_rate%3D0.1%2C%20max_depth%3D3%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min_samples_split%3D20)%3A%0A%20%20%20%20%20%20%20%20self.n_estimators%20%3D%20n_estimators%0A%20%20%20%20%20%20%20%20self.learning_rate%20%3D%20learning_rate%0A%20%20%20%20%20%20%20%20self.max_depth%20%3D%20max_depth%0A%20%20%20%20%20%20%20%20self.min_samples_split%20%3D%20min_samples_split%0A%20%20%20%20%20%20%20%20self.trees%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20self.f0%20%3D%200.0%0A%20%20%20%20%20%20%20%20self.history%20%3D%20%5B%5D%0A%0A%20%20%20%20def%20fit(self%2C%20X%2C%20y%2C%20eval_set%3DNone)%3A%0A%20%20%20%20%20%20%20%20y%20%3D%20np.asarray(y%2C%20dtype%3Dfloat)%0A%20%20%20%20%20%20%20%20self.f0%20%3D%20float(y.mean())%0A%20%20%20%20%20%20%20%20train_pred%20%3D%20np.full(len(y)%2C%20self.f0)%0A%20%20%20%20%20%20%20%20val_pred%20%3D%20None%0A%20%20%20%20%20%20%20%20if%20eval_set%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20X_val%2C%20y_val%20%3D%20eval_set%0A%20%20%20%20%20%20%20%20%20%20%20%20val_pred%20%3D%20np.full(len(y_val)%2C%20self.f0)%0A%20%20%20%20%20%20%20%20self.trees%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20self.history%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20_%20in%20range(self.n_estimators)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20residual%20%3D%20y%20-%20train_pred%0A%20%20%20%20%20%20%20%20%20%20%20%20tree%20%3D%20RegressionTree(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_depth%3Dself.max_depth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min_samples_split%3Dself.min_samples_split%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20).fit(X%2C%20residual)%0A%20%20%20%20%20%20%20%20%20%20%20%20train_pred%20%3D%20train_pred%20%2B%20self.learning_rate%20*%20tree.predict(X)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.trees.append(tree)%0A%20%20%20%20%20%20%20%20%20%20%20%20record%20%3D%20%7B%22train_rmse%22%3A%20float(np.sqrt(np.mean((y%20-%20train_pred)%20**%202)))%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20val_pred%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20val_pred%20%3D%20val_pred%20%2B%20self.learning_rate%20*%20tree.predict(X_val)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20record%5B%22val_rmse%22%5D%20%3D%20float(np.sqrt(np.mean((y_val%20-%20val_pred)%20**%202)))%0A%20%20%20%20%20%20%20%20%20%20%20%20self.history.append(record)%0A%20%20%20%20%20%20%20%20return%20self%0A%0A%20%20%20%20def%20predict(self%2C%20X)%3A%0A%20%20%20%20%20%20%20%20out%20%3D%20np.full(len(X)%2C%20self.f0)%0A%20%20%20%20%20%20%20%20for%20tree%20in%20self.trees%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20out%20%3D%20out%20%2B%20self.learning_rate%20*%20tree.predict(X)%0A%20%20%20%20%20%20%20%20return%20out%0A%0A%20%20%20%20def%20predict_buggy(self%2C%20X)%3A%0A%20%20%20%20%20%20%20%20out%20%3D%20np.zeros(len(X))%0A%20%20%20%20%20%20%20%20for%20tree%20in%20self.trees%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20out%20%3D%20out%20%2B%20self.learning_rate%20*%20tree.predict(X)%0A%20%20%20%20%20%20%20%20return%20out%0A%0A%0A%40app.cell%0Adef%20_(X_fit%2C%20X_test%2C%20X_val%2C%20rmse%2C%20y_fit%2C%20y_test%2C%20y_val)%3A%0A%20%20%20%20gbr_teaching%20%3D%20GradientBoostingRegressor(%0A%20%20%20%20%20%20%20%20n_estimators%3D100%2C%20learning_rate%3D0.1%2C%20max_depth%3D3%0A%20%20%20%20).fit(X_fit%2C%20y_fit%2C%20eval_set%3D(X_val%2C%20y_val))%0A%20%20%20%20predict_bug_table%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22predict%22%3A%20%5B%22fixed%20(with%20f0)%22%2C%20%22buggy%20(drops%20f0)%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22test_RMSE%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20round(rmse(y_test%2C%20gbr_teaching.predict(X_test))%2C%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20round(rmse(y_test%2C%20gbr_teaching.predict_buggy(X_test))%2C%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20predict_bug_table%0A%20%20%20%20return%20(gbr_teaching%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%90%E3%82%B0%E7%89%88%E3%81%AF%E3%81%8A%E3%82%88%E3%81%9D%E5%B9%B3%E5%9D%87%E4%BE%A1%E6%A0%BC%20%60f0%60%20%E3%81%AE%E3%81%B6%E3%82%93%E3%81%A0%E3%81%91%E5%85%A8%E4%BD%93%E3%81%8C%E3%81%9A%E3%82%8C%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81RMSE%20%E3%81%8C%E6%A1%81%E9%81%95%E3%81%84%E3%81%AB%E6%82%AA%E5%8C%96%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E5%88%9D%E6%9C%9F%E3%82%AA%E3%83%95%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%E3%81%A0%E3%81%91%E3%81%A7%E7%9B%B4%E3%82%8B%E3%80%81%E3%81%A8%E3%81%84%E3%81%86%E3%81%AE%E3%81%8C%E6%95%99%E8%A8%93%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%23%23%23%20%E5%AD%A6%E7%BF%92%E6%9B%B2%E7%B7%9A%0A%0A%20%20%20%20%E6%9C%A8%E3%81%AE%E6%9C%AC%E6%95%B0%E3%82%92%E5%A2%97%E3%82%84%E3%81%99%E3%81%A8%E5%AD%A6%E7%BF%92%E3%83%BB%E6%A4%9C%E8%A8%BC%20RMSE%20%E3%81%8C%E3%81%A9%E3%81%86%E4%B8%8B%E3%81%8C%E3%82%8B%E3%81%8B%E3%82%92%E8%A6%8B%E3%82%8B%E3%80%82%E5%BA%8F%E7%9B%A4%E3%81%A7%E6%80%A5%E9%80%9F%E3%81%AB%E6%94%B9%E5%96%84%E3%81%97%E3%80%81%0A%20%20%20%20%E3%82%84%E3%81%8C%E3%81%A6%E6%A4%9C%E8%A8%BC%20RMSE%20%E3%81%AE%E6%94%B9%E5%96%84%E3%81%8C%E7%B7%A9%E3%82%84%E3%81%8B%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%E3%81%93%E3%82%8C%E3%81%8C%E6%97%A9%E6%9C%9F%E7%B5%82%E4%BA%86%E3%81%AE%E6%A0%B9%E6%8B%A0%E3%81%AB%E3%81%AA%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_(gbr_teaching)%3A%0A%20%20%20%20_hist%20%3D%20pd.DataFrame(gbr_teaching.history)%0A%20%20%20%20_rounds%20%3D%20np.arange(1%2C%20len(_hist)%20%2B%201)%0A%20%20%20%20_fig%2C%20_ax%20%3D%20plt.subplots(figsize%3D(6%2C%204))%0A%20%20%20%20_ax.plot(_rounds%2C%20_hist%5B%22train_rmse%22%5D%2C%20label%3D%22train%22)%0A%20%20%20%20_ax.plot(_rounds%2C%20_hist%5B%22val_rmse%22%5D%2C%20label%3D%22valid%22)%0A%20%20%20%20_ax.set_xlabel(%22number%20of%20trees%22)%0A%20%20%20%20_ax.set_ylabel(%22RMSE%22)%0A%20%20%20%20_ax.set_title(%22Scratch%20GBDT%20learning%20curve%22)%0A%20%20%20%20_ax.legend()%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%204.%202%20%E6%AC%A1%E8%BF%91%E4%BC%BC%20(Newton)%20%E7%89%88%0A%0A%20%20%20%20XGBoost%20%E3%82%84%20LightGBM%20%E3%81%AF%E6%90%8D%E5%A4%B1%E3%82%92%202%20%E6%AC%A1%E3%81%BE%E3%81%A7%E3%83%86%E3%82%A4%E3%83%A9%E3%83%BC%E5%B1%95%E9%96%8B%E3%81%99%E3%82%8B%E3%80%82%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%20%24i%24%20%E3%81%AE%0A%20%20%20%201%20%E6%AC%A1%E5%8B%BE%E9%85%8D%20%24g_i%20%3D%20%5Cpartial_F%20L%24%E3%80%812%20%E6%AC%A1%E5%8B%BE%E9%85%8D%EF%BC%88%E3%83%98%E3%82%B7%E3%82%A2%E3%83%B3%EF%BC%89%24h_i%20%3D%20%5Cpartial_F%5E2%20L%24%20%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E3%80%81%0A%20%20%20%20%E8%91%89%20%24j%24%EF%BC%88%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E9%9B%86%E5%90%88%20%24I_j%24%EF%BC%89%E3%81%AB%E5%AE%9A%E6%95%B0%20%24w_j%24%20%E3%82%92%E7%BD%AE%E3%81%84%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AE%E6%AD%A3%E5%89%87%E5%8C%96%E3%81%A4%E3%81%8D%E7%9B%AE%E7%9A%84%E9%96%A2%E6%95%B0%E3%81%AF%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Ctilde%7BL%7D_j(w_j)%20%3D%20%5Csum_%7Bi%20%5Cin%20I_j%7D%20%5Cleft(%20g_i%20w_j%20%2B%20%5Ctfrac%7B1%7D%7B2%7D%20h_i%20w_j%5E2%20%5Cright)%20%2B%20%5Ctfrac%7B1%7D%7B2%7D%5Clambda%20w_j%5E2%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%24w_j%24%20%E3%81%A7%E5%BE%AE%E5%88%86%E3%81%97%E3%81%A6%200%20%E3%81%A8%E7%BD%AE%E3%81%8F%E3%81%A8%E3%80%81%E6%9C%80%E9%81%A9%E3%81%AA%E8%91%89%E5%80%A4%E3%81%AF%0A%0A%20%20%20%20%24%24%0A%20%20%20%20w_j%5E%5Cast%20%3D%20-%5Cfrac%7B%5Csum_%7Bi%20%5Cin%20I_j%7D%20g_i%7D%7B%5Csum_%7Bi%20%5Cin%20I_j%7D%20h_i%20%2B%20%5Clambda%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E3%81%82%E3%82%8B%E5%88%86%E5%89%B2%E3%81%A7%E5%B7%A6%E5%8F%B3%E3%81%B8%20%24I_L%2C%20I_R%24%20%E3%81%A8%E5%88%86%E3%81%91%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AE%E5%88%A9%E5%BE%97%E3%81%AF%E3%80%81%24G%20%3D%20%5Csum%20g_i%2C%5C%20H%20%3D%20%5Csum%20h_i%24%20%E3%81%A8%E3%81%97%E3%81%A6%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cmathcal%7BG%7D%20%3D%20%5Ctfrac%7B1%7D%7B2%7D%5Cleft%5B%0A%20%20%20%20%5Cfrac%7BG_L%5E2%7D%7BH_L%20%2B%20%5Clambda%7D%20%2B%20%5Cfrac%7BG_R%5E2%7D%7BH_R%20%2B%20%5Clambda%7D%20-%20%5Cfrac%7B(G_L%20%2B%20G_R)%5E2%7D%7BH%20%2B%20%5Clambda%7D%0A%20%20%20%20%5Cright%5D%20-%20%5Cgamma%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E4%BA%8C%E4%B9%97%E6%90%8D%E5%A4%B1%E3%81%A7%E3%81%AF%20%24g_i%20%3D%20F%20-%20y_i%2C%5C%20h_i%20%3D%201%24%20%E3%81%AA%E3%81%AE%E3%81%A7%20%24%5Csum%20h_i%20%3D%20%7CI_j%7C%24%20%E3%81%A8%E3%81%AA%E3%82%8A%E3%80%81%0A%20%20%20%20%24%5Clambda%20%3D%200%24%20%E3%81%AE%E3%81%A8%E3%81%8D%E8%91%89%E5%80%A4%E3%81%AF%E6%AE%8B%E5%B7%AE%E5%B9%B3%E5%9D%87%E3%80%81%E5%88%A9%E5%BE%97%E3%81%AF%E5%88%86%E6%95%A3%E6%B8%9B%E5%B0%91%E3%81%AB%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E3%80%82%E3%81%A4%E3%81%BE%E3%82%8A%20**2%20%E7%AF%80%E3%81%AE%0A%20%20%20%20%E5%AE%9F%E8%A3%85%E3%81%AF%20Newton%20%E7%89%88%E3%81%AE%20%24%5Clambda%20%3D%200%2C%5C%20h_i%20%3D%201%24%20%E3%81%A8%E3%81%84%E3%81%86%E7%89%B9%E5%88%A5%E3%81%AA%E5%A0%B4%E5%90%88**%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%24%5Clambda%24%20%E3%81%AF%0A%20%20%20%20L2%20%E6%AD%A3%E5%89%87%E5%8C%96%E3%81%A8%E3%81%97%E3%81%A6%E8%91%89%E5%80%A4%E3%82%92%200%20%E6%96%B9%E5%90%91%E3%81%B8%E7%B8%AE%E3%82%81%E3%80%81%24%5Cgamma%24%20%E3%81%AF%E5%88%86%E5%89%B2%E3%81%AB%E6%9C%80%E4%BD%8E%E5%88%A9%E5%BE%97%E3%82%92%E8%AA%B2%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E5%8B%BE%E9%85%8D%E3%83%BB%E3%83%98%E3%82%B7%E3%82%A2%E3%83%B3%E3%81%A7%E5%8B%95%E3%81%8F%E6%9C%A8%0A%0A%20%20%20%202%20%E7%AF%80%E3%81%AE%E5%88%86%E6%95%A3%E6%B8%9B%E5%B0%91%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%80%81%E4%B8%8A%E3%81%A7%E5%B0%8E%E3%81%84%E3%81%9F%E5%88%A9%E5%BE%97%20%24%5Cmathcal%7BG%7D%24%20%E3%82%92%E6%9C%80%E5%A4%A7%E5%8C%96%E3%81%97%E3%80%81%E8%91%89%E5%80%A4%E3%82%92%0A%20%20%20%20%24w_j%5E%5Cast%24%20%E3%81%A7%E7%BD%AE%E3%81%8F%E6%9C%A8%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E3%80%82%E6%9C%A8%E3%81%AF%E7%94%9F%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%20%24(X%2C%20g%2C%20h)%24%20%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8A%E3%80%81%0A%20%20%20%20%E5%88%86%E5%89%B2%E6%8E%A2%E7%B4%A2%E3%81%AF%E3%80%8C%E5%8E%B3%E5%AF%86%EF%BC%88%E3%82%BD%E3%83%BC%E3%83%88%EF%BC%8B%E7%B4%AF%E7%A9%8D%E5%92%8C%EF%BC%89%E3%80%8D%E3%81%8B%E3%80%8C%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0%E3%80%8D%E3%82%92%E9%81%B8%E3%81%B9%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E5%88%86%E5%89%B2%E3%81%94%E3%81%A8%E3%81%AE%E5%88%A9%E5%BE%97%E3%81%AF%E7%89%B9%E5%BE%B4%E9%87%8F%E9%87%8D%E8%A6%81%E5%BA%A6%EF%BC%88total%20gain%EF%BC%89%E3%81%A8%E3%81%97%E3%81%A6%E7%A9%8D%E7%AE%97%E3%81%99%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_()%3A%0A%20%20%20%20def%20newton_leaf(grad_sum%2C%20hess_sum%2C%20reg_lambda)%3A%0A%20%20%20%20%20%20%20%20return%20-grad_sum%20%2F%20(hess_sum%20%2B%20reg_lambda)%0A%0A%20%20%20%20def%20newton_gain(gl%2C%20hl%2C%20gr%2C%20hr%2C%20reg_lambda%2C%20gamma)%3A%0A%20%20%20%20%20%20%20%20total_g%2C%20total_h%20%3D%20gl%20%2B%20gr%2C%20hl%20%2B%20hr%0A%20%20%20%20%20%20%20%20score%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20gl%20*%20gl%20%2F%20(hl%20%2B%20reg_lambda)%0A%20%20%20%20%20%20%20%20%20%20%20%20%2B%20gr%20*%20gr%20%2F%20(hr%20%2B%20reg_lambda)%0A%20%20%20%20%20%20%20%20%20%20%20%20-%20total_g%20*%20total_g%20%2F%20(total_h%20%2B%20reg_lambda)%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20return%200.5%20*%20score%20-%20gamma%0A%0A%20%20%20%20def%20newton_build(X%2C%20g%2C%20h%2C%20depth%2C%20cfg%2C%20gains)%3A%0A%20%20%20%20%20%20%20%20n%20%3D%20len(g)%0A%20%20%20%20%20%20%20%20grad_sum%2C%20hess_sum%20%3D%20g.sum()%2C%20h.sum()%0A%20%20%20%20%20%20%20%20leaf%20%3D%20%7B%22value%22%3A%20float(newton_leaf(grad_sum%2C%20hess_sum%2C%20cfg%5B%22reg_lambda%22%5D))%7D%0A%20%20%20%20%20%20%20%20if%20depth%20%3E%3D%20cfg%5B%22max_depth%22%5D%20or%20n%20%3C%20cfg%5B%22min_samples_split%22%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20leaf%0A%20%20%20%20%20%20%20%20best_gain%2C%20best_feat%2C%20best_thr%20%3D%20cfg%5B%22gamma%22%5D%2C%20-1%2C%200.0%0A%20%20%20%20%20%20%20%20for%20feature_i%20in%20range(X.shape%5B1%5D)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20column%20%3D%20X%5B%3A%2C%20feature_i%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20cfg%5B%22kind%22%5D%20%3D%3D%20%22hist%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gl%20%3D%20np.cumsum(np.bincount(column%2C%20weights%3Dg%2C%20minlength%3Dcfg%5B%22nbins%22%5D))%5B%3A-1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hl%20%3D%20np.cumsum(np.bincount(column%2C%20weights%3Dh%2C%20minlength%3Dcfg%5B%22nbins%22%5D))%5B%3A-1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20count_left%20%3D%20np.cumsum(np.bincount(column%2C%20minlength%3Dcfg%5B%22nbins%22%5D))%5B%3A-1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20thresholds%20%3D%20np.arange(cfg%5B%22nbins%22%5D%20-%201%2C%20dtype%3Dfloat)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20boundary%20%3D%20count_left%20%3E%200%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20order%20%3D%20np.argsort(column%2C%20kind%3D%22stable%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x_sorted%20%3D%20column%5Border%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gl%20%3D%20np.cumsum(g%5Border%5D)%5B%3A-1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hl%20%3D%20np.cumsum(h%5Border%5D)%5B%3A-1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20count_left%20%3D%20np.arange(1%2C%20n)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20thresholds%20%3D%200.5%20*%20(x_sorted%5B%3A-1%5D%20%2B%20x_sorted%5B1%3A%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20boundary%20%3D%20x_sorted%5B1%3A%5D%20%3E%20x_sorted%5B%3A-1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20count_right%20%3D%20n%20-%20count_left%0A%20%20%20%20%20%20%20%20%20%20%20%20gr%20%3D%20grad_sum%20-%20gl%0A%20%20%20%20%20%20%20%20%20%20%20%20hr%20%3D%20hess_sum%20-%20hl%0A%20%20%20%20%20%20%20%20%20%20%20%20gain%20%3D%20newton_gain(gl%2C%20hl%2C%20gr%2C%20hr%2C%20cfg%5B%22reg_lambda%22%5D%2C%20cfg%5B%22gamma%22%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20enough%20%3D%20(count_left%20%3E%3D%20cfg%5B%22min_child%22%5D)%20%26%20(count_right%20%3E%3D%20cfg%5B%22min_child%22%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20gain%20%3D%20np.where(boundary%20%26%20enough%2C%20gain%2C%20-np.inf)%0A%20%20%20%20%20%20%20%20%20%20%20%20k%20%3D%20int(np.argmax(gain))%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20gain%5Bk%5D%20%3E%20best_gain%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_gain%2C%20best_feat%2C%20best_thr%20%3D%20float(gain%5Bk%5D)%2C%20feature_i%2C%20float(thresholds%5Bk%5D)%0A%20%20%20%20%20%20%20%20if%20best_feat%20%3C%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20leaf%0A%20%20%20%20%20%20%20%20gains%5Bbest_feat%5D%20%2B%3D%20best_gain%0A%20%20%20%20%20%20%20%20mask%20%3D%20X%5B%3A%2C%20best_feat%5D%20%3C%3D%20best_thr%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22feature_i%22%3A%20best_feat%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22threshold%22%3A%20best_thr%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22left%22%3A%20newton_build(X%5Bmask%5D%2C%20g%5Bmask%5D%2C%20h%5Bmask%5D%2C%20depth%20%2B%201%2C%20cfg%2C%20gains)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22right%22%3A%20newton_build(X%5B~mask%5D%2C%20g%5B~mask%5D%2C%20h%5B~mask%5D%2C%20depth%20%2B%201%2C%20cfg%2C%20gains)%2C%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20def%20newton_predict(node%2C%20X)%3A%0A%20%20%20%20%20%20%20%20out%20%3D%20np.empty(len(X)%2C%20dtype%3Dfloat)%0A%0A%20%20%20%20%20%20%20%20def%20descend(current%2C%20rows)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%22value%22%20in%20current%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20out%5Brows%5D%20%3D%20current%5B%22value%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%20%20go_left%20%3D%20X%5Brows%2C%20current%5B%22feature_i%22%5D%5D%20%3C%3D%20current%5B%22threshold%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20descend(current%5B%22left%22%5D%2C%20rows%5Bgo_left%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20descend(current%5B%22right%22%5D%2C%20rows%5B~go_left%5D)%0A%0A%20%20%20%20%20%20%20%20descend(node%2C%20np.arange(len(X)))%0A%20%20%20%20%20%20%20%20return%20out%0A%0A%20%20%20%20return%20newton_build%2C%20newton_predict%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%205.%20%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0%E5%88%86%E5%89%B2%E3%81%AB%E3%82%88%E3%82%8B%E9%AB%98%E9%80%9F%E5%8C%96%0A%0A%20%20%20%20%E5%8E%B3%E5%AF%86%E3%81%AA%E5%88%86%E5%89%B2%E6%8E%A2%E7%B4%A2%E3%81%AF%E3%83%8E%E3%83%BC%E3%83%89%E3%81%94%E3%81%A8%E3%81%AB%E5%85%A8%E7%89%B9%E5%BE%B4%E9%87%8F%E3%82%92%E3%82%BD%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E6%95%B0%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%0A%20%20%20%20%24O(n%20%5Clog%20n)%24%20%E3%81%8B%E3%81%8B%E3%82%8B%E3%80%82LightGBM%20%E3%81%AF%E5%90%84%E7%89%B9%E5%BE%B4%E9%87%8F%E3%82%92%E3%81%82%E3%82%89%E3%81%8B%E3%81%98%E3%82%81%E5%B0%91%E6%95%B0%E3%81%AE%E3%83%93%E3%83%B3%0A%20%20%20%20%EF%BC%88%E6%97%A2%E5%AE%9A%20255%EF%BC%89%E3%81%AB%E9%9B%A2%E6%95%A3%E5%8C%96%E3%81%97%E3%80%81**%E3%83%93%E3%83%B3%E3%81%94%E3%81%A8%E3%81%AB%E5%8B%BE%E9%85%8D%E3%83%BB%E3%83%98%E3%82%B7%E3%82%A2%E3%83%B3%E3%81%AE%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E7%A9%8D%E7%AE%97**%E3%81%97%E3%81%A6%0A%20%20%20%20%E3%83%93%E3%83%B3%E5%A2%83%E7%95%8C%E3%81%A0%E3%81%91%E3%82%92%E8%B5%B0%E6%9F%BB%E3%81%99%E3%82%8B%E3%80%821%20%E3%83%8E%E3%83%BC%E3%83%89%E3%81%82%E3%81%9F%E3%82%8A%E3%81%AE%E5%88%86%E5%89%B2%E6%8E%A2%E7%B4%A2%E3%81%AF%0A%20%20%20%20%24O(%5Ctext%7B%E7%89%B9%E5%BE%B4%E9%87%8F%E6%95%B0%7D%20%5Ctimes%20%5Ctext%7B%E3%83%93%E3%83%B3%E6%95%B0%7D)%24%20%E3%81%AB%E3%81%AA%E3%82%8A%E3%80%81%E3%81%97%E3%81%8D%E3%81%84%E5%80%A4%E3%81%AE%E5%80%99%E8%A3%9C%E3%81%8C%E3%83%93%E3%83%B3%E6%95%B0%E3%81%AB%0A%20%20%20%20%E6%8A%91%E3%81%88%E3%82%89%E3%82%8C%E3%82%8B%E3%81%9F%E3%82%81%E5%A4%A7%E5%B9%85%E3%81%AB%E9%80%9F%E3%81%8F%E3%81%AA%E3%82%8B%E3%80%82%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E5%88%86%E4%BD%8D%E7%82%B9%E3%81%A7%2064%20%E3%83%93%E3%83%B3%E3%81%AB%E5%8C%BA%E5%88%87%E3%82%8B%E3%80%82%E3%83%93%E3%83%B3%E5%8C%96%E3%81%AF%E8%BF%91%E4%BC%BC%E3%81%A0%E3%81%8C%E3%80%81%0A%20%20%20%20%E6%9C%A8%E3%81%AE%E4%BA%88%E6%B8%AC%E3%81%AF%E3%81%97%E3%81%8D%E3%81%84%E5%80%A4%E3%81%AE%E4%BD%8D%E7%BD%AE%E3%81%AB%E3%81%97%E3%81%8B%E4%BE%9D%E5%AD%98%E3%81%97%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%80%81%E5%8D%81%E5%88%86%E7%B4%B0%E3%81%8B%E3%81%84%E3%83%93%E3%83%B3%E3%81%AA%E3%82%89%E7%B2%BE%E5%BA%A6%E3%81%AF%0A%20%20%20%20%E3%81%BB%E3%81%A8%E3%82%93%E3%81%A9%E5%A4%89%E3%82%8F%E3%82%89%E3%81%AA%E3%81%84%E3%80%82%0A%0A%20%20%20%20%60GBDTScratch%60%20%E3%81%AF%E5%8E%B3%E5%AF%86%E7%89%88%E3%83%BB%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0%E7%89%88%E3%82%92%20%60split%60%20%E5%BC%95%E6%95%B0%E3%81%A7%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%E5%8A%A0%E3%81%88%E3%81%A6%0A%20%20%20%20%E8%A1%8C%E3%82%B5%E3%83%96%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%EF%BC%88%60subsample%60%2C%20bagging%EF%BC%89%E3%81%A8%E3%80%81%E6%A4%9C%E8%A8%BC%E9%9B%86%E5%90%88%20%60eval_set%60%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%0A%20%20%20%20%E6%97%A9%E6%9C%9F%E7%B5%82%E4%BA%86%EF%BC%88%60early_stopping_rounds%60%EF%BC%89%E3%82%92%E5%82%99%E3%81%88%E3%82%8B%E3%80%82%E6%97%A9%E6%9C%9F%E7%B5%82%E4%BA%86%E6%99%82%E3%81%AF%E3%80%81%E6%A4%9C%E8%A8%BC%20RMSE%20%E3%81%8C%E6%9C%80%E8%89%AF%E3%81%A0%E3%81%A3%E3%81%9F%0A%20%20%20%20%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E6%95%B0%E3%82%92%20%60best_iteration_%60%20%E3%81%AB%E8%A8%98%E9%8C%B2%E3%81%97%E3%80%81%60predict%60%20%E3%81%AF%E3%81%9D%E3%81%93%E3%81%BE%E3%81%A7%E3%81%AE%E6%9C%A8%E3%81%A0%E3%81%91%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%0A%20%20%20%20%60eval_set%60%20%E3%82%84%20%60early_stopping_rounds%60%20%E3%82%92%E6%B8%A1%E3%81%95%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%20%60best_iteration_%60%20%E3%81%AF%E5%85%A8%E6%9C%A8%E6%95%B0%E3%81%A8%E3%81%AA%E3%82%8A%E3%80%81%0A%20%20%20%20%E5%BE%93%E6%9D%A5%E3%81%A9%E3%81%8A%E3%82%8A%E5%85%A8%E3%81%A6%E3%81%AE%E6%9C%A8%E3%81%A7%E4%BA%88%E6%B8%AC%E3%81%99%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_(newton_build%2C%20newton_predict)%3A%0A%20%20%20%20class%20GBDTScratch%3A%0A%20%20%20%20%20%20%20%20%22%22%22Newton%20%E5%9E%8B%E3%81%AE%E5%8B%BE%E9%85%8D%E3%83%96%E3%83%BC%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%EF%BC%88%E5%8E%B3%E5%AF%86%EF%BC%8F%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0%E5%88%86%E5%89%B2%E3%82%92%E5%88%87%E6%9B%BF%E5%8F%AF%E8%83%BD%EF%BC%89%E3%80%82%22%22%22%0A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20n_estimators%3D200%2C%20learning_rate%3D0.1%2C%20max_depth%3D6%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20reg_lambda%3D1.0%2C%20gamma%3D0.0%2C%20min_child%3D20%2C%20min_samples_split%3D40%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20split%3D%22exact%22%2C%20max_bin%3D64%2C%20subsample%3D1.0%2C%20random_state%3D71%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20early_stopping_rounds%3DNone)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.n_estimators%20%3D%20n_estimators%0A%20%20%20%20%20%20%20%20%20%20%20%20self.learning_rate%20%3D%20learning_rate%0A%20%20%20%20%20%20%20%20%20%20%20%20self.max_depth%20%3D%20max_depth%0A%20%20%20%20%20%20%20%20%20%20%20%20self.reg_lambda%20%3D%20reg_lambda%0A%20%20%20%20%20%20%20%20%20%20%20%20self.gamma%20%3D%20gamma%0A%20%20%20%20%20%20%20%20%20%20%20%20self.min_child%20%3D%20min_child%0A%20%20%20%20%20%20%20%20%20%20%20%20self.min_samples_split%20%3D%20min_samples_split%0A%20%20%20%20%20%20%20%20%20%20%20%20self.split%20%3D%20split%0A%20%20%20%20%20%20%20%20%20%20%20%20self.max_bin%20%3D%20max_bin%0A%20%20%20%20%20%20%20%20%20%20%20%20self.subsample%20%3D%20subsample%0A%20%20%20%20%20%20%20%20%20%20%20%20self.random_state%20%3D%20random_state%0A%20%20%20%20%20%20%20%20%20%20%20%20self.early_stopping_rounds%20%3D%20early_stopping_rounds%0A%0A%20%20%20%20%20%20%20%20def%20_make_bins(self%2C%20X)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.bin_edges%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20feature_i%20in%20range(X.shape%5B1%5D)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20quantiles%20%3D%20np.linspace(0%2C%201%2C%20self.max_bin%20%2B%201)%5B1%3A-1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20edges%20%3D%20np.unique(np.quantile(X%5B%3A%2C%20feature_i%5D%2C%20quantiles))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.bin_edges.append(edges)%0A%0A%20%20%20%20%20%20%20%20def%20_apply_bins(self%2C%20X)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20binned%20%3D%20np.empty(X.shape%2C%20dtype%3Dnp.int64)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20feature_i%20in%20range(X.shape%5B1%5D)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20binned%5B%3A%2C%20feature_i%5D%20%3D%20np.searchsorted(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.bin_edges%5Bfeature_i%5D%2C%20X%5B%3A%2C%20feature_i%5D%2C%20side%3D%22right%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20binned%0A%0A%20%20%20%20%20%20%20%20def%20fit(self%2C%20X%2C%20y%2C%20eval_set%3DNone)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20y%20%3D%20np.asarray(y%2C%20dtype%3Dfloat)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.n_features_%20%3D%20X.shape%5B1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20self.feature_gains_%20%3D%20np.zeros(self.n_features_)%0A%20%20%20%20%20%20%20%20%20%20%20%20cfg%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22kind%22%3A%20self.split%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22max_depth%22%3A%20self.max_depth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22min_samples_split%22%3A%20self.min_samples_split%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22min_child%22%3A%20self.min_child%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22reg_lambda%22%3A%20self.reg_lambda%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22gamma%22%3A%20self.gamma%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20self.split%20%3D%3D%20%22hist%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self._make_bins(X)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20X_used%20%3D%20self._apply_bins(X)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cfg%5B%22nbins%22%5D%20%3D%20int(X_used.max())%20%2B%201%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20X_used%20%3D%20X%0A%20%20%20%20%20%20%20%20%20%20%20%20rng%20%3D%20np.random.default_rng(self.random_state)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.f0%20%3D%20float(y.mean())%0A%20%20%20%20%20%20%20%20%20%20%20%20train_pred%20%3D%20np.full(len(y)%2C%20self.f0)%0A%20%20%20%20%20%20%20%20%20%20%20%20val_pred%20%3D%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20eval_set%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20X_val_used%20%3D%20self._apply_bins(eval_set%5B0%5D)%20if%20self.split%20%3D%3D%20%22hist%22%20else%20eval_set%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y_val%20%3D%20np.asarray(eval_set%5B1%5D%2C%20dtype%3Dfloat)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20val_pred%20%3D%20np.full(len(y_val)%2C%20self.f0)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.trees%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20self.history%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20self.best_iteration_%20%3D%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20best_val_rmse%20%3D%20np.inf%0A%20%20%20%20%20%20%20%20%20%20%20%20rounds_without_improvement%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20n%20%3D%20len(y)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20_%20in%20range(self.n_estimators)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20grad%20%3D%20train_pred%20-%20y%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hess%20%3D%20np.ones_like(y)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20self.subsample%20%3C%201.0%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20take%20%3D%20rng.choice(n%2C%20size%3Dint(self.subsample%20*%20n)%2C%20replace%3DFalse)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20take%20%3D%20slice(None)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tree%20%3D%20newton_build(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20X_used%5Btake%5D%2C%20grad%5Btake%5D%2C%20hess%5Btake%5D%2C%200%2C%20cfg%2C%20self.feature_gains_%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20train_pred%20%3D%20train_pred%20%2B%20self.learning_rate%20*%20newton_predict(tree%2C%20X_used)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.trees.append(tree)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20record%20%3D%20%7B%22train_rmse%22%3A%20float(np.sqrt(np.mean((y%20-%20train_pred)%20**%202)))%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20val_pred%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20val_pred%20%3D%20val_pred%20%2B%20self.learning_rate%20*%20newton_predict(tree%2C%20X_val_used)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20record%5B%22val_rmse%22%5D%20%3D%20float(np.sqrt(np.mean((y_val%20-%20val_pred)%20**%202)))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.history.append(record)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20val_pred%20is%20not%20None%20and%20self.early_stopping_rounds%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20record%5B%22val_rmse%22%5D%20%3C%20best_val_rmse%20-%201e-9%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_val_rmse%20%3D%20record%5B%22val_rmse%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.best_iteration_%20%3D%20len(self.trees)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rounds_without_improvement%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rounds_without_improvement%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20rounds_without_improvement%20%3E%3D%20self.early_stopping_rounds%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20self.best_iteration_%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.best_iteration_%20%3D%20len(self.trees)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self%0A%0A%20%20%20%20%20%20%20%20def%20predict(self%2C%20X)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20X_used%20%3D%20self._apply_bins(X)%20if%20self.split%20%3D%3D%20%22hist%22%20else%20X%0A%20%20%20%20%20%20%20%20%20%20%20%20out%20%3D%20np.full(len(X_used)%2C%20self.f0)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20tree%20in%20self.trees%5B%3A%20self.best_iteration_%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20out%20%3D%20out%20%2B%20self.learning_rate%20*%20newton_predict(tree%2C%20X_used)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20out%0A%0A%20%20%20%20return%20(GBDTScratch%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E5%8E%B3%E5%AF%86%E6%8E%A2%E7%B4%A2%E3%81%A8%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0%E6%8E%A2%E7%B4%A2%E3%81%AE%E9%80%9F%E5%BA%A6%E3%83%BB%E7%B2%BE%E5%BA%A6%E6%AF%94%E8%BC%83%0A%0A%20%20%20%20%E5%90%8C%E3%81%98%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%A7%E5%8E%B3%E5%AF%86%E7%89%88%E3%81%A8%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0%E7%89%88%E3%82%92%E5%AD%A6%E7%BF%92%E3%81%97%E3%80%81%E5%AD%A6%E7%BF%92%E6%99%82%E9%96%93%E3%81%A8%0A%20%20%20%20%E3%83%86%E3%82%B9%E3%83%88%20RMSE%20%E3%82%92%E6%AF%94%E3%81%B9%E3%82%8B%E3%80%82%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0%E7%89%88%E3%81%AF%E3%81%97%E3%81%8D%E3%81%84%E5%80%A4%E5%80%99%E8%A3%9C%E3%82%92%E3%83%93%E3%83%B3%E6%95%B0%E3%81%AB%E6%8A%91%E3%81%88%E3%82%8B%E3%81%B6%E3%82%93%E9%80%9F%E3%81%8F%E3%80%81%0A%20%20%20%20%E7%B2%BE%E5%BA%A6%E3%81%AF%E3%81%BB%E3%81%BC%E5%A4%89%E3%82%8F%E3%82%89%E3%81%AA%E3%81%84%E3%81%AF%E3%81%9A%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E3%81%93%E3%81%93%E3%81%A7%E5%BE%97%E3%81%9F%E5%AD%A6%E7%BF%92%E6%B8%88%E3%81%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8%E5%AD%A6%E7%BF%92%E6%99%82%E9%96%93%E3%81%AF%0A%20%20%20%20%E6%9C%80%E5%BE%8C%E3%81%AE%E7%B7%8F%E5%90%88%E6%AF%94%E8%BC%83%E3%81%A7%E3%82%82%E5%86%8D%E5%88%A9%E7%94%A8%E3%81%99%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_(GBDTScratch%2C%20X_sub%2C%20X_test%2C%20rmse%2C%20time%2C%20y_sub%2C%20y_test)%3A%0A%20%20%20%20split_finder_rows%20%3D%20%5B%5D%0A%20%20%20%20gbdt_exact%20%3D%20None%0A%20%20%20%20gbdt_hist%20%3D%20None%0A%20%20%20%20exact_seconds%20%3D%200.0%0A%20%20%20%20hist_seconds%20%3D%200.0%0A%20%20%20%20for%20_kind%20in%20%5B%22exact%22%2C%20%22hist%22%5D%3A%0A%20%20%20%20%20%20%20%20_t0%20%3D%20time.perf_counter()%0A%20%20%20%20%20%20%20%20_model%20%3D%20GBDTScratch(%0A%20%20%20%20%20%20%20%20%20%20%20%20n_estimators%3D200%2C%20learning_rate%3D0.1%2C%20max_depth%3D6%2C%20split%3D_kind%0A%20%20%20%20%20%20%20%20).fit(X_sub%2C%20y_sub)%0A%20%20%20%20%20%20%20%20_elapsed%20%3D%20time.perf_counter()%20-%20_t0%0A%20%20%20%20%20%20%20%20if%20_kind%20%3D%3D%20%22exact%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20gbdt_exact%20%3D%20_model%0A%20%20%20%20%20%20%20%20%20%20%20%20exact_seconds%20%3D%20_elapsed%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20gbdt_hist%20%3D%20_model%0A%20%20%20%20%20%20%20%20%20%20%20%20hist_seconds%20%3D%20_elapsed%0A%20%20%20%20%20%20%20%20split_finder_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22split%20finder%22%3A%20_kind%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22fit_seconds%22%3A%20round(_elapsed%2C%202)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22test_RMSE%22%3A%20round(rmse(y_test%2C%20_model.predict(X_test))%2C%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20split_finder_table%20%3D%20pd.DataFrame(split_finder_rows)%0A%20%20%20%20split_finder_table%0A%20%20%20%20return%20exact_seconds%2C%20gbdt_exact%2C%20gbdt_hist%2C%20hist_seconds%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E6%97%A9%E6%9C%9F%E7%B5%82%E4%BA%86%E3%81%A8%E8%A1%8C%E3%82%B5%E3%83%96%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%EF%BC%88bagging%EF%BC%89%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99%0A%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E3%81%AF%E6%9C%A8%E3%81%AE%E6%9C%AC%E6%95%B0%E3%82%92%E5%9B%BA%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%84%E3%81%9F%E3%81%8C%E3%80%81%E5%AE%9F%E5%8B%99%E3%81%A7%E3%81%AF**%E5%BF%85%E8%A6%81%E3%81%AA%E6%9C%AC%E6%95%B0%E3%81%AF%E3%83%87%E3%83%BC%E3%82%BF%E4%BE%9D%E5%AD%98**%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E5%A4%9A%E3%81%99%E3%81%8E%E3%82%8C%E3%81%B0%E9%81%8E%E5%89%B0%E9%81%A9%E5%90%88%E3%81%97%E8%A8%88%E7%AE%97%E3%82%82%E7%84%A1%E9%A7%84%E3%81%AB%E3%81%AA%E3%82%8A%E3%80%81%E5%B0%91%E3%81%AA%E3%81%99%E3%81%8E%E3%82%8C%E3%81%B0%E6%9C%AA%E5%AD%A6%E7%BF%92%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82**%E6%97%A9%E6%9C%9F%E7%B5%82%E4%BA%86**%E3%81%AF%0A%20%20%20%20%E6%A4%9C%E8%A8%BC%E9%9B%86%E5%90%88%E3%81%AE%20RMSE%20%E3%82%92%E7%9B%A3%E8%A6%96%E3%81%97%E3%80%81%E4%B8%80%E5%AE%9A%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E6%94%B9%E5%96%84%E3%81%97%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%E5%AD%A6%E7%BF%92%E3%82%92%E6%89%93%E3%81%A1%E5%88%87%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A7%E3%80%81%0A%20%20%20%20%E6%9C%AC%E6%95%B0%E3%81%AE%E6%89%8B%E5%8B%95%E8%AA%BF%E6%95%B4%E3%82%92%E4%B8%8D%E8%A6%81%E3%81%AB%E3%81%97%E9%81%8E%E5%89%B0%E9%81%A9%E5%90%88%E3%82%92%E9%98%B2%E3%81%90%E3%80%82%0A%0A%20%20%20%20**%E8%A1%8C%E3%82%B5%E3%83%96%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%EF%BC%88bagging%EF%BC%89**%E3%81%AF%E5%90%84%E6%9C%A8%E3%82%92%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E4%B8%80%E9%83%A8%EF%BC%88%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%2080%25%EF%BC%89%E3%81%A0%E3%81%91%E3%81%A7%0A%20%20%20%20%E8%82%B2%E3%81%A6%E3%82%8B%E3%80%82%E6%9C%A8%E3%81%94%E3%81%A8%E3%81%AB%E8%A6%8B%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%81%8C%E5%A4%89%E3%82%8F%E3%82%8B%E3%81%9F%E3%82%81%E6%9C%A8%E3%81%AE%E9%96%93%E3%81%AE%E7%9B%B8%E9%96%A2%E3%81%8C%E4%B8%8B%E3%81%8C%E3%82%8A%E3%80%81%E5%B9%B3%E5%9D%87%E3%81%A8%E3%81%97%E3%81%A6%E3%81%AE%E5%88%86%E6%95%A3%E3%81%8C%0A%20%20%20%20%E6%B8%9B%E3%81%A3%E3%81%A6%E6%B1%8E%E5%8C%96%E3%81%97%E3%82%84%E3%81%99%E3%81%8F%E3%81%AA%E3%82%8B%EF%BC%88%E7%A2%BA%E7%8E%87%E7%9A%84%E5%8B%BE%E9%85%8D%E3%83%96%E3%83%BC%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9%EF%BC%89%E3%80%82%0A%0A%20%20%20%20%E4%BB%A5%E4%B8%8B%E3%81%A7%E3%81%AF%20%60n_estimators%3D400%60%20%E3%81%A8%E5%A4%9A%E3%82%81%E3%81%AB%E4%B8%8A%E9%99%90%E3%82%92%E5%8F%96%E3%82%8A%E3%80%81%60early_stopping_rounds%3D20%60%E3%83%BB%0A%20%20%20%20%60subsample%3D0.8%60%E3%83%BB%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0%E5%88%86%E5%89%B2%E3%81%A7%E5%AD%A6%E7%BF%92%E3%81%97%E3%80%81%E5%AE%9F%E9%9A%9B%E3%81%AB%E4%BD%95%E6%9C%AC%E3%81%A7%E6%89%93%E3%81%A1%E5%88%87%E3%82%89%E3%82%8C%E3%81%9F%E3%81%8B%0A%20%20%20%20(%60best_iteration_%60)%20%E3%81%A8%E3%80%81%E3%81%9D%E3%81%AE%E6%99%82%E7%82%B9%E3%81%AE%E6%A4%9C%E8%A8%BC%E3%83%BB%E3%83%86%E3%82%B9%E3%83%88%20RMSE%20%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%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_(GBDTScratch%2C%20X_fit%2C%20X_test%2C%20X_val%2C%20rmse%2C%20y_fit%2C%20y_test%2C%20y_val)%3A%0A%20%20%20%20early_stop_model%20%3D%20GBDTScratch(%0A%20%20%20%20%20%20%20%20n_estimators%3D400%2C%0A%20%20%20%20%20%20%20%20learning_rate%3D0.1%2C%0A%20%20%20%20%20%20%20%20max_depth%3D6%2C%0A%20%20%20%20%20%20%20%20split%3D%22hist%22%2C%0A%20%20%20%20%20%20%20%20subsample%3D0.8%2C%0A%20%20%20%20%20%20%20%20early_stopping_rounds%3D20%2C%0A%20%20%20%20%20%20%20%20random_state%3D71%2C%0A%20%20%20%20).fit(X_fit%2C%20y_fit%2C%20eval_set%3D(X_val%2C%20y_val))%0A%20%20%20%20early_stop_table%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22item%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22n_estimators%20(upper%20bound)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22best_iteration_%20(trees%20kept)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22trees%20actually%20trained%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22valid%20RMSE%20at%20best_iteration_%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22test%20RMSE%20at%20best_iteration_%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22value%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20400%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20early_stop_model.best_iteration_%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20len(early_stop_model.trees)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20round(early_stop_model.history%5Bearly_stop_model.best_iteration_%20-%201%5D%5B%22val_rmse%22%5D%2C%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20round(rmse(y_test%2C%20early_stop_model.predict(X_test))%2C%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20early_stop_table%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%206.%20%E4%B8%BB%E8%A6%81%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A8%E3%81%AE%E6%AF%94%E8%BC%83%0A%0A%20%20%20%20%E5%90%8C%E4%B8%80%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%83%87%E3%83%BC%E3%82%BF%E4%B8%8A%E3%81%A7%E3%80%81scratch%20%E5%AE%9F%E8%A3%85%EF%BC%88%E5%8E%B3%E5%AF%86%E3%83%BB%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0%EF%BC%89%E3%82%92%20LightGBM%E3%83%BB%0A%20%20%20%20scikit-learn%20%E3%81%AE%20GBDT%20%E3%81%A8%E6%AF%94%E3%81%B9%E3%82%8B%E3%80%82%E6%9C%A8%E3%81%AE%E6%9C%AC%E6%95%B0%E3%83%BB%E5%AD%A6%E7%BF%92%E7%8E%87%E3%83%BB%E6%9C%A8%E3%81%AE%E6%B7%B1%E3%81%95%E3%82%92%E3%81%9D%E3%82%8D%E3%81%88%E3%81%A6%E5%85%AC%E5%B9%B3%E3%81%AB%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E8%A6%8F%E6%A8%A1%E6%84%9F%E3%81%AE%E5%9F%BA%E6%BA%96%E3%81%A8%E3%81%97%E3%81%A6%E3%80%81%E3%81%A4%E3%81%AD%E3%81%AB%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%B9%B3%E5%9D%87%E3%82%92%E4%BA%88%E6%B8%AC%E3%81%99%E3%82%8B%E8%87%AA%E6%98%8E%E3%81%AA%E3%83%99%E3%83%BC%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%82%E5%85%A5%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%E5%8F%82%E8%80%83%E3%81%A8%E3%81%97%E3%81%A6%20LightGBM%20%E3%82%92**%E5%85%A8%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF**%E3%81%A7%E5%AD%A6%E7%BF%92%E3%81%97%E3%81%9F%E8%A1%8C%EF%BC%88%60LightGBM%20(full%20train)%60%EF%BC%89%E3%82%82%0A%20%20%20%20%E5%8A%A0%E3%81%88%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_(%0A%20%20%20%20SkGradientBoostingRegressor%2C%0A%20%20%20%20SkHistGradientBoostingRegressor%2C%0A%20%20%20%20X_sub%2C%0A%20%20%20%20X_test%2C%0A%20%20%20%20X_train_full%2C%0A%20%20%20%20lgb%2C%0A%20%20%20%20time%2C%0A%20%20%20%20y_sub%2C%0A%20%20%20%20y_train_full%2C%0A)%3A%0A%20%20%20%20def%20_timed(name%2C%20model%2C%20X_train%2C%20y_train)%3A%0A%20%20%20%20%20%20%20%20t0%20%3D%20time.perf_counter()%0A%20%20%20%20%20%20%20%20model.fit(X_train%2C%20y_train)%0A%20%20%20%20%20%20%20%20elapsed%20%3D%20time.perf_counter()%20-%20t0%0A%20%20%20%20%20%20%20%20return%20name%2C%20model.predict(X_test)%2C%20elapsed%0A%0A%20%20%20%20library_results%20%3D%20%5B%0A%20%20%20%20%20%20%20%20_timed(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22LightGBM%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20lgb.LGBMRegressor(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_estimators%3D200%2C%20learning_rate%3D0.1%2C%20max_depth%3D6%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20num_leaves%3D63%2C%20random_state%3D71%2C%20verbosity%3D-1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20X_sub%2C%20y_sub%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20_timed(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22sklearn%20GradientBoosting%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20SkGradientBoostingRegressor(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_estimators%3D200%2C%20learning_rate%3D0.1%2C%20max_depth%3D6%2C%20random_state%3D71%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20X_sub%2C%20y_sub%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20_timed(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22sklearn%20HistGradientBoosting%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20SkHistGradientBoostingRegressor(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_iter%3D200%2C%20learning_rate%3D0.1%2C%20max_depth%3D6%2C%20random_state%3D71%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20X_sub%2C%20y_sub%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20_timed(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22LightGBM%20(full%20train)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20lgb.LGBMRegressor(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_estimators%3D200%2C%20learning_rate%3D0.1%2C%20max_depth%3D6%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20num_leaves%3D63%2C%20random_state%3D71%2C%20verbosity%3D-1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20X_train_full%2C%20y_train_full%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%5D%0A%20%20%20%20return%20(library_results%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20X_test%2C%0A%20%20%20%20exact_seconds%2C%0A%20%20%20%20gbdt_exact%2C%0A%20%20%20%20gbdt_hist%2C%0A%20%20%20%20hist_seconds%2C%0A%20%20%20%20library_results%2C%0A%20%20%20%20mean_absolute_error%2C%0A%20%20%20%20r2_score%2C%0A%20%20%20%20rmse%2C%0A%20%20%20%20y_sub%2C%0A%20%20%20%20y_test%2C%0A)%3A%0A%20%20%20%20def%20_metrics(name%2C%20pred%2C%20seconds)%3A%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22model%22%3A%20name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22RMSE%22%3A%20round(rmse(y_test%2C%20pred)%2C%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22MAE%22%3A%20round(mean_absolute_error(y_test%2C%20pred)%2C%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22R2%22%3A%20round(r2_score(y_test%2C%20pred)%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22fit_seconds%22%3A%20round(seconds%2C%202)%2C%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20summary_rows%20%3D%20%5B%0A%20%20%20%20%20%20%20%20_metrics(%22baseline%20(mean)%22%2C%20np.full(len(y_test)%2C%20y_sub.mean())%2C%200.0)%2C%0A%20%20%20%20%20%20%20%20_metrics(%22scratch%20GBDT%20(exact)%22%2C%20gbdt_exact.predict(X_test)%2C%20exact_seconds)%2C%0A%20%20%20%20%20%20%20%20_metrics(%22scratch%20GBDT%20(histogram)%22%2C%20gbdt_hist.predict(X_test)%2C%20hist_seconds)%2C%0A%20%20%20%20%5D%0A%20%20%20%20for%20_name%2C%20_pred%2C%20_seconds%20in%20library_results%3A%0A%20%20%20%20%20%20%20%20summary_rows.append(_metrics(_name%2C%20_pred%2C%20_seconds))%0A%20%20%20%20summary_table%20%3D%20pd.DataFrame(summary_rows).sort_values(%22RMSE%22).reset_index(drop%3DTrue)%0A%20%20%20%20summary_table%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E7%89%B9%E5%BE%B4%E9%87%8F%E9%87%8D%E8%A6%81%E5%BA%A6%0A%0A%20%20%20%20scratch%20%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AF%E5%88%86%E5%89%B2%E3%81%94%E3%81%A8%E3%81%AE%E5%88%A9%E5%BE%97%E3%82%92%E7%89%B9%E5%BE%B4%E9%87%8F%E5%88%A5%E3%81%AB%E7%A9%8D%E7%AE%97%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%EF%BC%88total%20gain%EF%BC%89%E3%80%82%E3%81%93%E3%82%8C%E3%82%92%0A%20%20%20%20LightGBM%20%E3%81%AE%20%60importance_type%3D%22gain%22%60%20%E3%81%A8%E4%B8%A6%E3%81%B9%E3%81%A6%E6%AF%94%E8%BC%83%E3%81%99%E3%82%8B%E3%80%82%E3%83%80%E3%82%A4%E3%83%A4%E3%83%A2%E3%83%B3%E3%83%89%E4%BE%A1%E6%A0%BC%E3%81%AF%0A%20%20%20%20%E9%87%8D%E3%81%95%20(%60carat%60)%20%E3%81%A8%E5%AF%B8%E6%B3%95%20(%60x%60%2C%60y%60%2C%60z%60)%20%E3%81%8C%E3%81%BB%E3%81%BC%E6%94%AF%E9%85%8D%E7%9A%84%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81%E4%B8%A1%E8%80%85%E3%81%AF%E3%81%93%E3%82%8C%E3%82%92%E5%90%8C%E6%A7%98%E3%81%AB%0A%20%20%20%20%E6%8D%89%E3%81%88%E3%82%8B%E3%81%AF%E3%81%9A%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E5%80%A4%E3%81%AF%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E5%90%88%E8%A8%88%201%20%E3%81%AB%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%97%E3%81%A6%E4%B8%A6%E3%81%B9%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_(X_sub%2C%20feature_names%2C%20gbdt_hist%2C%20lgb%2C%20y_sub)%3A%0A%20%20%20%20_lgb_imp_model%20%3D%20lgb.LGBMRegressor(%0A%20%20%20%20%20%20%20%20n_estimators%3D200%2C%20learning_rate%3D0.1%2C%20max_depth%3D6%2C%0A%20%20%20%20%20%20%20%20num_leaves%3D63%2C%20random_state%3D71%2C%20verbosity%3D-1%2C%0A%20%20%20%20).fit(X_sub%2C%20y_sub)%0A%20%20%20%20_scratch_gain%20%3D%20gbdt_hist.feature_gains_%20%2F%20gbdt_hist.feature_gains_.sum()%0A%20%20%20%20_lgb_gain%20%3D%20_lgb_imp_model.booster_.feature_importance(importance_type%3D%22gain%22)%0A%20%20%20%20_lgb_gain%20%3D%20_lgb_gain%20%2F%20_lgb_gain.sum()%0A%20%20%20%20_order%20%3D%20np.argsort(_scratch_gain)%5B%3A%3A-1%5D%0A%20%20%20%20_pos%20%3D%20np.arange(len(feature_names))%0A%20%20%20%20_fig%2C%20_ax%20%3D%20plt.subplots(figsize%3D(7%2C%204))%0A%20%20%20%20_ax.bar(_pos%20-%200.2%2C%20_scratch_gain%5B_order%5D%2C%20width%3D0.4%2C%20label%3D%22scratch%20(hist)%22)%0A%20%20%20%20_ax.bar(_pos%20%2B%200.2%2C%20_lgb_gain%5B_order%5D%2C%20width%3D0.4%2C%20label%3D%22LightGBM%22)%0A%20%20%20%20_ax.set_xticks(_pos)%0A%20%20%20%20_ax.set_xticklabels(%5Bfeature_names%5Bi%5D%20for%20i%20in%20_order%5D%2C%20rotation%3D45%2C%20ha%3D%22right%22)%0A%20%20%20%20_ax.set_ylabel(%22normalized%20total%20gain%22)%0A%20%20%20%20_ax.set_title(%22Feature%20importance%3A%20scratch%20vs%20LightGBM%22)%0A%20%20%20%20_ax.legend()%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E4%BA%88%E6%B8%AC%E3%81%A8%E5%AE%9F%E6%B8%AC%E3%81%AE%E6%95%A3%E5%B8%83%E5%9B%B3%0A%0A%20%20%20%20%E3%82%82%E3%81%A3%E3%81%A8%E3%82%82%E7%B2%BE%E5%BA%A6%E3%81%AE%E8%89%AF%E3%81%8B%E3%81%A3%E3%81%9F%20scratch%20%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0%E7%89%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%80%81%E3%83%86%E3%82%B9%E3%83%88%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%AE%9F%E6%B8%AC%E4%BE%A1%E6%A0%BC%E3%81%A8%0A%20%20%20%20%E4%BA%88%E6%B8%AC%E4%BE%A1%E6%A0%BC%E3%82%92%E6%95%A3%E5%B8%83%E5%9B%B3%E3%81%A7%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%E5%AF%BE%E8%A7%92%E7%B7%9A%E3%81%AB%E6%B2%BF%E3%81%A3%E3%81%A6%E7%82%B9%E3%81%8C%E4%B8%A6%E3%81%B9%E3%81%B0%E4%BA%88%E6%B8%AC%E3%81%8C%E5%AE%9F%E6%B8%AC%E3%81%AB%E4%B8%80%E8%87%B4%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%E9%AB%98%E4%BE%A1%E6%A0%BC%E5%B8%AF%E3%81%A7%E3%81%B0%E3%82%89%E3%81%A4%E3%81%8D%E3%81%8C%E5%A2%97%E3%81%88%E3%82%8B%E3%81%AE%E3%81%AF%E3%80%81%E5%B8%8C%E5%B0%91%E3%81%A7%E9%AB%98%E4%BE%A1%E3%81%AA%E7%9F%B3%E3%81%AE%E6%95%B0%E3%81%8C%E5%B0%91%E3%81%AA%E3%81%8F%E5%AD%A6%E7%BF%92%E3%81%97%E3%81%AB%E3%81%8F%E3%81%84%E3%81%9F%E3%82%81%E3%81%A7%E3%81%82%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_(X_test%2C%20gbdt_hist%2C%20y_test)%3A%0A%20%20%20%20_pred%20%3D%20gbdt_hist.predict(X_test)%0A%20%20%20%20_lo%20%3D%20float(min(y_test.min()%2C%20_pred.min()))%0A%20%20%20%20_hi%20%3D%20float(max(y_test.max()%2C%20_pred.max()))%0A%20%20%20%20_fig%2C%20_ax%20%3D%20plt.subplots(figsize%3D(5%2C%205))%0A%20%20%20%20_ax.scatter(y_test%2C%20_pred%2C%20s%3D6%2C%20alpha%3D0.3)%0A%20%20%20%20_ax.plot(%5B_lo%2C%20_hi%5D%2C%20%5B_lo%2C%20_hi%5D%2C%20linestyle%3D%22--%22%2C%20color%3D%22black%22)%0A%20%20%20%20_ax.set_xlabel(%22actual%20price%22)%0A%20%20%20%20_ax.set_ylabel(%22predicted%20price%22)%0A%20%20%20%20_ax.set_title(%22Scratch%20GBDT%20(histogram)%3A%20predicted%20vs%20actual%22)%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%81%BE%E3%81%A8%E3%82%81%0A%0A%20%20%20%20-%20**%E5%9B%9E%E5%B8%B0%E6%9C%A8**%20%E3%82%92%E5%88%86%E6%95%A3%E6%B8%9B%E5%B0%91%E5%9F%BA%E6%BA%96%E3%81%A7%20NumPy%20%E5%AE%9F%E8%A3%85%E3%81%97%E3%80%81%E7%B4%AF%E7%A9%8D%E5%92%8C%E3%81%A7%E5%88%86%E5%89%B2%E6%8E%A2%E7%B4%A2%E3%82%92%0A%20%20%20%20%20%20%24O(%5Ctext%7B%E7%89%B9%E5%BE%B4%E9%87%8F%E6%95%B0%7D%20%5Ctimes%20n%20%5Clog%20n)%24%20%E3%81%AB%E6%8A%91%E3%81%88%E3%81%9F%E3%80%82%E5%8D%98%E4%BD%93%E3%81%AE%E6%9C%A8%E3%81%AF%E5%88%86%E6%95%A3%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%8F%E4%B8%8D%E5%AE%89%E5%AE%9A%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20-%20**%E5%8B%BE%E9%85%8D%E3%83%96%E3%83%BC%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0**%20%E3%81%AF%E6%AE%8B%E5%B7%AE%EF%BC%88%3D%20%E4%BA%8C%E4%B9%97%E6%90%8D%E5%A4%B1%E3%81%AE%E8%B2%A0%E3%81%AE%E5%8B%BE%E9%85%8D%EF%BC%89%E3%81%AB%E6%B5%85%E3%81%84%E6%9C%A8%E3%82%92%E5%BD%93%E3%81%A6%E3%81%AF%E3%82%81%E3%81%A6%0A%20%20%20%20%20%20%E8%B6%B3%E3%81%97%E8%BE%BC%E3%82%80%E5%8A%A0%E6%B3%95%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A7%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%9F%E3%80%82%E5%8F%82%E8%80%83%E5%AE%9F%E8%A3%85%E3%81%AE%20%60predict%60%20%E3%81%AF%E5%88%9D%E6%9C%9F%E5%80%A4%20%24%5Cbar%7By%7D%24%20%E3%82%92%0A%20%20%20%20%20%20%E8%90%BD%E3%81%A8%E3%81%99%E3%83%90%E3%82%B0%E3%81%8C%E3%81%82%E3%82%8A%E3%80%81%E4%BE%A1%E6%A0%BC%E5%9B%9E%E5%B8%B0%E3%81%A7%E3%81%AF%20RMSE%20%E3%81%8C%E6%A1%81%E9%81%95%E3%81%84%E3%81%AB%E6%82%AA%E5%8C%96%E3%81%99%E3%82%8B%E3%80%82%24F_0%24%20%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8C%E3%81%B0%E7%9B%B4%E3%82%8B%E3%80%82%0A%20%20%20%20-%20**Newton%20%E7%89%88**%E3%81%A7%E3%81%AF%E8%91%89%E5%80%A4%20%24w_j%5E%5Cast%20%3D%20-%5Csum%20g_i%20%2F%20(%5Csum%20h_i%20%2B%20%5Clambda)%24%E3%80%81%E5%88%86%E5%89%B2%E5%88%A9%E5%BE%97%0A%20%20%20%20%20%20%24%5Cmathcal%7BG%7D%24%20%E3%82%92%E5%B0%8E%E3%81%84%E3%81%9F%E3%80%82%E4%BA%8C%E4%B9%97%E6%90%8D%E5%A4%B1%E3%81%A7%E3%81%AF%20%24h_i%20%3D%201%24%20%E3%81%AA%E3%81%AE%E3%81%A7%E5%88%86%E6%95%A3%E6%B8%9B%E5%B0%91%E3%81%AB%20L2%20%E6%AD%A3%E5%89%87%E5%8C%96%E3%82%92%0A%20%20%20%20%20%20%E5%8A%A0%E3%81%88%E3%81%9F%E5%BD%A2%E3%81%AB%E5%B8%B0%E7%9D%80%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20-%20**%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0%E5%88%86%E5%89%B2**%E3%81%AF%E3%81%97%E3%81%8D%E3%81%84%E5%80%A4%E5%80%99%E8%A3%9C%E3%82%92%E3%83%93%E3%83%B3%E6%95%B0%E3%81%AB%E6%8A%91%E3%81%88%E3%80%81%E5%8E%B3%E5%AF%86%E6%8E%A2%E7%B4%A2%E3%82%88%E3%82%8A%E9%80%9F%E3%81%8F%E3%80%81%E7%B2%BE%E5%BA%A6%E3%81%AF%0A%20%20%20%20%20%20%E3%81%BB%E3%81%BC%E5%90%8C%E7%AD%89%E3%81%A0%E3%81%A3%E3%81%9F%EF%BC%88%E9%80%9F%E5%BA%A6%E5%B7%AE%E3%81%AF%E4%B8%8A%E3%81%AE%E6%AF%94%E8%BC%83%E8%A1%A8%E3%81%AE%E3%81%A8%E3%81%8A%E3%82%8A%EF%BC%89%E3%80%82%0A%20%20%20%20-%20**%E6%97%A9%E6%9C%9F%E7%B5%82%E4%BA%86%E3%81%A8%20bagging**%20%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%80%81%E4%B8%8A%E9%99%90%20400%20%E6%9C%AC%E3%83%BB%60early_stopping_rounds%3D20%60%E3%83%BB%0A%20%20%20%20%20%20%60subsample%3D0.8%60%20%E3%81%A7%E5%AD%A6%E7%BF%92%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E6%A4%9C%E8%A8%BC%20RMSE%20%E3%82%92%E3%82%82%E3%81%A8%E3%81%AB%20%60best_iteration_%20%3D%20120%60%20%E6%9C%AC%E3%81%A7%0A%20%20%20%20%20%20%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E6%89%93%E3%81%A1%E5%88%87%E3%82%89%E3%82%8C%E3%81%9F%E3%80%82%E6%9C%A8%E3%81%AE%E6%9C%AC%E6%95%B0%E3%82%92%E6%89%8B%E3%81%A7%E8%AA%BF%E6%95%B4%E3%81%9B%E3%81%9A%E3%81%AB%E6%B8%88%E3%81%BF%E3%80%81%E9%81%8E%E5%89%B0%E9%81%A9%E5%90%88%E3%81%A8%E7%84%A1%E9%A7%84%E3%81%AA%E8%A8%88%E7%AE%97%E3%82%92%0A%20%20%20%20%20%20%E9%81%BF%E3%81%91%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20-%20**%E7%B7%8F%E5%90%88%E6%AF%94%E8%BC%83**%E3%81%A7%E3%81%AF%E3%80%81scratch%20%E5%AE%9F%E8%A3%85%E3%81%AF%E5%90%8C%E3%81%98%E6%9C%A8%E3%81%AE%E6%9C%AC%E6%95%B0%E3%83%BB%E5%AD%A6%E7%BF%92%E7%8E%87%E3%83%BB%E6%B7%B1%E3%81%95%E3%81%AE%20LightGBM%20%E3%82%84%0A%20%20%20%20%20%20scikit-learn%20%E3%81%A8%E8%BF%91%E3%81%84%20RMSE%20%2F%20R2%20%E3%81%AB%E9%81%94%E3%81%97%E3%81%9F%E3%80%82%E3%81%9F%E3%81%A0%E3%81%97%E5%AD%A6%E7%BF%92%E9%80%9F%E5%BA%A6%E3%81%AF%E6%A1%81%E3%81%A7%E5%8F%8A%E3%81%B0%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%20%20LightGBM%20%E3%81%8C%E9%80%9F%E3%81%8F%E3%80%81%E3%82%8F%E3%81%9A%E3%81%8B%E3%81%AB%E9%AB%98%E7%B2%BE%E5%BA%A6%E3%81%AA%E3%81%AE%E3%81%AF%E3%80%81%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0%E5%88%86%E5%89%B2%E3%81%AB%E5%8A%A0%E3%81%88%E3%81%A6%0A%20%20%20%20%20%20leaf-wise%20%E6%88%90%E9%95%B7%E3%83%BB%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%81%AA%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA%E5%87%A6%E7%90%86%E3%83%BBC%2B%2B%2FOpenMP%20%E3%81%AB%E3%82%88%E3%82%8B%E4%B8%A6%E5%88%97%E5%8C%96%E3%83%BB%E6%AC%A0%E6%B8%AC%E5%80%A4%E3%81%AE%0A%20%20%20%20%20%20%E8%87%AA%E5%8B%95%E6%8C%AF%E3%82%8A%E5%88%86%E3%81%91%E3%83%BB%E6%B4%97%E7%B7%B4%E3%81%95%E3%82%8C%E3%81%9F%E6%AD%A3%E5%89%87%E5%8C%96%E3%82%92%E5%82%99%E3%81%88%E3%82%8B%E3%81%9F%E3%82%81%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82scratch%20%E5%AE%9F%E8%A3%85%E3%81%AF%E5%8E%9F%E7%90%86%E3%82%92%0A%20%20%20%20%20%20%E3%81%AA%E3%81%9E%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7%E3%80%8C%E4%BD%95%E3%81%8C%E9%80%9F%E5%BA%A6%E3%81%A8%E7%B2%BE%E5%BA%A6%E3%82%92%E7%94%9F%E3%82%93%E3%81%A7%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B%E3%80%8D%E3%82%92%E6%98%8E%E7%A2%BA%E3%81%AB%E3%81%99%E3%82%8B%E6%95%99%E6%9D%90%E3%81%A8%E3%81%97%E3%81%A6%E5%BD%B9%E7%AB%8B%E3%81%A4%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
9c3be3529dec315a7ba13cf48f585aa2