Использование numpy оцифровки вывода в scipy минимизировать проблему - PullRequest
3 голосов
/ 19 июня 2020

Я пытаюсь минимизировать квадратичную c взвешенную каппа-функцию, используя функцию Пауэлла scipy Minimize fmin.

Две функции digitize_train и digitize_train2 дают 100% ТОЧНЫЕ результаты.

Однако, когда я попытался использовать эти функции с scipy минимизировать, второй метод потерпел неудачу.

К моему удивлению, я пытался отладить проблему в течение нескольких часов, несмотря на то, что две функции в точности совпадают с функцией неровной оцифровки не может дать fmin имитацию Пауэлла.

Как исправить ошибку?

Вопрос
Как использовать numpy.digitize в scipy fmin_powell?

НАСТРОЙКА

# imports
import numpy as np
import pandas as pd
import seaborn as sns
from scipy.optimize import fmin_powell
from sklearn import metrics

# data
train_labels = [1,1,8,7,6,5,3,2,4,4]
train_preds = [0.1,1.2,8.9, 7.6, 5.5, 5.5, 2.99, 2.4, 3.5, 4.0]
guess_lst = (1.5,2.9,3.1,4.5,5.5,6.1,7.1)


# functions
# here I am trying the convert real numbers -inf to +inf to integers 1 to 8
def digitize_train(train_preds, guess_lst):
    (x1,x2,x3,x4,x5,x6,x7) = list(guess_lst)   
    res = []
    for y in list(train_preds):
        if y < x1:
            res.append(1)
        elif y < x2:
            res.append(2)
        elif y < x3:
            res.append(3)
        elif y < x4:
            res.append(4)
        elif y < x5:
            res.append(5)
        elif y < x6:
            res.append(6)
        elif y < x7:
            res.append(7)
        else: res.append(8)
    return res

def digitize_train2(train_preds, guess_lst):
    return np.digitize(train_preds,guess_lst) + 1

# compare two functions
df = pd.DataFrame({'train_labels': train_labels,
                   'train_preds': train_preds,
                   'method_1': digitize_train(train_preds, guess_lst),
                   'method_2': digitize_train2(train_preds, guess_lst)
                    })

df

** ПРИМЕЧАНИЕ: Две функции абсолютно одинаковы **

Метод 1: без numpy оцифровка выполняется нормально

# using fmin_powel for method 1
def get_offsets_minimizing_train_preds_kappa(guess_lst):
    res = digitize_train(train_preds, guess_lst)
    return - metrics.cohen_kappa_score(train_labels, res,weights='quadratic')  

offsets = fmin_powell(get_offsets_minimizing_train_preds_kappa, guess_lst, disp = True)
print(offsets)

Метод 2: при использовании numpy оцифровка не удалась

# using fmin_powell for method 2
def get_offsets_minimizing_train_preds_kappa2(guess_lst):
    res = digitize_train2(train_preds, guess_lst)
    return -metrics.cohen_kappa_score(train_labels, res,weights='quadratic')  

offsets = fmin_powell(get_offsets_minimizing_train_preds_kappa2, guess_lst, disp = True)
print(offsets)

Как использовать numpy метод оцифровки?

Обновить

В соответствии с предложениями, которые я пробовал pandas вырезать, но все равно выдает ошибку. ValueError: bins must increase monotonically.

# using fmin_powell for method 3
def get_offsets_minimizing_train_preds_kappa3(guess_lst):
    res = pd.cut(train_preds, bins=[-np.inf] + list(guess_lst) + [np.inf],
                        right=False)
    res = pd.Series(res).cat.codes + 1
    res = res.to_numpy()

    return -metrics.cohen_kappa_score(train_labels, res,weights='quadratic')  

offsets = fmin_powell(get_offsets_minimizing_train_preds_kappa3, guess_lst, disp = True)
print(offsets)

1 Ответ

2 голосов
/ 19 июня 2020

Кажется, что во время процесса минимизации значение в guest_lst больше не монотонно увеличивается, одна работа - передать sorted из guest_lst в digitize, например:

def digitize_train2(train_preds, guess_lst):
    return np.digitize(train_preds,sorted(guess_lst)) + 1

и вы получите

# using fmin_powell for method 2
def get_offsets_minimizing_train_preds_kappa2(guess_lst):
    res = digitize_train2(train_preds, guess_lst)
    return -metrics.cohen_kappa_score(train_labels, res,weights='quadratic')  

offsets = fmin_powell(get_offsets_minimizing_train_preds_kappa2, guess_lst, disp = True)
print(offsets)
Optimization terminated successfully.
         Current function value: -0.990792
         Iterations: 2
         Function evaluations: 400
[1.5        2.7015062  3.1        4.50379942 4.72643334 8.12463415
 7.13652301]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...