Keras Tensorflow хорошо работает в обучении и тестировании, но предсказывает один и тот же класс для всех входных данных в окончательном наборе данных - PullRequest
2 голосов
/ 17 мая 2019

У меня проблемы с использованием Tensorflow для решения проблемы классификации

У меня есть набор данных с 259 514 строками, классифицированный по следующим группам:

Groups:

[0,1)       - 171.646 rowns
[1,55)      - 17.262  rowns
[55,105)    - 17.320  rowns
[105,170)   - 17.392  rowns
[170,285)   - 18092   rowns
[285, Inf]  - 17802   rowns

Я попытался сбалансировать данныеоставляя только около 18 000 строк для каждой группы.

Затем данные были разделены на 70 869 тренировочных линий и 34 907 тестовых линий.

Сеть обучалась с 20 эпохами, точность составляла 0,54831, при генерацииМатрица путаницы (Train x Test) Я получил следующий результат:

labels=["[0,1)", "[1,55)","[55,105)", "[105,170)", "[170,285)","[285, Inf]"])

array([[5019,  215,   78,  182,  189,  136],
       [ 224, 3260,  807,  522,  331,  546],
       [ 258, 1076, 2236,  926,  504,  744],
       [ 273,  492,  592, 2534,  965,  997],
       [ 238,  375,  394,  819, 2555, 1549],
       [ 134,  249,  347,  418,  821, 3902]])

Мне кажется, это нормально.

Но когда я наконец пытаюсь предсказать свои данные, у меня есть всестрок в одной группе:

ix
Y_pred
[1,55)                3
[105,170)             3
[170,285)             8
[285, Inf]            788286

