Ошибка TypeError при написании моей собственной оценки_метрики для xgboost в Python - PullRequest
0 голосов
/ 05 марта 2019

Я хочу создать свою собственную метрику оценки f_score при использовании классификатора xgboost для двоичной классификации.

Моя метрика

def f_score(preds,y):
   df = pd.DataFrame({'predict':pred, 'true':y.get_labels()})
   correct_1 = len(df.loc[(df['predict'] == 1) & (df['true'] == 1])
   wrong_1 = len(df.loc[(df['predict'] == 0]) & (df['true'] == 0])
   wrong_0 = len(df.loc[(df['predict'] == 0]) & (df['true'] == 1])
   precission = correct_1 / (correct_1+wrong_1)
   recall = correct_1/(correct_1+wrong_0)
   score = 2*precission*recall/(precission+recall)
   return score

Тогда у меня есть

    cv_results = xgboost.cv(
                 params,
                 dtrain,
                 num_boost_round = 999,
                 seed = 42,
                 nfold = 5,
                 feval = f_score,
                 early_stopping_rounds = 10
                 )

Когда я запускаю код, он выполняет одну итерацию моей построенной метрики, а затем после возврата «Score» выдает «TypeError: невозможно распаковать не повторяемый объект с плавающей запятой»

И я не могу понять, почему это происходит. Есть идеи как это решить?

  File "c:\Users\esilkas\.vscode\extensions\ms-python.python- 
2019.2.5433\pythonFiles\lib\python\ptvsd\__main__.py", line 357, in main
    run()
 File "c:\Users\esilkas\.vscode\extensions\ms-python.python- 
2019.2.5433\pythonFiles\lib\python\ptvsd\__main__.py", line 257, in run_file
    runpy.run_path(target, run_name='__main__')
  File 
"C:\Users\esilkas\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 
263, in run_path
    pkg_name=pkg_name, script_name=fname)
  File 
"C:\Users\esilkas\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 
96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File 
"C:\Users\esilkas\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 
85, in _run_code
    exec(code, run_globals)
  File 
"c:\Users\esilkas\Documents\apps\masterthesis\Model\xgb_tuning_outlier.py", 
line 293, in <module>
    feval = f_score,
  File "C:\Users\esilkas\AppData\Local\Programs\Python\Python37\lib\site- 
packages\xgboost\training.py", line 446, in cv
    res = aggcv([f.eval(i, feval) for f in cvfolds])
  File "C:\Users\esilkas\AppData\Local\Programs\Python\Python37\lib\site- 
packages\xgboost\training.py", line 446, in <listcomp>
    res = aggcv([f.eval(i, feval) for f in cvfolds])
  File "C:\Users\esilkas\AppData\Local\Programs\Python\Python37\lib\site- 
packages\xgboost\training.py", line 234, in eval
    return self.bst.eval_set(self.watchlist, iteration, feval)
  File "C:\Users\esilkas\AppData\Local\Programs\Python\Python37\lib\site- 
packages\xgboost\core.py", line 1115, in eval_set
    name, val = feval_ret
TypeError: cannot unpack non-iterable float object
...