Я изо всех сил пытался использовать scipy.opt.leastsq
, ниже пример игрушки
Сначала вспомогательная функция и начальные переменные:
def calculate_class_ratios(predictions, thresholds):
predictions[predictions < thresholds] = 0
predictions[predictions > 0] = 1
class_counts = predictions.sum(axis=0)
return class_counts/class_counts.sum()
target_class_ratios = np.array([0.1, 0.9])
predictions = np.array(([[0.6, 0.9]] * 9) + [[0.7, 0.2]])
initial_thresholds = np.array(0.5 * np.ones(2))
optimal_threshold = np.array([0.65, 0.5])
Теперь определите функцию ошибки, ошибкуэто абсолютная разница между вычисляемыми коэффициентами классов с определенным порогом и target_class_ratio
:
error = lambda thresholds: np.abs(calculate_class_ratios(copy.deepcopy(predictions), thresholds) - target_class_ratios)
optimized_thresholds, success = opt.leastsq(error, initial_thresholds)
В результате я получаю: optimized_thresholds = np.array([0.5, 0.5])
Таким образом, в результатеРасчетная потеря:
np.abs(calculate_class_ratios(copy.deepcopy(predictions),
optimized_thresholds) - target_class_ratios)
= array([0.42631579, 0.42631579])
Но мы можем найти решение, которое минимизирует ошибку до 0 для каждого порога, установив порог на optimal_threshold
:
np.abs(calculate_class_ratios(copy.deepcopy(predictions),
optimal_threshold) - target_class_ratios)
= array([0., 0.])
Am Iничего не хватает?