sklearn: правильный способ инициализации LabelEncoder для вызова inverse_transform для сохраненной модели - PullRequest
0 голосов
/ 09 ноября 2018

Я создал свою модель машинного обучения с помощью XGBoost и сохранил ее в файл. Теперь, когда я хочу сделать прогноз, я загружаю модель и также инициализирую свой объект LabelEncoder, как показано ниже.

my_classes = ['rp12', 'rp15', 'rp16', 'rp24', 'rp27', 'rp3', 'rp32', 'rp4', 'rp6']
le1 = LabelEncoder()
le1.fit(my_classes)

bst1 = xgb.Booster({'nthread':4}) #init model
bst1.load_model("0001.model") 
data = [0,97.0,155,143,98,145,102,102,144,100,96,193,90,98,98,122,101,101,101,98,99,96,118,148,98,99,112,94,98,100,96.0,95]
data = [float(val) for val in data]
dtest = xgb.DMatrix(data)
test_pred = bst1.predict(dtest)
test_label = np.argmax(test_pred, axis=1)
final_pred = le1.inverse_transform(test_label)

Вопросы: 1) Я устанавливаю классы вручную, тогда как во время обучения это было сделано путем передачи помеченных данных «train_Y». Можно ли как-нибудь сохранить объект LabelEncoder во время обучения и использовать во время прогнозирования? Травление - это решение или есть что-нибудь лучше?

2) Какие параметры нужно указать при инициализации модели? Требуется ли нить? Разве он не может прочитать его с сохраненной модели?

3) Мой прогноз не работает, если входными значениями являются целые числа. Как только я конвертирую в float (data = [float(val) for val in data]), он работает нормально. Это необходимый шаг? Во время обучения я использовал только значения int. В дампе модели, однако, я вижу расщепления по значениям с плавающей точкой. Возможно, поэтому при прогнозировании входные данные должны быть плавающими. Может кто-нибудь указать мне материал, который может пролить больше света на это поведение?

Спасибо.

...