Как оценить результаты мультиклассовой классификации с помощью керас? - PullRequest
0 голосов
/ 01 марта 2019

Я хочу использовать глубокое обучение для многоклассовой классификации (softmax, keras).Итак, я построил модель и получил ошибку, которая заключалась в том, что ожидаемая форма вывода и фактическая форма вывода отличаются.В моем случае, тип был 1,2,3, поэтому ожидаемая форма равна 3 (3 класса), но фактическая форма равна 4. Эта ошибка решается при изменении 1,2,3 на 0,1,2 или установке ожидаемой формыдо 4. Последнее означает изменение классификации 3 класса на 4 класса классификации.Почему этот код работает?В данном случае что означает прогнозируемая вероятность?Как я оцениваю эти результаты?

Это пример кода.

from sklearn import datasets
iris = datasets.load_iris()

# X -> features, y -> label
X = iris.data
y = iris.target
mini_dict = {0: 'a', 1: 'b', 2: 'c'}
y = pd.Series(y, name=None).replace(mini_dict)
mini_dict = {'a': 3, 'b': 1, 'c': 2}
y = pd.Series(y, name=None).replace(mini_dict)
def multiclass_model():
    model = Sequential()
    model.add(Dense(10,input_dim=4))
    model.add(Dropout(0.1))
    model.add(Dense(3,activation='softmax')) #this is expected shape
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy','categorical_accuracy'])
    return (model)

model=KerasClassifier(build_fn=multiclass_model, epochs=20, batch_size=3, verbose=0)
model.fit(X,y.values)

и получаем эту ошибку.

Error when checking model target: expected dense_94 to have shape (None, 3) but got array with shape (150, 4)

и следующее переопределение multiclass_model

def multiclass_model():
    model = Sequential()
    model.add(Dense(10,input_dim=4))
    model.add(Dropout(0.1))
    model.add(Dense(4,activation='softmax')) #change 3 to 4
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy','categorical_accuracy'])
    return (model)

model=KerasClassifier(build_fn=multiclass_model, epochs=20, batch_size=3, verbose=0)
model.fit(X,y.values)

ошибок нет, и я могу получить прогнозируемые значения.

model.predict_proba(X[0:5])
array([[2.52738446e-05, 2.23150160e-02, 3.87168024e-04, 9.77272570e-01],
       [5.91093449e-05, 4.23159041e-02, 1.24582055e-03, 9.56379175e-01],
       [5.94217017e-05, 3.10160406e-02, 7.65587494e-04, 9.68158960e-01],
       [1.07116306e-04, 4.50214930e-02, 1.48290978e-03, 9.53388453e-01],
       [2.73615278e-05, 2.02178583e-02, 3.34151875e-04, 9.79420602e-01]],
      dtype=float32)

y.values[:5]
array([3, 3, 3, 3, 3])

Я не знаю достоверности этих значений.

проверка номера класса

np.unique(y.values)
array([1, 2, 3])

1 Ответ

0 голосов
/ 01 марта 2019

Если вы хотите сделать мультиклассовую классификацию, вам нужно сделать one-hot encoding для ваших векторов меток.Из-за вашего y.values вывода я предполагаю, что ваш y выглядит так [1,2,3,2...].Однако Tensorflows KerasClassifier позаботится об этом, что можно увидеть в исходном коде. (source) Таким образом, ваша метка будет превращена во что-то подобное [[0],[1],[2],[1],...].На следующем шаге эти метки будут закодированы one-hot, что также можно увидеть в исходном коде. (source) Теперь ваша метка выглядит следующим образом [[1,0,0],[0,1,0],[0,0,1],[0,1,0]].

В моем понимании все должно работать нормально, если вы используете только 3 класса в выходном слое вместо 4.

Так что проверьте еще раз данные вашей метки y, например, np.unique(y.values).Я предполагаю, что вы случайно создали вектор метки, содержащий [0,1,2,3].

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