In [ ]:
## How to predict wine-class (wine data) using a keras deep learning model

def Snippet_339(): 

    print()
    print(format('How to predict wine-class (wine data) using a keras deep learning model','*^88'))

    import warnings
    warnings.filterwarnings("ignore")

    # load libraries
    from sklearn import datasets
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from keras.utils import np_utils
    from keras.models import Sequential
    from keras.layers.core import Dense, Activation
    from keras.optimizers import SGD, RMSprop, Adam
    from keras.regularizers import l2
    import matplotlib.pyplot as plt    

    import time
    start_time = time.time()

    # set parameters
    NB_CLASSES = 3
    VALIDATION_SPLIT = 0.25
    VERBOSE = 1
    BATCH_SIZE = 128

    # load Dataset    
    iris = datasets.load_wine()
    X = iris.data
    y = iris.target
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
    
    # Preprocess The X Data By Scaling
    sc = StandardScaler(with_mean=True, with_std=True)
    sc.fit(X_train)

    # Apply the scaler to the X training data
    X_train_std = sc.transform(X_train)

    # Apply the SAME scaler to the X test data
    X_test_std = sc.transform(X_test)
    
    # -----------------------------------------------
    # convert class vectors to binary class matrices
    # -----------------------------------------------
    Y_train = np_utils.to_categorical(y_train, NB_CLASSES)
    Y_test  = np_utils.to_categorical(y_test, NB_CLASSES)

    # ---------------------------------------------------------------------
    # setup a deep learning model
    # ---------------------------------------------------------------------
    accuracy = []
    for OPTIMIZER in [SGD(), RMSprop(), Adam()]: 
        for NB_EPOCH in [50,100,200]:
            for N_Units_in_Multiple_Layers in [64, 128, 256]:
                model = Sequential()
                model.add(Dense(units = N_Units_in_Multiple_Layers, input_shape=(X_train.shape[1],), 
                                kernel_regularizer=l2())) 
                model.add(Activation('relu'))
                model.add(Dense(units = N_Units_in_Multiple_Layers, kernel_regularizer=l2()))
                model.add(Activation('relu'))
                model.add(Dense(units = NB_CLASSES))
                model.add(Activation('softmax'))

                model.summary()
                
                model.compile(loss='categorical_crossentropy', optimizer=OPTIMIZER, metrics=['accuracy'])
                
                model.fit(X_train_std, Y_train, batch_size=BATCH_SIZE, epochs=NB_EPOCH,
                          verbose=VERBOSE, validation_split=VALIDATION_SPLIT)
                
                score = model.evaluate(X_test_std, Y_test, verbose=VERBOSE)
                
                print()
                print('Optimizers: ', OPTIMIZER)
                print('Epoch Sizes: ', NB_EPOCH)            
                print('Neurons or Units: ', N_Units_in_Multiple_Layers)            
                print("Test score:", score[0])
                print('Test accuracy:', score[1])
                accuracy.append(score[1])
                print()

    print(accuracy)
    y = accuracy; N = len(y); x = range(N); width = 1./1.5;
    plt.ylim(0.75,1.1)
    plt.bar(x,y,width); plt.show()

    print()
    print("Execution Time %s seconds: " % (time.time() - start_time))    

Snippet_339()