Сохраненная модель (случайный лес) не работает как модель "fre sh fit" - проблемы с переменными категории - PullRequest
1 голос
/ 26 мая 2020

Я построил модель в scikit-learn (случайный лес) и сохранил ее. Затем я снова загрузил эту модель и попытался применить ее к тому же набору данных, который использовался для обучения. И я получаю сообщение об ошибке

«не удалось преобразовать строку в число с плавающей запятой»

Потому что у меня есть пара переменных категории. Но я смог применить эту модель к этому набору данных без ошибок, прежде чем я сохранил модель. Проблема, похоже, в том, что информация об этой паре переменных категории не была сохранена, когда я сохранил модель. На самом деле я использовал Labelencoder для этих переменных. Есть ли способ сохранить информацию об этих переменных категории, чтобы сохраненная модель работала так же, как модель fre sh fit? Заранее спасибо!

1 Ответ

3 голосов
/ 26 мая 2020

Это типичный вариант использования pipeline.

Создайте рабочий процесс как единый конвейер, а затем сохраните конвейер.

Когда вы загружаете свой конвейер, вы можете напрямую получать прогнозы для новых данных без необходимости кодирования.

Также labelEncoder не предназначены для преобразования входных данных. Как следует из названия, это для целевой переменной.

Если вам нужно преобразовать категориальную переменную в порядковые числа, используйте OrdinalEncoder.

Пример игрушки:

from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import OrdinalEncoder
from sklearn.compose import make_column_transformer
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline

X = [[1, 'orange', 'yes'], [1, 'apple', 'yes'],
     [-1, 'orange', 'no'], [-1, 'apple', 'no']]
y = [[1], [1], [0], [0]]

X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    random_state=42)
pipe = Pipeline(
    [('encoder', make_column_transformer((OrdinalEncoder(), [1, 2]), 
                                         remainder='passthrough')),
    # applies OrdinalEncoder using column transformer for 2nd and 3rd column
     ('rf', RandomForestClassifier(n_estimators=2,random_state=42))])

pipe.fit(X_train, y_train)

import joblib
joblib.dump(pipe, 'pipe.pkl')

loaded_pipe = joblib.load('pipe.pkl')
loaded_pipe.score(X_test, y_test)
...