O Gradient Boosting começa com uma previsão aproximada, e então adiciona repetidamente pequenas árvores que corrigem o que o modelo atual ainda erra. Muitas correções pequenas e direcionadas se acumulam em um preditor flexível.
# training datasetX=np.linspace(-10,10,500)[:,np.newaxis]noise=np.random.rand(X.shape[0])*10# targety=((np.sin(X).ravel()+np.cos(4*X).ravel())*10+10+np.linspace(-10,10,500)+noise)# train gradient boostingreg=GradientBoostingRegressor(n_estimators=50,learning_rate=0.5,)reg.fit(X,y)y_pred=reg.predict(X)# Verificar o ajuste aos dados de treinamentoplt.figure(figsize=(10,5))plt.scatter(X,y,c="k",marker="x",label="training data")plt.plot(X,y_pred,c="r",label="Predictions for the final created model",linewidth=1)plt.xlabel("x")plt.ylabel("y")plt.title("Degree of fitting to training dataset")plt.legend()plt.show()
Verifique como o ajuste aos dados de treinamento muda quando a perda é alterada para [“squared_error”, “absolute_error”, “huber”, “quantile”]. Espera-se que “absolute_error” e “huber” não prossigam para prever outliers, já que a penalidade para outliers não é tão grande quanto o erro quadrático.
# training dataX=np.linspace(-10,10,500)[:,np.newaxis]# prepare outliersnoise=np.random.rand(X.shape[0])*10fori,niinenumerate(noise):ifi%80==0:noise[i]=70+np.random.randint(-10,10)# targety=((np.sin(X).ravel()+np.cos(4*X).ravel())*10+10+np.linspace(-10,10,500)+noise)forlossin["squared_error","absolute_error","huber","quantile"]:# train gradient boostingreg=GradientBoostingRegressor(n_estimators=50,learning_rate=0.5,loss=loss,)reg.fit(X,y)y_pred=reg.predict(X)# Verificar o ajuste aos dados de treinamento.plt.figure(figsize=(10,5))plt.scatter(X,y,c="k",marker="x",label="training dataset")plt.plot(X,y_pred,c="r",label="Predictions for the final created model",linewidth=1)plt.xlabel("x")plt.ylabel("y")plt.title(f"Degree of fitting to training data, loss={loss}",fontsize=18)plt.legend()plt.show()
fromsklearn.metricsimportmean_squared_errorasMSE# trainig datasetX=np.linspace(-10,10,500)[:,np.newaxis]noise=np.random.rand(X.shape[0])*10# targety=((np.sin(X).ravel()+np.cos(4*X).ravel())*10+10+np.linspace(-10,10,500)+noise)# Tentar criar um modelo com diferentes n_estimatorsn_estimators_list=[(i+1)*5foriinrange(20)]mses=[]forn_estimatorsinn_estimators_list:reg=GradientBoostingRegressor(n_estimators=n_estimators,learning_rate=0.3,)reg.fit(X,y)y_pred=reg.predict(X)mses.append(MSE(y,y_pred))# Plotar mean_squared_error para diferentes n_estimatorsplt.figure(figsize=(10,5))plt.plot(n_estimators_list,mses,"x")plt.xlabel("n_estimators")plt.ylabel("Mean Squared Error(training data)")plt.grid()plt.show()
# Tentar criar um modelo com diferentes n_estimatorslearning_rate_list=[np.round(0.1*(i+1),1)foriinrange(20)]mses=[]forlearning_rateinlearning_rate_list:reg=GradientBoostingRegressor(n_estimators=30,learning_rate=learning_rate,)reg.fit(X,y)y_pred=reg.predict(X)mses.append(np.log(MSE(y,y_pred)))# Plotar mean_squared_error para diferentes n_estimatorsplt.figure(figsize=(10,5))plt_index=[iforiinrange(len(learning_rate_list))]plt.plot(plt_index,mses,"x")plt.xticks(plt_index,learning_rate_list,rotation=90)plt.xlabel("learning_rate",fontsize=15)plt.ylabel("log(Mean Squared Error) (training data)",fontsize=15)plt.grid()plt.show()