2016-12-09 1 views
0

저는 불균형 한 데이터 집합이있는 분류 문제에 대해 연구 중이며 고정밀도에 관심이 있습니다.XGBoost (f_beta)의 매개 변수와 함께 평가 함수 사용

따라서 XGBoost의 목적 함수를 정밀도에 더 많은 영향을 줄 수있는 것으로 변경하고 싶습니다. F_beta score 그냥 일을 할 것 같다,하지만 난 그게 문제가 있습니다

model_xgbm = XGBClassifier(objective=fbeta_score) 
random_search = RandomizedSearchCV(model_xgbm, param_distributions=param_dist, n_iter=n_iter_search, 
           scoring='average_precision') 

이 작동을하지만, 베타 N 의무이기 때문에 나는 그것을 작동합니까 방법을 모르겠어요 (베타를 제공하지 않았다 매개 변수 ...)

model_xgbm = XGBClassifier(objective=fbeta_score(beta=0.5)) 
random_search = RandomizedSearchCV(model_xgbm, param_distributions=param_dist, 
            n_iter=n_iter_search, 
            scoring='average_precision') 

이 단순히 작동하지 않습니다 (:) "형식 오류 fbeta_score()는 적어도 3 개 인자 (주어진 1) 소요됩니다." 그러나, 나는 여기에 다른 두 가지 논쟁을 실제로 제공 할 수는 없다.

기능을 복사하거나 포장하지 않고 맞춤 목표로 붙여 넣기가없는 해결책이 있습니까?

편집 : 내가 도움이 될 수있는 기능을 발견 make_param을,하지만 불행히도 나는 그것이 작동시킬 수없는 것 :

model_xgbm = XGBClassifier(objective=make_scorer(fbeta_score, beta=0.5)) 
random_search = RandomizedSearchCV(model_xgbm, param_distributions=param_dist, 
            n_iter=n_iter_search, 
            scoring='precision') 

을하지만이 작동하지 않습니다 중 하나 "형식 오류 : __call __()은 적어도 4 개의 인수 (주어진 3 개)를받습니다. " 모델 선택에 사용하고 싶지 않습니다. XGBoost 평가 기의 목적 함수가되기를 원합니다! 따라서, 위 링크의 맨 아래에있는 예제는 나를 위해 작동하지 않습니다.

EDIT2 : 사실 문제가 XGBoost 분류가 나를 목표로 그라데이션과 헤센를 반환하는 기능을 제공 할 것으로 예상 것 같다, 그래서가 ... 누군가가 그렇게 할 것 래퍼를 확인을 아는가 나를? 당신이 목적 함수를 전달하는

func(y_true, y_predicted) 

을 필요로

+1

객관적인 함수를 전달하기위한 소스 코드를 살펴 보는 것이 좋습니다 - 코드가 인수로 'y_true'와'y_pred'를 필요로한다고 불평하지만 xgboost가 ak로 막 혔기 때문에 어떻게해야할지 모르겠습니다. 이 람다 함수를 처리합니다.나는 실제로 내가 거대한 계급 불균형을 가지고있는 것과 똑같이하는 것에 관심이있다. 일단 내가 알아 낸 (또는 누군가와 다른 사람이 있다면 나는 컴백한다). – Chinny84

+0

누군가가 비슷한 문제를 다루는 것을 알고있다. 주제에 대해 좀 더 읽었을 때 나는 객관적인 기능이 내가 예상했던 것보다 약간 낮은 수준이라는 것을 깨달았습니다. 실제로 당신 자신의 그라디언트와 헤센을 계산할 것을 요구합니다. – JohnnyQ

+0

나는 대답을 게시했으나 나중에 xgboost에 대한 래퍼에 대한 참조를 위해 주로 사용했습니다. 그것은 당신의 궁극적 인 문제에 대답하지 않지만 계속 파고 들어갈 것입니다. – Chinny84

답변

1

의견

eval_metric : str, callable, optional 
     If a str, should be a built-in evaluation metric to use. See 
     doc/parameter.md. If callable, a custom evaluation metric. The call 
     signature is func(y_predicted, y_true) where y_true will be a 
     DMatrix object such that you may need to call the get_label 
     method. It must return a str, value pair where the str is a name 
     for the evaluation and value is the value of the evaluation 
     function. This objective is always minimized. 

의이 부분을 보면이 사실은 잘못된 것입니다.

당신이

def f_beta_wrapper(y_true, y_pred): 
    beta = 0.5 
    # note need to call .get_label() on y_true if using DMAtrix 
    return fbeta_score(y_pred, y_true, beta) 

를 다음과 당신의 f_beta_score으로 감싸고에 그것을 전달하는 경우. 그것은 제대로 흐르는

를 BU 당신이 fbeta_score 리턴한다 float과하지 않은 언급 한 문제에 도달 할 것으로 보인다 그래디언트를 계산할 수있는 두 개의 출력이 필요합니다. objective 기능이 있으므로 파라미터, 즉 구배를 최소화하는 가깝다 출력 요구를 최소화됨에 따라 구체적

/usr/local/lib/python2.7/site-packages/xgboost/core.pyc in update(self, dtrain, iteration, fobj)

807 else:

808 pred = self.predict(dtrain)

809 grad, hess = fobj(pred, dtrain) # error here

810 self.boost(dtrain, grad, hess)

TypeError: 'numpy.float64' object is not iterable

이 이해된다.