Scikit-Learn против Keras (Tensorflow) для полиномиальной логистики c регрессия - PullRequest
3 голосов
/ 08 января 2020

Я пробую простую полиномиальную логистику c регрессию с использованием Keras, но результаты сильно отличаются от стандартного подхода scikit-learn.

Например, с данными радужной оболочки:

import numpy as np
import pandas as pd
df = pd.read_csv("./data/iris.data", header=None)

from sklearn.model_selection import train_test_split
df_train, df_test = train_test_split(df, test_size=0.3, random_state=52)

X_train = df_train.drop(4, axis=1)
y_train = df_train[4]

X_test = df_test.drop(4, axis=1)
y_test = df_test[4]

Использование scikit-learn:

from sklearn.linear_model import LogisticRegression

scikit_model = LogisticRegression(multi_class='multinomial', solver ='saga', max_iter=500)
scikit_model.fit(X_train, y_train)

средневзвешенная оценка f1 в наборе тестов:

y_test_pred = scikit_model.predict(X_test)

from sklearn.metrics import classification_report
print(classification_report(y_test, y_test_pred, scikit_model.classes_))

равно 0.96.

Затем с помощью Keras:

from sklearn.preprocessing import LabelEncoder
from keras.utils import np_utils

# first we have to encode class values as integers
encoder = LabelEncoder()
encoder.fit(y_train)
y_train_encoded = encoder.transform(y_train)
Y_train = np_utils.to_categorical(y_train_encoded)
y_test_encoded = encoder.transform(y_test)
Y_test = np_utils.to_categorical(y_test_encoded)

from tensorflow import keras
from tensorflow.keras.models import Sequential 
from tensorflow.keras.layers import Dense, Activation
from keras.regularizers import l2

#model construction
input_dim = 4 # 4 variables
output_dim = 3 # 3 possible outputs

def classification_model():
    model = Sequential()
    model.add(Dense(output_dim, input_dim=input_dim, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
    return model

#training
keras_model = classification_model()
keras_model.fit(X_train, Y_train, epochs=500, verbose=0)

средневзвешенный f1-балл на тестовом наборе:

classes = np.argmax(keras_model.predict(X_test), axis = 1)
y_test_pred = encoder.inverse_transform(classes)

from sklearn.metrics import classification_report
print(classification_report(y_test, y_test_pred, encoder.classes_))

равен 0.89.

Возможно ли выполнить идентичное (или хотя бы столько же) насколько это возможно) logisti c регрессия с Keras как с scikit-learn?

Ответы [ 2 ]

2 голосов
/ 08 января 2020

Одно очевидное отличие - saga (вариант SAG ) используется в LogisticRegression, а SGD используется в вашем NN. Насколько я знаю, LogisticRegression не поддерживает SGD. В качестве альтернативы вы можете использовать SGDRegressor или SGDClassifier вместо LogisticRegression. И вот блог обсуждает различия между ними.

1 голос
/ 08 января 2020

Я попытался запустить ваши примеры и заметил несколько потенциальных источников:

  • Набор тестов невероятно мал, всего 45 экземпляров. Это означает, что для получения точности от 0,89 до 0,96 модели необходимо только правильно прогнозировать еще три случая. Из-за случайности в тренировках ваши результаты Keras могут колебаться совсем немного.
  • Как объясняется @ meowonga c { ссылка }, вы используете другой оптимизатор. Одним из моментов является то, что алгоритм Scikit автоматически устанавливает скорость обучения. Для SGD в Керасе настройка скорости обучения и / или количество эпох может привести к улучшениям.
  • Scikit learn по умолчанию использует регуляризацию L2.

Используя ваш код, я смог чтобы получить точность от 0,89 до 0,96, запустив SGD со скоростью обучения 0,05. При переходе на Адама (также с этой довольно высокой скоростью обучения) я получил более стабильные результаты в диапазоне от 0,92 до 0,96 (хотя это скорее впечатление, поскольку я не проводил слишком много испытаний).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...