Помимо вашей проблемы, используйте joblib вместо pickle, потому что гораздо эффективнее хранить модели, такие как Random Forest , и теперь для вашей проблемы есть несколько вещей, которые следует учитывать:
Мариновать или нет, результат вашего лечения такой же.Pickling - это способ сохранить вашу модель, и после того, как ваш случайный лес будет выделен, он будет иметь те же свойства и характеристики, что и раньше.Это может быть случай, когда вы неверно определите свой формат ввода или вы не знаете, как применить метод прогнозирования.Давайте рассмотрим пример: DataFrame с 3 категориальными переменными и определенным классом, зависящим от 3 функций.
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
df = pd.read_csv(data='example.csv', columns=['val1', 'val2', 'val3', 'class'])
Теперь применяем горячее кодирование и подгоняем случайный лес к столбцу «class»:
#Turning it into dummies
dummies = pd.get_dummies(df[['col1', 'col2', 'col3']])
#Random forest
clf = RandomForestClassifier()
model = clf.fit(dummies, df.class)
Сброс и загрузка модели с помощью joblib:
from sklearn.externals import joblib
#Dumping
joblib.dump(clf, 'filename.pkl')
#Loading
clf = joblib.load('filename.pkl')
Или с маринадом, если вы придерживаетесь его:
import cPickle
#Dumping
with open('path/to/file', 'wb') as f:
cPickle.dump(clf, f)
#Loading
with open('path/to/file', 'rb') as f:
clf = cPickle.load(clf)
Теперь, когда вы перезагрузили свою модель, правильнаяспособ получить результат - использовать метод прогнозирования , чтобы получить класс из другого значения.Представьте, что у вас есть второй DataFrame, который имеет аналогичный формат, за исключением того, что столбец класса отсутствует.Вы бы сделали это следующим образом:
df_test = pd.read_csv("test.csv", columns=['col1', 'col2', 'col3'])
#Creating dummies
dummie_test = pd.get_dummies(df_test)
#Getting the prediction
df_test['predicted'] = clf.predict(dummies_test)