Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 17, 2016 14:19:41

grapefruit_ocean
Зарегистрирован: 2016-01-31
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Scikit-learn, логистическая регрессия и ошибка

Всем доброго времени суток!
Я начинаю осваивать машинное обучение в scikit-learn.
Я написала 2 функции, одна обучает, другая тестирует.

      def log_reg_train(self, data_train, target_train):
        logreg = linear_model.LogisticRegression()
        logreg.fit(data_train, target_train)  #обучение
        self.__st_model = pickle.dumps(logreg)  #сохранение модели
        
    def log_reg_test(self, data_test, target_test):
        data_test_norm = self.normalization(data_test) #нормализация тестовых данных   
        logreg = pickle.loads(self.__st_model) #загрузка сохранённой модели
        predicted = logreg.predict(data_test_norm) #тестирование
        print(classification_report(target_test, predicted))    #вывод результатов 

Вылазит ошибка:
 ... in check_array
    array = array.astype(np.float64)
ValueError: setting an array element with a sequence. 

Не могу понять, что это значит и в чём именно дело. Может я вообще что-то не так делаю?
Подскажите, пожалуйста!

Офлайн

#2 Окт. 17, 2016 14:36:27

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Scikit-learn, логистическая регрессия и ошибка

Может это поможет. А вообще покажите что на вход поступает.

PS. А почему вы обучающую выборку не нормализуете?

Офлайн

#3 Окт. 17, 2016 15:26:33

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Scikit-learn, логистическая регрессия и ошибка

Трудно представить необходимость сохранения модели

  self.__st_model = pickle.dumps(logreg)  #сохранение модели
и потом ее загрузки
 logreg = pickle.loads(self.__st_model) #загрузка сохранённой модели
поскольку, похоже, log_reg_train и log_reg_test не только являются частью одного скрипта, но и более того, являются методами какого-то одного класса.
Также можно посмотреть здесь про логистическую регрессию

Отредактировано scidam (Окт. 17, 2016 15:47:15)

Офлайн

#4 Окт. 17, 2016 15:46:30

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Scikit-learn, логистическая регрессия и ошибка

scidam
Трудно представить необходимость сохранения модели
Ну вам обученную модель в дальнейшем же необходимо будет использовать повторно.

PS. Понял о чем вы. Видимо ТС сохраняет все в файлик гдето.

Отредактировано noob_saibot (Окт. 17, 2016 15:48:26)

Офлайн

#5 Окт. 17, 2016 15:51:28

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Scikit-learn, логистическая регрессия и ошибка

noob_saibot

Ну вам обученную модель в дальнейшем же необходимо будет использовать повторно.
Это, в общем, ясно, что задача сохранения может иметь место.
Но, похоже, что log_reg_train и log_reg_test методы одного класса!

Офлайн

#6 Окт. 17, 2016 16:45:49

grapefruit_ocean
Зарегистрирован: 2016-01-31
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Scikit-learn, логистическая регрессия и ошибка

noob_saibot
Может это поможет. А вообще покажите что на вход поступает. PS. А почему вы обучающую выборку не нормализуете?
Я работаю с вот этими данными: http://archive.ics.uci.edu/ml/machine-learning-databases/spambase/spambase.data
Обучающую выборку нормализую, в функцию log_reg_train в переменную data_train поступает уже нормализованный массив векторов признаков.
Короче, ошибка была по невнимательности достаточно дурацкая. Я вот так вызывала функции класса по очереди. Получилось, что функцию нормализации я пыталась применить дважды к тестовому множеству:
 if __name__ == '__main__':
    classifier = LogReg()   
    inp = classifier.load_data('spambase.data.txt') #загрузка данных
    data = classifier.division(inp) #разделение на обучающую выборку и тестовую
    norm_train, coefs = classifier.normalization(data[0])   #нормализация обучающей выборки
    train = classifier.log_reg_train(norm_train, data[1])   #обучение
    norm_test, coefs = classifier.normalization(data[2], coefs) # нормализация тестовой выборки
    test = classifier.log_reg_test(norm_test, data[3])  # тестирование
Удалила строчку
   data_test_norm = self.normalization(data_test) #нормализация тестовых данных   
и всё заработало. Мда)
scidam
Трудно представить необходимость сохранения модели
Думаю, здесь её действительно можно не сохранять. Но задачка учебная, и сохранить модель входило в е условие.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version