Я интегрировал модель Gradient Booster Régression Tree (GBRT), обученную с помощью Scikit, в большую программу двумя различными способами:
- для iOS, используя
CoreML
и coremltools
- для Linux с использованием pickle и вызовом сценария python для классификации.
Иногда предсказания были другими, чего не должно быть.
Обратите внимание, что это проблема двух классов: вывод равен либо 0, либо 1.
Что касается продажи объяснения, я выделю два образца: образец 3321 и образец 3330: 3321 был предсказан для класса 0 в обоих, но 3330 был предсказан как 1 для iOS и 0 для версии для Linux / python.
Вот что я пытался решить:
Возможности чтения
Поскольку я использовал классификатор GBRT, я подумал, что взгляну на вероятности, связанные с каждым классом. Они были разными в обоих образцах:
в версии для iOS:
- образец 3321, класс 0, вероятности [0,00098, 0,99901]
- образец 3330, класс 1, вероятности [0,57140, 0,42859]
в питоне:
- выборка 3321, класс 0 вероятностей [0,000724739274, 0,999275261]
- выборка 3330 класса 0 вероятностей [0.45024302, 0.54975698]
ясно, это разные.
Изменение классификаторов
Затем я попытался вставить классификатор SVM (который дал второй лучший результат после GBRT) с вероятностями: также разными (прогнозы и вероятности)
Значения функций
Тогда я подумал, что, возможно, значения объектов были разными (каким-то образом изменились при отправке из swift в скрипт python), поэтому я распечатал вектор объектов в обоих случаях непосредственно перед вызовом предиктора: значения были идентичны, очень последняя цифра.
Вопрос
Есть идеи, почему это происходит, или это нормально?