2017-09-19 3 views
1

CatBoostRegressor in Testdatensatzes vorherzusagen, passt eine gerade LinieCatBoostRegression auf Test geraden Linie

Red is CatBoostRegressor

Der erste Graph ist Zug-Datensatz (CatBoostRegressor auf noised sin basierend trainiert) Die zweite Kurve ist, Daten Prüfanordnung

Warum passt es eine gerade Linie? Das gleiche gilt für andere Funktionen (wie f (x) = x usw.)

x = np.linspace(0, 2*np.pi, 100) 
y = func(x) + np.random.normal(0, 3, len(x)) 

x_test = np.linspace(0*np.pi, 4*np.pi, 200) 
y_test = func(x_test) 

train_pool = Pool(x.reshape((-1,1)), y) 
test_pool = Pool(x_test.reshape((-1,1))) 

model = CatBoostRegressor(iterations=100, depth=2, loss_function="RMSE", 
          verbose=True 
         ) 
model.fit(train_pool) 

y_pred = model.predict(x.reshape((-1,1))) 
y_test_pred = model.predict(test_pool) 

poly = Polynomial(4) 
p = poly.fit(x,y); 


plt.plot(x, y, 'ko') 
plt.plot(x, func(x), 'k') 
plt.plot(x, y_pred, 'r') 
plt.plot(x, poly.evaluate(p, x), 'b') 

plt.show() 

plt.plot(x_test, y_test, 'k') 
plt.plot(x_test, y_test_pred, 'r') 
plt.show() 
plt.plot(x_test, y_test, 'k') 
plt.plot(x_test, poly.evaluate(p, x_test), 'b') 
plt.show() 
+0

weil Ihre Hyperparameter nicht richtig gewählt – Paddy

Antwort

0

Dies liegt daran, Entscheidungsbäume sind abschnittsweise konstante Funktionen und Catboost ist vollständig auf Basis von Entscheidungsbäumen. Also catboost extrapoliert immer mit einer Konstante.

Daher ist Catboost (und andere tree-basierte Algorithmen, wie XGBoost, oder alle Implementierungen von Random Forest) schlecht bei der Extrapolation (es sei denn, Sie ein cleveres Feature-Engineering, das in der Tat von selbst extrapoliert).

In Ihrem Beispiel extrapoliert Catboost Sinus mit einer Konstante, die uncool ist. Aber polynomische Anpassung ist noch schlimmer: Es geht schnell in die Unendlichkeit!

enter image description here

Dies ist der vollständige Code, der das Bild erzeugt:

import numpy as np 
func = np.sin 
from catboost import Pool, CatBoostRegressor 
from numpy.polynomial.polynomial import Polynomial 
import matplotlib.pyplot as plt 

np.random.seed(1) 

x = np.linspace(0, 2*np.pi, 100) 
y = func(x) + np.random.normal(0, 3, len(x)) 

x_test = np.linspace(0*np.pi, 4*np.pi, 200) 
y_test = func(x_test) 

train_pool = Pool(x.reshape((-1,1)), y) 
test_pool = Pool(x_test.reshape((-1,1))) 

model = CatBoostRegressor(iterations=100, depth=2, loss_function="RMSE",verbose=False) 
model.fit(train_pool, verbose=False) 

y_pred = model.predict(x.reshape((-1,1))) 
y_test_pred = model.predict(test_pool) 

p = np.polyfit(x, y, deg=4) 

plt.scatter(x, y, s=3, c='k') 
plt.plot(x_test, y_test, 'k') 
plt.plot(x_test, y_test_pred, 'r') 
plt.plot(x_test, np.polyval(p, x_test), 'b') 
plt.title('Out-of-sample performance of trees and polynomials') 
plt.legend(['training data', 'true', 'catboost', 'polynomial']) 
plt.ylim([-4, 4]) 
plt.show() 
Verwandte Themen