Можно ли сохранить sklearn.linear_model.LinearRegression?

Я сохраняю модель sklearn.linear_model.LinearRegression с помощью pickle, а затем загружаю ее в обратном порядке, используя:

i = 1
Xtr_num, Xte_num, Xtr_cat, Xte_cat, Ytr, Yte, Xvl_num, Xvl_cat, Yvl = data.get_splitted_data(i)
lm = linear_model.LinearRegression()
pickle.dump(lm, open('pre_model/y'+str(i)+'-skl.pickle.sav', 'wb'))
X = np.concatenate((Xtr_num, Xtr_cat), axis=1)
model = lm.fit(X,Ytr)


loaded_model = pickle.load(open('pre_model/y'+str(1)+'-skl.pickle.sav', 'rb'))
print loaded_model.predict(X)

Это дает мне ошибку ниже. Вы могли бы посоветовать.

---------------------------------------------------------------------------
NotFittedError                            Traceback (most recent call last)
<ipython-input-14-8d246f04f2b7> in <module>()
      1 loaded_model = pickle.load(open('pre_model/y'+str(1)+'-skl.pickle.sav', 'rb'))
----> 2 print loaded_model.predict(X)

/usr/lib64/python2.7/site-packages/sklearn/linear_model/base.pyc in predict(self, X)
    254             Returns predicted values.
    255         """
--> 256         return self._decision_function(X)
    257 
    258     _preprocess_data = staticmethod(_preprocess_data)

/usr/lib64/python2.7/site-packages/sklearn/linear_model/base.pyc in _decision_function(self, X)
    235 
    236     def _decision_function(self, X):
--> 237         check_is_fitted(self, "coef_")
    238 
    239         X = check_array(X, accept_sparse=['csr', 'csc', 'coo'])

/usr/lib64/python2.7/site-packages/sklearn/utils/validation.pyc in check_is_fitted(estimator, attributes, msg, all_or_any)
    766 
    767     if not all_or_any([hasattr(estimator, attr) for attr in attributes]):
--> 768         raise NotFittedError(msg % {'name': type(estimator).__name__})
    769 
    770 

NotFittedError: This LinearRegression instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.

Похоже, проблема исходит из другого источника. Вы запускали функцию fit на своей модели перед ее сохранением?

yakobyd 13.06.2018 00:48

Да, сначала я подгоняю модель, используя X, y, а затем сохраняю ее. Но когда я перезагружаю модель, она ничего не может предсказать и выдает ошибку.

Afshin Oroojlooy 13.06.2018 14:50

В моем ответе ниже, судя по опубликованному вами фрагменту кода, я предположил, что вы не выполняли никаких настроек перед сохранением, в том числе потому, что об этом говорит ошибка. Теперь, если я еще раз взгляну на ваши имена файлов: возможно ли, что вы загрузили неправильную модель?

WolfgangK 13.06.2018 16:12

@WolfgangK К сожалению, вы не правы, и проблема не в этом. Я добавил больше деталей в код, в который помещаю модель, сохраняю ее, перезагружаю и вызываю прогноз. Также публикуется ошибка.

Afshin Oroojlooy 13.06.2018 16:23

Если это фактический код, который вы используете, модель сначала инициализируется, затем сохраняется, затем настраивается, а затем вы загружаете модель в том виде, в котором она была до подгонки. Итак, вы пытаетесь использовать predict на загруженной модели, которая не подходит.

WolfgangK 13.06.2018 16:27

Да, его можно загрузить, но в нем нет никакого функционала. Чтобы предсказать результат, он просит меня снова вызвать в fit. Может быть, то, как они думают о модели сохранения, отличается от того, что я думаю.

Afshin Oroojlooy 13.06.2018 16:31

Я хотел сказать, что перед сохранением модели вы должны использовать fit. Но потом позвоните в fit.

WolfgangK 13.06.2018 16:34

Да, теперь работает. Это была глупая ошибка.

Afshin Oroojlooy 13.06.2018 16:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
8
452
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка возникает не при попытке загрузить модель, а при вызове predict. Сначала вам нужно подогнать вашу модель к некоторым обучающим данным. Впоследствии вы можете предсказать:

loaded_model.fit(training_data, target_values)
loaded_model.predict(X) 

Обновлять

Чтобы уточнить, перепишу ваш код. Посмотрите, работает ли это сейчас:

i = 1
Xtr_num, Xte_num, Xtr_cat, Xte_cat, Ytr, Yte, Xvl_num, Xvl_cat, Yvl = data.get_splitted_data(i)
lm = linear_model.LinearRegression()
X = np.concatenate((Xtr_num, Xtr_cat), axis=1)
lm.fit(X,Ytr) # the position of this line has been changed

pickle.dump(lm, open('pre_model/y'+str(i)+'-skl.pickle.sav', 'wb'))

loaded_model = pickle.load(open('pre_model/y'+str(1)+'-skl.pickle.sav', 'rb'))
print loaded_model.predict(X)

Итак, вы имеете в виду, что я не могу сохранить и перезагрузить модель? Примерка занимает некоторое время, и я хотел этого избежать.

Afshin Oroojlooy 13.06.2018 14:49

Другие вопросы по теме