Serupa dengan klasifikasi, pohon regresi menanyakan pertanyaan sederhana tentang fitur, namun targetnya kini bersifat kontinu. Setiap daun mengeluarkan rata-rata sampel yang masuk, sehingga fungsi yang dihasilkan bersifat konstan per segmen. Pohon yang dalam menangkap detail halus, sedangkan pohon dangkal menjaga tren global.
Cuplikan pertama melatih pohon dangkal pada sampel sinusoid yang diberi derau untuk menunjukkan bentuk fungsi yang konstan per segmen. Eksperimen kedua menggunakan dua fitur, menghitung (R^2), RMSE, MAE, dan menggambarkan permukaan prediksi serta struktur pohonnya.
importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.treeimportDecisionTreeRegressor,plot_treefromsklearn.datasetsimportmake_regressionfromsklearn.metricsimportr2_score,mean_squared_error,mean_absolute_errorrng=np.random.default_rng(42)X1=np.sort(5*rng.random((120,1)),axis=0)y1_true=np.sin(X1).ravel()y1=y1_true+rng.normal(scale=0.2,size=X1.shape[0])reg1=DecisionTreeRegressor(max_depth=3,random_state=0).fit(X1,y1)y1_pred=reg1.predict(X1)plt.figure(figsize=(8,4))plt.scatter(X1,y1,s=15,c="gray",label="observasi")plt.plot(X1,y1_true,lw=2,label="sinyal asli")plt.step(X1.ravel(),y1_pred,where="mid",lw=2,label="prediksi pohon")plt.xlabel("x")plt.ylabel("y")plt.title("Pohon regresi menghasilkan fungsi konstan per segmen")plt.legend()plt.grid(alpha=0.3)plt.show()
X,y=make_regression(n_samples=400,n_features=2,noise=15.0,random_state=777)reg=DecisionTreeRegressor(max_depth=4,random_state=0).fit(X,y)r2=r2_score(y,reg.predict(X))rmse=mean_squared_error(y,reg.predict(X),squared=False)mae=mean_absolute_error(y,reg.predict(X))print(f"R2={r2:.3f} RMSE={rmse:.2f} MAE={mae:.2f}")x_min,x_max=X[:,0].min()-1,X[:,0].max()+1y_min,y_max=X[:,1].min()-1,X[:,1].max()+1xx,yy=np.meshgrid(np.linspace(x_min,x_max,150),np.linspace(y_min,y_max,150),)zz=reg.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape)plt.figure(figsize=(7,6))cs=plt.contourf(xx,yy,zz,levels=15,cmap="viridis",alpha=0.8)plt.colorbar(cs,label="prediksi")plt.scatter(X[:,0],X[:,1],c=y,cmap="viridis",s=20,edgecolor="k",alpha=0.7)plt.xlabel("x1")plt.ylabel("x2")plt.title("Permukaan prediksi pohon regresi")plt.show()
1
2
3
4
5
6
7
8
9
plt.figure(figsize=(12,10))plot_tree(reg,filled=True,feature_names=["x1","x2"],rounded=True,)plt.title("Struktur pohon regresi yang dipelajari")plt.show()