Я уже пробовал:

  • Обучить сеть со всем набором данных
  • Не нормализовать данные
  • Нормализация данных с помощью StandardScaler, MinMaxScaler, RobutsScaler
  • Обучение модели на 500 эпох
  • Добавление или удаление слоев и нейронов из сети

    Я действительно это делаюне знаю чтоЭто может быть причиной, кто-нибудь может мне помочь?


    from google.colab import drive
    drive.mount('/content/gdrive')

    #Bibliotecas
    import keras
    from keras.models import Sequential
    from keras.layers import Dense, Dropout, Activation
    from keras.optimizers import SGD

    import numpy as np
    import pandas as pd
    from keras.wrappers.scikit_learn import KerasClassifier
    from keras.utils import np_utils
    from sklearn.model_selection import cross_val_score
    from sklearn.model_selection import KFold
    from sklearn.preprocessing import LabelEncoder
    from sklearn.pipeline import Pipeline
    from sklearn.model_selection import train_test_split
    from sklearn import preprocessing

    #Equili
    dataset =  dataset.groupby('vl_baixa_group', group_keys=False).apply(lambda x: x.sample(min(len(x), 18000)))
    dataset.groupby(['vl_baixa_group']).count()


    ##Normalize
    from sklearn import preprocessing
    x = dataset.select_dtypes(include='int64')
    StandardScaler = preprocessing.StandardScaler()
    x_scaled = StandardScaler.fit_transform(x)

    x_new = pd.DataFrame(x_scaled, columns=x.columns, index=x.index)
    dataset_norm = pd.concat([x_new,dataset.select_dtypes(include='category')], join="inner", axis=1)

    #Dumyes
    dataset_norm = pd.get_dummies(dataset_norm,  columns= (dataset_norm.select_dtypes(include='category')).columns.difference(['vl_baixa_group',]))


    #DataFrame Numpy
    dataframe = dataset_norm.to_numpy()

    #Y
    Y = dataframe[:,dataset_norm.columns.get_loc("vl_baixa_group")]

    encoder = LabelEncoder()
    encoder.fit(Y)
    encoded_Y = encoder.transform(Y)
    Y = np_utils.to_categorical(encoded_Y)

    #X
    X = dataframe[:,(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45)]

    #Z
    Z = (dataset_norm.index).to_numpy()



    # seed for reproducing same results
    seed = 9
    np.random.seed(seed)

    # split the data into training (67%) and testing (33%)
    (X_train, X_test, Y_train, Y_test, Z_train, Z_test) = train_test_split(X, Y, Z, test_size=0.33, random_state=seed)

    #Z_test.shape

    unique_elements, counts_elements = np.unique(encoder.inverse_transform(np.argmax( Y_test ,axis=1)) , return_counts=True)
    print("Frequency of unique values of the said array:")
    print(np.asarray((unique_elements, counts_elements)))

    #NetWork

    from keras.callbacks import * 
    import tensorflow as tf
    from tensorflow import keras

    #Check Point
    checkpoint_path = "/content/gdrive/My Drive/Colab Notebooks/Models/2019_05_07_keras_tensor_deacts/training_cp/cp_epochs2:{epoch:03d}-val_acc:{val_acc:.3f}.ckpt"
    checkpoint_dir = os.path.dirname(checkpoint_path)

    # Create checkpoint callback
    cp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_path,
                                                     save_best_only=True,
                                                     monitor='val_acc',
                                                     mode='max',
                                                     verbose=1)

    # create the model
    model = Sequential()
    model.add(Dense(64, input_dim=45, init='random_normal', activation='relu'))
    model.add(Dense(32, init='random_normal', activation='relu'))
    model.add(Dense(6,  init='random_normal', activation='softmax'))

    # compile the model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

    #Fiting
    # fit the model
    history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test), nb_epoch=20, batch_size=5, verbose=1, callbacks = [cp_callback])

    # evaluate the model
    scores = model.evaluate(X_test, Y_test)
    print("Accuracy: %.2f%%" % (scores[1]*100))

    #Salvando Modelo
    model.save('/content/gdrive/My Drive/Colab Notebooks/Models/2019_05_07_keras_tensor_deacts/model.h5')



    #Confusion Matrix

    y_pred = model.predict(X_test)

    from sklearn.metrics import confusion_matrix
    cm = confusion_matrix( encoder.inverse_transform(np.argmax( Y_test ,axis=1)) 
                          ,encoder.inverse_transform(np.argmax( y_pred ,axis=1))
                          ,labels=["[0,1)", "[1,55)","[55,105)", "[105,170)", "[170,285)","[285, Inf]"])
    cm



    #------ Predict real Data

    #Normalize
    from sklearn import preprocessing
    x_pred = dataset_pred.select_dtypes(include='int64')
    x_scaled_pred = StandardScaler.transform(x_pred)

    x_new_pred = pd.DataFrame(x_scaled_pred, columns=x_pred.columns, index=x_pred.index)
    dataset_norm_pred = pd.concat([x_new_pred,dataset_pred.select_dtypes(include='category')], join="inner", axis=1)

    dataset_norm_pred.head()

    # Dumyes
      dataset_norm_pred = pd.get_dummies(dataset_norm_pred,  columns= (dataset_norm_pred.select_dtypes(include='category')).columns.difference(['vl_baixa_group',]))

    dataset_norm_pred.describe()

    dataset_norm.describe()

    #  DataFrame Numpy
    dataframe_pred = dataset_norm_pred.to_numpy()

    # X
    X_Pred = dataframe_pred[:,(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44)]

    # Z
    Z_Pred = (dataset_norm_pred.index).to_numpy()

    pred = model.predict(X_Pred)

    pred

    pred_t = np.column_stack((Z_Pred
                               ,encoder.inverse_transform(np.argmax( pred ,axis=1))))

    other_pred = pd.DataFrame(data=pred_t[1:,0:],    # values
                 index=pred_t[1:,0],    # 1st column as index
                 columns=['ix','Y_pred']
                )  # 1st row as the column names

    #other_pred.head()

    other_pred.groupby(['Y_pred']).count()  

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