2017-09-19 9 views
1
테스트 데이터 세트에서

CatBoostRegressor 직선 맞는CatBoostRegression 테스트 직선 예측

Red is CatBoostRegressor

제 그래프 번째 그래프 테스트 데이터

설정된다 (CatBoostRegressor가 noised 죄에 기초하여 훈련 된) 훈련 집합이며

왜 이것이 직선에 딱 맞습니까? (= X 등) 등의 F (x)의 다른 기능에 대해 동일한

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

을 – Paddy

답변

0

결정 트리가 불연속 상수 함수 있으며 Catboost 완전히 결정 트리 기반으로하기 때문이다. 그래서 catboost는 항상 상수로을 추정합니다.

그러므로 Catboost (XGBoost와 같은 다른 트리 기반 알고리즘 또는 임의의 포리스트 구현)는 외삽시 열등한 성향을 띠고 있습니다 (실제로 영리한 기능을 수행하지 않는 한 사실 자체로 외삽 법을 적용합니다).

예를 들어, Catboost는 상수를 사용하여 사인을 외삽 (uncool)으로 추정합니다. 그러나 다항식 적합은 더욱 악화됩니다. 즉, 무한대로 빠르게갑니다!

enter image description here

이 사진을 생성하는 전체 코드입니다 : 당신의 하이퍼 매개 변수가 제대로 선택하지 않기 때문에

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()