a b/GP/run_mlp.py
1
from CNN.cnn import acc_pearson_r  as acc_pearson_r
2
from MLP.mlp import mlp_main as mlp_main
3
from MLP.mlp import mlp_main_cat as mlp_main_cat
4
import os
5
import sys
6
import pandas as pd
7
import numpy as np
8
import talos as ta
9
10
from matplotlib import pyplot as plt
11
12
from keras import backend as K
13
from keras.models import Sequential
14
from keras.layers import Dense, Activation
15
from keras.layers import Dropout
16
from keras import regularizers
17
from keras.activations import relu, elu, linear, softmax, tanh, softplus
18
from keras.callbacks import EarlyStopping, Callback
19
from keras.wrappers.scikit_learn import KerasRegressor
20
from keras.optimizers import Adam, Nadam, sgd, Adadelta, RMSprop
21
from keras.losses import mean_squared_error, categorical_crossentropy, logcosh
22
from keras.utils.np_utils import to_categorical
23
from keras import metrics
24
25
# keras to CNN
26
from keras.layers import Flatten, Conv1D, MaxPooling1D
27
# defining network
28
from keras.layers import Flatten, Conv1D, MaxPooling1D
29
from keras import regularizers
30
31
import wrangle as wr
32
from talos.metrics.keras_metrics import fmeasure_acc
33
from talos.model.layers import hidden_layers
34
from talos import live
35
from talos.model import lr_normalizer, early_stopper, hidden_layers
36
import os
37
from talos import Deploy
38
39
40
def run_mlp_main(X_tr, y_tr, X_vl, y_val, output, main, prop,trait,cat,
41
lr,dr_1,dr_2,reg_1,reg_2,act_1,hn,hl,epochs,op,bs,N_neurons_FL):
42
    # population: Number of networks/genomes in each generation.
43
    # we only need to train the new ones....
44
    # generations: Number of times to evolve the population.
45
    # hyperparameters
46
    p = {'lr':  lr,
47
         'reg1': reg_1,
48
         'reg2': reg_2,
49
         'first_neuron': N_neurons_FL,
50
         'hidden_neurons': hn,
51
         'hidden_layers': hl,
52
         'batch_size': bs,
53
         'epochs': epochs,
54
         'dropout_1': dr_1,
55
         'dropout_2': dr_2,
56
         'optimizer': op,
57
         'activation': act_1,
58
         'last_activation': [linear]}
59
    if cat is False:
60
        talos_mlp = ta.Scan(x=X_tr,
61
                            y=y_tr,
62
                            model=mlp_main, params=p,
63
                            grid_downsample=prop,
64
                            print_params=True,
65
                            dataset_name='mlp_model')
66
        best_model = talos_mlp.best_model(metric='val_acc_pearson_r', asc=False)
67
    else:
68
        talos_mlp = ta.Scan(x=X_tr,
69
                            y=y_tr,
70
                            model=mlp_main_cat, params=p,
71
                            grid_downsample=prop,
72
                            print_params=True,
73
                            dataset_name='mlp_model')
74
        best_model = talos_mlp.best_model(metric='val_acc')
75
76
    x_val = X_vl
77
    yy_hat = best_model.predict(x_val, batch_size=128)
78
79
80
    # save model
81
82
    talos_Data = pd.DataFrame(talos_mlp.data)
83
    talos_Data["val_loss"] = pd.to_numeric(talos_Data["val_loss"], errors="coerce")
84
    if cat is False:
85
        talos_Data["acc_pearson_r"] = pd.to_numeric(talos_Data["acc_pearson_r"], errors="coerce")
86
        talos_Data["val_acc_pearson_r"] = pd.to_numeric(talos_Data["val_acc_pearson_r"], errors="coerce")
87
88
89
    os.chdir(output)
90
91
    if not os.path.exists("mlp"):
92
        os.makedirs("mlp")
93
        dir = output + "mlp/"
94
95
    os.chdir(os.path.join(output, 'mlp/'))
96
97
    # write output
98
    talos_Data.to_csv("mlp_prediction_talos.csv", index=False)
99
100
    r = ta.Reporting("mlp_prediction_talos.csv")
101
102
    if not os.path.exists("figures"):
103
        os.makedirs("figures")
104
        dir = output + "mlp/figures/"
105
106
    os.chdir(os.path.join(output, 'mlp/figures/'))
107
    if cat is False:
108
        try:
109
            number= y_tr.shape[1]
110
            for i in range(0, number):
111
                corr = np.corrcoef(y_val[:, i], yy_hat[:, i])[0, 1]
112
                # correlation btw predicted and observed
113
                fig = plt.figure()
114
                # plot observed vs. predicted targets
115
                plt.title('mlp: Observed vs Predicted Y trait_' + str(i) + 'cor:' + str(corr))
116
                plt.ylabel('Predicted')
117
                plt.xlabel('Observed')
118
                plt.scatter(y_val[:, i], yy_hat[:, i], marker='o')
119
                fig.savefig("mlp_Tunne_trait_" + str(i) + '.png',
120
                            dpi=300)
121
                plt.close(fig)
122
        except IndexError:
123
            yy_hat=np.reshape(yy_hat,-1)
124
125
            corr = np.corrcoef(y_val, yy_hat)[0, 1]
126
            # correlation btw predicted and observed
127
            fig = plt.figure()
128
            # plot observed vs. predicted targets
129
            plt.title('mlp: Observed vs Predicted Y trait_' + str(trait) + 'cor:' + str(corr))
130
            plt.ylabel('Predicted')
131
            plt.xlabel('Observed')
132
            plt.scatter(y_val, yy_hat, marker='o')
133
            fig.savefig("mlp_Tunne_trait_" + str(trait) + '.png',
134
                        dpi=300)
135
            plt.close(fig)
136
137
138
    os.chdir(output)
139
    if os.path.exists("best_model"):
140
        os.rmdir("best_model")
141
        os.makedirs("best_model")
142
    if not os.path.exists("best_model"):
143
        os.makedirs("best_model")
144
145
    os.chdir(os.path.join(output, 'best_model/'))
146
147
    # os.chdir(main)
148
    if cat is False:
149
        Deploy(talos_mlp, 'mlp_optimize', metric='val_acc_pearson_r', asc=False)
150
    else:
151
        Deploy(talos_mlp,'mlp_optimize')