Почему Keras хорошо тренируется, но дает неверные прогнозы? - PullRequest
0 голосов
/ 04 февраля 2019

Если я накормлю модель пятью цветами сетоса, я не смогу заставить свою модель предсказать, что это действительно сетоза.

Вот мой код:

# Load libraries
import numpy as np
import pandas as pd
from keras import models
from keras import layers
from keras.models import Sequential
from keras.layers import Dense
from sklearn.utils import shuffle
from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV

# Set random seed
np.random.seed(0)

# Step 1: Load data
iris = pd.read_csv("iris.csv")

X = iris.drop('species', axis=1)
y = pd.get_dummies(iris['species']).values

# Step 2: Preprocess data
scaler = preprocessing.StandardScaler() 
X = scaler.fit_transform(X)

X, y = shuffle(X, y)

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

network = models.Sequential()
network.add(layers.Dense(units=8, activation="relu", input_shape=(4,)))
network.add(layers.Dense(units=3, activation="softmax"))

# Compile neural network
network.compile(loss="categorical_crossentropy", 
                optimizer="adam", 
                metrics=["accuracy"]) 

# Train neural network
history = network.fit(X_train, # Features
                      y_train, # Target
                      epochs= 200, 
                      verbose= 1, 
                      batch_size=10, # Number of observations per batch
                      validation_data=(X_test, y_test)) # Test data

Модель обучена хорошо, вот последняя эпоха:

Epoch 200/200
112/112 [==============================] - 0s 910us/step - loss: 0.0740 - acc: 0.9911 - val_loss: 0.1172 - val_acc: 0.9737

Теперь давайте сделаем несколько прогнозов.

new_iris = iris.iloc[0:5, 0:4] # pull out the first five Setosas from original iris dataset; 
# prediction should give me Setosa since I am feeding it Setosas

np.around(network.predict(new_iris), decimals = 2) # predicts versicolor with high probability

array([[0.  , 0.95, 0.04],
       [0.  , 0.94, 0.06],
       [0.  , 0.96, 0.04],
       [0.  , 0.91, 0.09],
       [0.  , 0.96, 0.04]], dtype=float32)\

Есть идеи, почему это так?

1 Ответ

0 голосов
/ 04 февраля 2019

Вам необходимо применить преобразование, усвоенное во время тренировки во время теста.

new_iris = iris.iloc[0:5, 0:4] # pull out the first five Setosas from original iris dataset; 
new_iris = scaler.transform(new_iris)
np.around(network.predict(new_iris), decimals = 2) 

Выходы

array([[1.  , 0.  , 0.  ],
       [0.99, 0.01, 0.  ],
       [1.  , 0.  , 0.  ],
       [0.99, 0.01, 0.  ],
       [1.  , 0.  , 0.  ]], dtype=float32)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...