這次我將修改前次的生成對抗網路,希望能夠調整為一個自動生成樣本的神經網路。我這次將使用以前曾經使用過的CRE Bacteria data(https://hermitlin.netlify.com/post/2019/04/24/cre-bacteria-data-analysis/ )。 我先建立一個簡單的分類模型,一將使用p_value前五個維度當作解釋變數,先建立一個簡單的分類模型,並將第一類的46個當作樣本輸入至生成對抗網路,調整訓練參數,且試圖讓神經網路能夠產生第一類別的資料。最後,經由生成器生成的資料我將匯入原先的分類模型,觀察是否能產生類似於第一類別的資料,並最終計算其生成準確率。

匯入原始資料

原始資料有95筆 * 1462維資料,並且以是否為CRE細菌作為二元分類依據,我們先將資料切至95 * 50的大小並建立一簡易二元分類模型。

import pandas as pd
import numpy as np

data = pd.read_csv('C:/Users/User/OneDrive - student.nsysu.edu.tw/Educations/NSYSU/fu_chung/bacterial/123.csv')
data.head()
data_50 = data.iloc[:,0:50]
cre = data.loc[:, ['CRE']]
cre = pd.concat([data_50,cre],axis = 1,join = 'outer')
data1 = data[0:46]
data11 = data.iloc[0:46,0:50]
data2 = data[46:96]
cre
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V42 V43 V44 V45 V46 V47 V48 V49 V50 CRE
0 251357.70 0.00 494285.53 114879.43 31439.26 0.00 94049.75 0.00 0.00 0.00 85986.77 0.00 54979.47 0.00 278172.31 65956.08 0.00 0.00 0.00 1
1 394550.19 65408.65 2186094.75 137296.91 0.00 401122.91 350882.59 0.00 0.00 0.00 645223.63 486622.78 0.00 0.00 159735.28 0.00 1143224.25 0.00 13108.50 1
2 0.00 129236.21 675608.81 182865.20 16074.49 0.00 0.00 49122.42 0.00 0.00 0.00 0.00 0.00 0.00 259147.75 130750.07 0.00 0.00 11471.32 1
3 137403.30 0.00 818021.25 0.00 0.00 0.00 0.00 24273.09 0.00 0.00 0.00 0.00 14327.79 0.00 0.00 113117.47 0.00 0.00 0.00 1
4 377358.78 327564.66 532502.63 0.00 0.00 913255.00 0.00 0.00 0.00 0.00 48186.92 241815.84 0.00 356398.22 0.00 0.00 0.00 0.00 0.00 1
5 321700.28 300239.31 220649.50 289622.50 42589.68 896569.38 26930.33 130587.49 0.00 0.00 74352.74 161985.64 0.00 0.00 10547.48 0.00 596415.63 0.00 0.00 1
6 122302.27 163517.28 143966.83 197685.97 44586.54 665813.19 68359.62 86041.64 0.00 0.00 28788.66 82527.43 0.00 0.00 0.00 277068.66 531947.25 0.00 0.00 1
7 458382.13 136389.20 412460.16 294669.03 46850.84 470360.91 70784.13 52197.92 0.00 0.00 148098.28 269423.69 0.00 0.00 396628.63 153470.94 0.00 0.00 59923.06 1
8 404748.19 97165.77 800137.44 134355.13 0.00 285973.69 152992.25 0.00 0.00 0.00 244165.31 424717.97 0.00 0.00 227433.22 50524.48 727185.63 0.00 81509.76 1
9 0.00 237456.30 489450.28 317787.66 0.00 0.00 0.00 0.00 0.00 0.00 0.00 374539.31 0.00 0.00 364267.56 0.00 0.00 0.00 66223.03 1
10 0.00 60298.57 242256.88 0.00 0.00 0.00 28529.95 0.00 577876.63 0.00 0.00 38658.57 0.00 224369.88 6513216.00 0.00 61225.02 0.00 0.00 1
11 0.00 0.00 39572.38 102085.48 0.00 0.00 0.00 0.00 37461.19 0.00 8476.11 29001.76 0.00 0.00 3069943.00 0.00 0.00 0.00 0.00 1
12 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 360071.94 0.00 0.00 0.00 0.00 0.00 1
13 214887.48 250224.81 764692.88 440959.63 4499.10 0.00 250105.41 253094.77 0.00 0.00 0.00 0.00 0.00 0.00 5126750.50 323721.41 0.00 0.00 1290133.38 1
14 1024226.56 62647.80 907918.56 190326.44 0.00 357887.69 174800.92 39311.43 0.00 0.00 409826.63 339814.25 0.00 0.00 850082.00 80572.13 1511603.75 0.00 246942.27 1
15 850345.94 0.00 1142041.75 0.00 22913.52 83391.35 132192.95 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12294757.00 0.00 580786.00 0.00 0.00 1
16 133160.09 0.00 324190.84 165610.81 0.00 529124.81 0.00 76230.84 0.00 0.00 0.00 0.00 0.00 0.00 3765545.50 112336.07 0.00 0.00 0.00 1
17 853561.81 224773.64 894039.13 256644.66 0.00 691336.94 151860.30 0.00 0.00 0.00 0.00 229604.53 0.00 0.00 13607436.00 275794.03 0.00 0.00 3668494.75 1
18 1093476.88 0.00 1066216.00 214933.13 1172.88 417991.06 0.00 0.00 0.00 0.00 0.00 303218.16 0.00 0.00 3830377.25 166417.11 0.00 0.00 0.00 1
19 835839.38 196176.73 1012032.63 282281.94 0.00 0.00 229121.41 90093.88 0.00 0.00 0.00 368116.94 0.00 0.00 1202129.13 269585.47 0.00 0.00 280330.34 1
20 0.00 0.00 0.00 0.00 69313.85 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10560.65 0.00 0.00 997972.56 0.00 1
21 701646.44 98642.90 1148627.88 162741.14 5982.86 451335.22 197993.38 107926.05 0.00 0.00 0.00 0.00 0.00 0.00 580906.13 147341.31 731664.13 0.00 0.00 1
22 0.00 123056.53 695162.56 0.00 0.00 0.00 151534.30 106993.80 0.00 0.00 93097.80 0.00 0.00 0.00 8234697.50 319331.75 0.00 0.00 0.00 1
23 617170.38 111139.70 585900.88 309262.72 0.00 463963.53 124548.41 68199.38 0.00 0.00 143815.31 0.00 0.00 0.00 1165821.50 194897.69 262373.09 0.00 0.00 1
24 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 120912.78 0.00 0.00 0.00 0.00 0.00 1
25 205087.30 130860.28 170190.36 239147.09 32240.99 461357.53 79884.00 106250.06 0.00 0.00 93911.43 160792.20 0.00 0.00 0.00 0.00 211207.25 0.00 0.00 1
26 233611.23 0.00 288788.53 0.00 62809.87 572302.38 105359.08 0.00 0.00 0.00 81040.71 181801.95 0.00 257644.23 0.00 0.00 308586.69 0.00 0.00 1
27 443459.50 193747.16 328036.19 370594.88 46355.38 629435.25 74593.73 84710.16 0.00 0.00 108000.26 231578.25 0.00 0.00 364557.78 0.00 480221.81 0.00 61320.29 1
28 169506.22 94801.80 756320.94 227413.02 3680.05 663061.88 147819.56 112498.08 0.00 0.00 263977.31 322974.41 0.00 0.00 0.00 391799.50 1083744.13 0.00 0.00 1
29 0.00 0.00 0.00 801636.50 23726.37 737771.00 0.00 133648.45 0.00 0.00 122182.41 211591.83 0.00 0.00 0.00 250239.63 196264.91 0.00 0.00 1
65 0.00 225195.66 19572.24 63537.30 0.00 0.00 0.00 0.00 0.00 1212757.50 0.00 0.00 0.00 325006.94 8263.08 0.00 77168.25 0.00 0.00 0
66 0.00 2340887.50 10041711.00 65790.56 257753.78 0.00 0.00 0.00 0.00 142773.91 0.00 0.00 0.00 15381708.00 9648307.00 0.00 0.00 0.00 0.00 0
67 0.00 40468.29 2929239.50 35529.07 0.00 0.00 134214.80 0.00 0.00 739789.69 0.00 96349.65 8238.51 174242.38 1659760.63 0.00 0.00 0.00 0.00 0
68 0.00 0.00 22582.54 275360.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 2066323.88 176120.22 0.00 0.00 0.00 0.00 0
69 0.00 55406.89 37459.26 567906.94 0.00 0.00 0.00 0.00 0.00 0.00 0.00 79680.77 2215088.25 53483.09 353274.03 0.00 0.00 0.00 0.00 0
70 0.00 1373136.00 55669.65 29413.53 0.00 0.00 0.00 0.00 0.00 1849143.63 0.00 0.00 0.00 208588.38 90467.52 0.00 0.00 0.00 0.00 0
71 0.00 2209497.50 0.00 332850.19 0.00 0.00 0.00 0.00 0.00 88801.86 675265.50 0.00 31135.10 264477.78 82188.95 0.00 0.00 0.00 0.00 0
72 0.00 53772.94 0.00 26620.26 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1740308.88 0.00 38134.36 292079.94 0.00 0.00 0.00 0.00 0
73 0.00 2577626.75 5790287.00 381110.81 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1179673.13 0.00 3556.30 0.00 0.00 0.00 0.00 0.00 0
74 0.00 0.00 0.00 1980458.38 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 15431.62 0.00 46608.68 0.00 0.00 0.00 0.00 0
75 0.00 0.00 0.00 9948.27 0.00 0.00 55582.52 0.00 0.00 0.00 0.00 61258.17 155787.94 55921.07 0.00 0.00 0.00 0.00 0.00 0
76 0.00 7889.80 215028.61 10020.09 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 73794.52 224818.03 5925.26 0.00 0.00 0.00 0.00 0
77 0.00 0.00 0.00 140673.16 16277292.00 1037529.88 147025.31 292055.81 0.00 0.00 0.00 181992.77 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0
78 0.00 603047.88 675125.19 30792.79 0.00 419252.44 14130.80 0.00 0.00 0.00 0.00 60714.32 1038307.81 0.00 0.00 0.00 0.00 0.00 0.00 0
79 0.00 11717567.00 0.00 1276.74 57683.21 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 4174.87 618743.06 0.00 0.00 0.00 0.00 0
80 0.00 1614557.63 234533.52 496465.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 307068.22 275608.84 0.00 0.00 0.00 0.00 0
81 0.00 0.00 0.00 1464.59 148034.02 0.00 0.00 0.00 0.00 0.00 1381.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00 4450154.00 0
82 0.00 446516.91 0.00 144939.20 0.00 0.00 0.00 0.00 0.00 402528.88 121573.77 0.00 0.00 101450.37 11617.65 0.00 0.00 0.00 0.00 0
83 0.00 77867.39 0.00 207631.50 0.00 0.00 0.00 0.00 0.00 0.00 15775.92 3139882.25 0.00 4056.35 0.00 0.00 0.00 0.00 0.00 0
84 11023.05 1640.80 17683.26 97989.88 0.00 0.00 0.00 0.00 0.00 1571.67 96426.15 0.00 0.00 62245.50 0.00 0.00 0.00 0.00 14222485.00 0
85 0.00 0.00 0.00 574.92 2521.91 0.00 0.00 0.00 0.00 0.00 153162.88 0.00 0.00 674132.88 67454.39 0.00 0.00 0.00 0.00 0
86 13400.29 0.00 0.00 21661.37 0.00 0.00 0.00 0.00 0.00 328922.13 4786.63 0.00 0.00 1665447.00 1625.76 0.00 138802.00 0.00 0.00 0
87 0.00 823729.31 0.00 4515339.00 0.00 0.00 0.00 0.00 0.00 0.00 26520.87 0.00 153672.52 0.00 0.00 0.00 0.00 1925521.25 0.00 0
88 0.00 179299.59 0.00 88929.42 0.00 1187859.25 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 265478.72 302789.31 0.00 0.00 0
89 0.00 511629.00 0.00 8267.26 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 514513.66 0.00 0
90 0.00 77937.30 42382.20 5088.32 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 69394.41 95436.05 0.00 0.00 0.00 0.00 0
91 0.00 2911.97 15953.10 80433.93 0.00 0.00 0.00 0.00 0.00 0.00 89290.69 0.00 7406277.50 260645.84 0.00 0.00 0.00 0.00 0.00 0
92 0.00 6875.02 360036.50 28350.88 172198.25 7187.31 0.00 0.00 0.00 522638.75 212652.81 639224.63 0.00 0.00 0.00 0.00 0.00 0.00 489542.88 0
93 0.00 7963.32 29800.15 174881.72 0.00 0.00 0.00 0.00 0.00 0.00 53438.88 0.00 0.00 8913.21 7853.11 0.00 0.00 0.00 0.00 0
94 0.00 0.00 0.00 371997.59 0.00 0.00 0.00 0.00 0.00 64870.32 0.00 0.00 0.00 1906689.38 304293.44 0.00 0.00 0.00 0.00 0

95 rows × 51 columns

ax = pd.DataFrame(np.transpose(data.head())).plot()

訓練分類器模型

這裡使用隨機森林建立一個簡單但具分類意義的分類器。

import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
# Build Train and Test data set
cre_X = cre.iloc[:,0:50]
cre_y = cre["CRE"]
train_X, test_X, train_y, test_y = train_test_split(cre_X, cre_y, test_size = 0.3)
# Build the random forest model
forest = ensemble.RandomForestClassifier(n_estimators = 100)
forest_fit = forest.fit(train_X, train_y)
test_y_predicted = forest.predict(test_X)
accuracy_rf = metrics.accuracy_score(test_y, test_y_predicted)
print(accuracy_rf)

0.8620689655172413

Set Up Module

%matplotlib inline
import os
import random
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from tqdm import tqdm_notebook as tqdm
from keras.models import Model
from keras.layers import Input, Reshape
from keras.layers.core import Dense, Activation, Dropout, Flatten
from keras.layers.normalization import BatchNormalization
from keras.layers.convolutional import UpSampling1D, Conv1D
from keras.layers.advanced_activations import LeakyReLU
from keras.optimizers import Adam, SGD
from keras.callbacks import TensorBoard

建立生成器

def get_generative(G_in, dense_dim=200, out_dim=50, lr=1e-3):
    x = Dense(dense_dim)(G_in)
    x = Activation('tanh')(x)
    G_out = Dense(out_dim, activation='tanh')(x)
    G = Model(G_in, G_out)
    opt = SGD(lr=lr)
    G.compile(loss='binary_crossentropy', optimizer=opt)
    return G, G_out

G_in = Input(shape=[10])
G, G_out = get_generative(G_in)
G.summary()

Layer (type) Output Shape Param #
================================================================= input_4 (InputLayer) (None, 10) 0
_________________________________________________________________ dense_5 (Dense) (None, 200) 2200
_________________________________________________________________ activation_2 (Activation) (None, 200) 0
_________________________________________________________________ dense_6 (Dense) (None, 50) 10050
================================================================= Total params: 12,250 Trainable params: 12,250 Non-trainable params: 0 _________________________________________________________________

建立判別器

def get_discriminative(D_in, lr=1e-3, drate=.25, n_channels=50, conv_sz=5, leak=.2):
    x = Reshape((-1, 1))(D_in)
    x = Conv1D(n_channels, conv_sz, activation='relu')(x)
    x = Dropout(drate)(x)
    x = Flatten()(x)
    x = Dense(n_channels)(x)
    D_out = Dense(2, activation='sigmoid')(x)
    D = Model(D_in, D_out)
    dopt = Adam(lr=lr)
    D.compile(loss='binary_crossentropy', optimizer=dopt)
    return D, D_out

D_in = Input(shape=[50])
D, D_out = get_discriminative(D_in)
D.summary()

Layer (type) Output Shape Param #
================================================================= input_5 (InputLayer) (None, 50) 0
_________________________________________________________________ reshape_2 (Reshape) (None, 50, 1) 0
_________________________________________________________________ conv1d_2 (Conv1D) (None, 46, 50) 300
_________________________________________________________________ dropout_2 (Dropout) (None, 46, 50) 0
_________________________________________________________________ flatten_2 (Flatten) (None, 2300) 0
_________________________________________________________________ dense_7 (Dense) (None, 50) 115050
_________________________________________________________________ dense_8 (Dense) (None, 2) 102
================================================================= Total params: 115,452 Trainable params: 115,452 Non-trainable params: 0 _________________________________________________________________

串接兩神經網路

def set_trainability(model, trainable=False):
    model.trainable = trainable
    for layer in model.layers:
        layer.trainable = trainable
        
def make_gan(GAN_in, G, D):
    set_trainability(D, False)
    x = G(GAN_in)
    GAN_out = D(x)
    GAN = Model(GAN_in, GAN_out)
    GAN.compile(loss='binary_crossentropy', optimizer=G.optimizer)
    return GAN, GAN_out

GAN_in = Input([10])
GAN, GAN_out = make_gan(GAN_in, G, D)
GAN.summary()

Layer (type) Output Shape Param #
================================================================= input_6 (InputLayer) (None, 10) 0
_________________________________________________________________ model_4 (Model) (None, 50) 12250
_________________________________________________________________ model_5 (Model) (None, 2) 115452
================================================================= Total params: 127,702 Trainable params: 12,250 Non-trainable params: 115,452 _________________________________________________________________

def sample_data_and_gen(G, noise_dim=10, n_samples=46):
    XT = np.array(data11)
    XN_noise = np.random.uniform(0, 1, size=[n_samples, noise_dim])
    XN = G.predict(XN_noise)
    X = np.concatenate((XT, XN))
    y = np.zeros((2*n_samples, 2))
    y[:n_samples, 1] = 1
    y[n_samples:, 0] = 1
    return X, y

def pretrain(G, D, noise_dim=10, n_samples=46, batch_size=32):
    X, y = sample_data_and_gen(G, n_samples=n_samples, noise_dim=noise_dim)
    set_trainability(D, True)
    D.fit(X, y, epochs=1, batch_size=batch_size)
    
pretrain(G, D)

def sample_noise(G, noise_dim=10, n_samples=46):
    X = np.random.uniform(0, 1, size=[n_samples, noise_dim])
    y = np.zeros((n_samples, 2))
    y[:, 1] = 1
    return X, y

Epoch 1/1 92/92 [==============================] - ETA: 0s - loss: 2.393 - 1s 6ms/step - loss: 5.6152

訓練生成對抗網路

訓練生成對抗網路,並存取最後一次生成器產生結果

def train(GAN, G, D, epochs=500, n_samples=46, noise_dim=10, batch_size=32, verbose=False, v_freq=50,):
    d_loss = []
    g_loss = []
    e_range = range(epochs)
    if verbose:
        e_range = tqdm(e_range)
    for epoch in e_range:
        X, y = sample_data_and_gen(G, n_samples=n_samples, noise_dim=noise_dim)
        set_trainability(D, True)
        d_loss.append(D.train_on_batch(X, y))
        xx,yy = X,y
        
        X, y = sample_noise(G, n_samples=n_samples, noise_dim=noise_dim)
        set_trainability(D, False)
        g_loss.append(GAN.train_on_batch(X, y))
        if verbose and (epoch + 1) % v_freq == 0:
            print("Epoch #{}: Generative Loss: {}, Discriminative Loss: {}".format(epoch + 1, g_loss[-1], d_loss[-1]))
    return d_loss, g_loss, xx, yy

d_loss, g_loss ,xx,yy= train(GAN, G, D, verbose=True)

HBox(children=(IntProgress(value=0, max=500), HTML(value=’’)))

Epoch #50: Generative Loss: 11.389734268188477, Discriminative Loss: 8.015128135681152 Epoch #100: Generative Loss: 11.560905456542969, Discriminative Loss: 8.015127182006836 Epoch #150: Generative Loss: 11.707502365112305, Discriminative Loss: 8.01512622833252 Epoch #200: Generative Loss: 11.78805160522461, Discriminative Loss: 8.01512336730957 Epoch #250: Generative Loss: 11.92248821258545, Discriminative Loss: 8.015122413635254 Epoch #300: Generative Loss: 12.040063858032227, Discriminative Loss: 8.015122413635254 Epoch #350: Generative Loss: 12.16407299041748, Discriminative Loss: 8.015120506286621 Epoch #400: Generative Loss: 12.269856452941895, Discriminative Loss: 8.015120506286621 Epoch #450: Generative Loss: 12.354406356811523, Discriminative Loss: 8.015120506286621 Epoch #500: Generative Loss: 12.472232818603516, Discriminative Loss: 8.015120506286621

損失函數

ax = pd.DataFrame(
    {
        'Generative Loss': g_loss,
        'Discriminative Loss': d_loss,
    }
).plot(title='Training loss', logy=True)
ax.set_xlabel("Epochs")
ax.set_ylabel("Loss")

Text(0, 0.5, ‘Loss’)

最後一次生成器所生成資料

pd.DataFrame(xx)
0 1 2 3 4 5 6 7 8 9 40 41 42 43 44 45 46 47 48 49
0 2.513577e+05 0.000000 4.942855e+05 114879.430000 31439.260000 0.000000 94049.750000 0.000000 0.000000 0.000000 0.000000 85986.770000 0.000000 54979.470000 0.000000 2.781723e+05 65956.080000 0.000000e+00 0.000000 0.000000e+00
1 3.945502e+05 65408.650000 2.186095e+06 137296.910000 0.000000 401122.910000 350882.590000 0.000000 0.000000 0.000000 0.000000 645223.630000 486622.780000 0.000000 0.000000 1.597353e+05 0.000000 1.143224e+06 0.000000 1.310850e+04
2 0.000000e+00 129236.210000 6.756088e+05 182865.200000 16074.490000 0.000000 0.000000 49122.420000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 2.591478e+05 130750.070000 0.000000e+00 0.000000 1.147132e+04
3 1.374033e+05 0.000000 8.180212e+05 0.000000 0.000000 0.000000 0.000000 24273.090000 0.000000 0.000000 0.000000 0.000000 0.000000 14327.790000 0.000000 0.000000e+00 113117.470000 0.000000e+00 0.000000 0.000000e+00
4 3.773588e+05 327564.660000 5.325026e+05 0.000000 0.000000 913255.000000 0.000000 0.000000 0.000000 0.000000 0.000000 48186.920000 241815.840000 0.000000 356398.220000 0.000000e+00 0.000000 0.000000e+00 0.000000 0.000000e+00
5 3.217003e+05 300239.310000 2.206495e+05 289622.500000 42589.680000 896569.380000 26930.330000 130587.490000 0.000000 0.000000 0.000000 74352.740000 161985.640000 0.000000 0.000000 1.054748e+04 0.000000 5.964156e+05 0.000000 0.000000e+00
6 1.223023e+05 163517.280000 1.439668e+05 197685.970000 44586.540000 665813.190000 68359.620000 86041.640000 0.000000 0.000000 0.000000 28788.660000 82527.430000 0.000000 0.000000 0.000000e+00 277068.660000 5.319472e+05 0.000000 0.000000e+00
7 4.583821e+05 136389.200000 4.124602e+05 294669.030000 46850.840000 470360.910000 70784.130000 52197.920000 0.000000 0.000000 0.000000 148098.280000 269423.690000 0.000000 0.000000 3.966286e+05 153470.940000 0.000000e+00 0.000000 5.992306e+04
8 4.047482e+05 97165.770000 8.001374e+05 134355.130000 0.000000 285973.690000 152992.250000 0.000000 0.000000 0.000000 0.000000 244165.310000 424717.970000 0.000000 0.000000 2.274332e+05 50524.480000 7.271856e+05 0.000000 8.150976e+04
9 0.000000e+00 237456.300000 4.894503e+05 317787.660000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 374539.310000 0.000000 0.000000 3.642676e+05 0.000000 0.000000e+00 0.000000 6.622303e+04
10 0.000000e+00 60298.570000 2.422569e+05 0.000000 0.000000 0.000000 28529.950000 0.000000 577876.630000 0.000000 0.000000 0.000000 38658.570000 0.000000 224369.880000 6.513216e+06 0.000000 6.122502e+04 0.000000 0.000000e+00
11 0.000000e+00 0.000000 3.957238e+04 102085.480000 0.000000 0.000000 0.000000 0.000000 37461.190000 0.000000 0.000000 8476.110000 29001.760000 0.000000 0.000000 3.069943e+06 0.000000 0.000000e+00 0.000000 0.000000e+00
12 0.000000e+00 0.000000 0.000000e+00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 360071.940000 0.000000e+00 0.000000 0.000000e+00 0.000000 0.000000e+00
13 2.148875e+05 250224.810000 7.646929e+05 440959.630000 4499.100000 0.000000 250105.410000 253094.770000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 5.126750e+06 323721.410000 0.000000e+00 0.000000 1.290133e+06
14 1.024227e+06 62647.800000 9.079186e+05 190326.440000 0.000000 357887.690000 174800.920000 39311.430000 0.000000 0.000000 0.000000 409826.630000 339814.250000 0.000000 0.000000 8.500820e+05 80572.130000 1.511604e+06 0.000000 2.469423e+05
15 8.503459e+05 0.000000 1.142042e+06 0.000000 22913.520000 83391.350000 132192.950000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.229476e+07 0.000000 5.807860e+05 0.000000 0.000000e+00
16 1.331601e+05 0.000000 3.241908e+05 165610.810000 0.000000 529124.810000 0.000000 76230.840000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 3.765546e+06 112336.070000 0.000000e+00 0.000000 0.000000e+00
17 8.535618e+05 224773.640000 8.940391e+05 256644.660000 0.000000 691336.940000 151860.300000 0.000000 0.000000 0.000000 0.000000 0.000000 229604.530000 0.000000 0.000000 1.360744e+07 275794.030000 0.000000e+00 0.000000 3.668495e+06
18 1.093477e+06 0.000000 1.066216e+06 214933.130000 1172.880000 417991.060000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 303218.160000 0.000000 0.000000 3.830377e+06 166417.110000 0.000000e+00 0.000000 0.000000e+00
19 8.358394e+05 196176.730000 1.012033e+06 282281.940000 0.000000 0.000000 229121.410000 90093.880000 0.000000 0.000000 0.000000 0.000000 368116.940000 0.000000 0.000000 1.202129e+06 269585.470000 0.000000e+00 0.000000 2.803303e+05
20 0.000000e+00 0.000000 0.000000e+00 0.000000 69313.850000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.056065e+04 0.000000 0.000000e+00 997972.560000 0.000000e+00
21 7.016464e+05 98642.900000 1.148628e+06 162741.140000 5982.860000 451335.220000 197993.380000 107926.050000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 5.809061e+05 147341.310000 7.316641e+05 0.000000 0.000000e+00
22 0.000000e+00 123056.530000 6.951626e+05 0.000000 0.000000 0.000000 151534.300000 106993.800000 0.000000 0.000000 0.000000 93097.800000 0.000000 0.000000 0.000000 8.234698e+06 319331.750000 0.000000e+00 0.000000 0.000000e+00
23 6.171704e+05 111139.700000 5.859009e+05 309262.720000 0.000000 463963.530000 124548.410000 68199.380000 0.000000 0.000000 0.000000 143815.310000 0.000000 0.000000 0.000000 1.165822e+06 194897.690000 2.623731e+05 0.000000 0.000000e+00
24 0.000000e+00 0.000000 0.000000e+00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 120912.780000 0.000000e+00 0.000000 0.000000e+00 0.000000 0.000000e+00
25 2.050873e+05 130860.280000 1.701904e+05 239147.090000 32240.990000 461357.530000 79884.000000 106250.060000 0.000000 0.000000 0.000000 93911.430000 160792.200000 0.000000 0.000000 0.000000e+00 0.000000 2.112072e+05 0.000000 0.000000e+00
26 2.336112e+05 0.000000 2.887885e+05 0.000000 62809.870000 572302.380000 105359.080000 0.000000 0.000000 0.000000 0.000000 81040.710000 181801.950000 0.000000 257644.230000 0.000000e+00 0.000000 3.085867e+05 0.000000 0.000000e+00
27 4.434595e+05 193747.160000 3.280362e+05 370594.880000 46355.380000 629435.250000 74593.730000 84710.160000 0.000000 0.000000 0.000000 108000.260000 231578.250000 0.000000 0.000000 3.645578e+05 0.000000 4.802218e+05 0.000000 6.132029e+04
28 1.695062e+05 94801.800000 7.563209e+05 227413.020000 3680.050000 663061.880000 147819.560000 112498.080000 0.000000 0.000000 0.000000 263977.310000 322974.410000 0.000000 0.000000 0.000000e+00 391799.500000 1.083744e+06 0.000000 0.000000e+00
29 0.000000e+00 0.000000 0.000000e+00 801636.500000 23726.370000 737771.000000 0.000000 133648.450000 0.000000 0.000000 0.000000 122182.410000 211591.830000 0.000000 0.000000 0.000000e+00 250239.630000 1.962649e+05 0.000000 0.000000e+00
62 5.771863e-02 0.079141 9.384196e-02 0.125138 0.146934 0.233003 0.055012 -0.087537 -0.007778 0.055186 0.057421 -0.197108 -0.061168 0.211870 -0.066151 1.301075e-01 -0.054132 -2.114740e-01 -0.090373 -4.699485e-02
63 1.442752e-02 0.051881 2.286542e-02 0.104279 0.116842 0.140988 0.056342 -0.070146 -0.031679 0.097089 0.035543 -0.120193 -0.021412 0.093633 -0.050723 1.535993e-01 -0.029451 -1.341466e-01 -0.073321 -4.161552e-03
64 1.278929e-01 0.077950 5.305723e-02 0.144055 0.165029 0.139697 0.028592 -0.105480 -0.035320 0.071927 0.008859 -0.174204 -0.038903 0.210827 -0.074771 9.185766e-02 -0.035059 -1.106470e-01 -0.130182 -6.297275e-02
65 1.447559e-01 0.045958 4.400671e-02 0.140874 0.129621 0.157389 0.072795 -0.123201 -0.072477 0.076058 0.007564 -0.158442 -0.017006 0.092313 -0.071628 1.778769e-01 -0.032934 -1.343839e-01 -0.067688 -1.133780e-01
66 2.923003e-02 0.089982 7.115061e-02 0.160336 0.188756 0.178656 0.076112 -0.153013 -0.053440 0.141031 0.099056 -0.201940 -0.015563 0.197481 -0.082291 1.690800e-01 0.004397 -1.911636e-01 -0.194577 -9.241361e-02
67 4.488285e-02 0.014902 5.291061e-02 0.093878 0.111078 0.141065 0.053293 -0.044797 -0.012182 -0.004407 0.039949 -0.139107 -0.044550 0.143295 -0.049501 6.762740e-02 -0.030763 -7.233275e-02 -0.064332 -1.079918e-01
68 5.010782e-02 0.045066 6.465222e-02 0.136270 0.160859 0.171901 0.080074 -0.103908 -0.043519 0.132829 0.054123 -0.178683 -0.003971 0.133090 -0.074374 1.734688e-01 -0.000379 -1.489321e-01 -0.165764 -9.517734e-02
69 -8.699703e-02 0.088150 6.905080e-02 0.141996 0.176542 0.143441 0.008008 -0.110503 -0.008441 0.164581 0.082234 -0.144232 -0.021611 0.194980 -0.062477 1.285854e-01 0.015981 -1.959769e-01 -0.218486 6.528822e-03
70 1.163195e-01 0.049792 9.390505e-02 0.149623 0.172283 0.179477 0.073764 -0.113348 -0.041673 0.072650 0.052443 -0.211731 -0.025951 0.199543 -0.064184 1.280974e-01 -0.010837 -1.773765e-01 -0.168073 -1.308074e-01
71 -3.098747e-02 0.080269 7.809231e-02 0.135378 0.180432 0.145843 -0.010058 -0.092386 -0.011612 0.128141 0.046156 -0.147168 -0.035000 0.201276 -0.083927 1.009080e-01 0.012110 -1.150701e-01 -0.210679 -7.272352e-02
72 -5.603977e-05 0.086260 6.558941e-02 0.162166 0.183209 0.142338 0.036340 -0.155236 -0.057950 0.176502 0.069604 -0.166726 -0.004081 0.157140 -0.070198 1.764633e-01 0.018980 -2.049197e-01 -0.212454 -5.348644e-02
73 -1.597475e-02 0.082567 6.936116e-02 0.128655 0.213990 0.148111 0.059413 -0.123450 -0.016059 0.116500 0.115040 -0.171914 -0.035751 0.220132 -0.084824 1.483972e-01 -0.024151 -1.925847e-01 -0.186185 4.065286e-02
74 -4.355310e-02 0.124092 8.693540e-02 0.143820 0.139506 0.224342 -0.001981 -0.055389 0.015957 0.082807 0.075091 -0.204232 -0.073173 0.252675 -0.072187 8.624671e-02 0.004114 -1.449837e-01 -0.181872 -1.628515e-01
75 7.016601e-02 0.126638 6.968953e-02 0.177304 0.197027 0.169905 0.025738 -0.153522 -0.052389 0.155450 0.053709 -0.209556 -0.034219 0.236195 -0.079108 1.532988e-01 -0.002492 -2.017526e-01 -0.211118 -6.792208e-02
76 -3.582065e-02 0.075462 7.358342e-02 0.120523 0.172002 0.175398 0.036168 -0.064960 0.008145 0.100263 0.090297 -0.176223 -0.045846 0.214244 -0.068341 1.150602e-01 -0.008958 -1.573523e-01 -0.179583 -3.757584e-02
77 1.149180e-03 0.073993 4.709528e-02 0.116353 0.148364 0.141842 0.057276 -0.100674 -0.030467 0.045873 0.102190 -0.153453 -0.057053 0.165054 -0.053285 1.368121e-01 -0.029020 -1.778644e-01 -0.089894 -2.899860e-02
78 4.883933e-02 0.073878 1.052822e-01 0.148079 0.173811 0.176635 0.019220 -0.105041 -0.022027 0.060350 0.063225 -0.193632 -0.050965 0.226729 -0.071156 9.797296e-02 -0.000686 -1.610914e-01 -0.181303 -1.430665e-01
79 -1.273230e-02 0.056331 4.888410e-02 0.133763 0.174581 0.110827 0.026463 -0.120391 -0.043959 0.175507 0.039367 -0.124524 0.004223 0.121695 -0.069352 1.589927e-01 0.010103 -1.553590e-01 -0.195841 8.593322e-03
80 2.019642e-02 0.058863 8.318582e-02 0.158097 0.164991 0.160093 0.028337 -0.099454 -0.029948 0.158778 0.037951 -0.184605 -0.000601 0.179939 -0.057108 1.289516e-01 0.034764 -1.603799e-01 -0.239722 -1.197372e-01
81 1.089811e-01 0.047334 5.823605e-02 0.129653 0.186784 0.130830 0.055852 -0.122106 -0.045716 0.084037 0.033420 -0.157943 -0.022635 0.170346 -0.087565 1.277712e-01 -0.032698 -1.151622e-01 -0.139719 -3.704622e-02
82 -2.369104e-02 0.039272 1.003548e-01 0.121072 0.176277 0.160217 0.028175 -0.068355 -0.001034 0.080345 0.086252 -0.168808 -0.040289 0.182596 -0.066557 1.155214e-01 0.013119 -1.522985e-01 -0.200415 -1.017104e-01
83 3.295303e-02 0.128977 3.527293e-02 0.149690 0.177678 0.157079 0.031657 -0.120921 -0.033545 0.140918 0.056751 -0.177175 -0.040286 0.232053 -0.078717 1.313213e-01 -0.022502 -1.580906e-01 -0.166002 -2.041462e-03
84 -2.193222e-02 0.071473 4.067374e-02 0.127829 0.129760 0.156506 0.085491 -0.065933 -0.019193 0.073946 0.110103 -0.187463 -0.036088 0.186077 -0.044486 1.043225e-01 -0.003263 -1.358489e-01 -0.140418 -1.032844e-01
85 1.287738e-03 0.134546 3.888072e-02 0.165624 0.126719 0.164514 0.009274 -0.132407 -0.053828 0.152904 0.034691 -0.164441 -0.028324 0.185680 -0.063293 1.271236e-01 0.004165 -1.574730e-01 -0.149576 -9.104238e-02
86 1.190792e-01 0.049373 7.937831e-02 0.141312 0.137289 0.203820 0.068109 -0.103065 -0.043260 0.092760 0.010624 -0.187389 -0.018631 0.147604 -0.076098 1.515454e-01 -0.025110 -1.434764e-01 -0.115842 -1.291046e-01
87 4.425447e-02 0.121940 6.427467e-02 0.144705 0.201681 0.167424 0.014653 -0.138411 -0.031778 0.123827 0.048905 -0.167162 -0.051302 0.238433 -0.095100 1.377496e-01 -0.043771 -1.745853e-01 -0.156156 2.941268e-02
88 1.352898e-02 0.093871 1.029101e-01 0.129897 0.160283 0.241069 0.037356 -0.079107 0.009802 0.064191 0.071833 -0.204458 -0.059586 0.262838 -0.096586 7.896692e-02 -0.029935 -1.215087e-01 -0.154695 -1.246584e-01
89 -6.471997e-02 0.161791 8.699533e-02 0.166800 0.153273 0.239945 -0.011309 -0.127351 -0.014987 0.153934 0.075217 -0.197810 -0.053932 0.260759 -0.086715 1.205225e-01 0.004634 -2.008244e-01 -0.192758 -1.036462e-01
90 -7.696584e-03 0.057619 1.040991e-01 0.114195 0.183359 0.196935 0.010609 -0.030886 0.040294 0.088672 0.050991 -0.185898 -0.048450 0.255344 -0.076115 6.810440e-02 -0.018218 -1.282074e-01 -0.204055 -3.708909e-02
91 2.760612e-02 0.067704 3.295968e-02 0.129812 0.154076 0.102998 0.043750 -0.084157 -0.033504 0.080922 0.073709 -0.159288 -0.034829 0.167826 -0.045594 1.152339e-01 -0.004282 -1.422732e-01 -0.147273 -4.370746e-02

92 rows × 50 columns

pd.DataFrame(np.transpose(xx)).plot()

<matplotlib.axes._subplots.AxesSubplot at 0x21e22a40c50>

Test the generation

使用最後一次生成結果匯入前面訓練好的分類模型,檢查是否能判別為第一類別。

test_y_predicted = forest.predict(xx)
pd.DataFrame(test_y_predicted)
0
0 1
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1
10 1
11 1
12 1
13 1
14 1
15 1
16 1
17 1
18 1
19 1
20 1
21 1
22 1
23 1
24 1
25 1
26 1
27 1
28 1
29 1
62 0
63 0
64 0
65 0
66 0
67 0
68 0
69 0
70 0
71 0
72 0
73 0
74 0
75 0
76 0
77 0
78 0
79 0
80 0
81 0
82 0
83 0
84 0
85 0
86 0
87 0
88 0
89 0
90 0
91 0

92 rows × 1 columns

判別為正確的比例:

sum(test_y_predicted)/len(test_y_predicted)

0.4673913043478261

結論

我們可以看到,生成的樣本分類率僅0.46左右,可以說是相當不理想,但換個角度思考,這當中有46%的資料是可以當作新的樣本加入訓練集,因此我們可透過事先建立的分類器來當作衡量樣本是否可當作是當的生成樣本。且若我們僅憑肉眼看生成的資料,其範圍也落在0-40000這個區間左右,矩陣稀疏情況也看似接近。當然,生成對抗網路還有許多細節可以調整,也許可以調整學習率、backpropagation、drop out等等事項來改善生成器神經網路。先前看到有多種生成對抗網路,如conditional-GAN,MCF-GAN等等,也許我可以學習其他類型架構的生成對抗網路來完成這樣工作也不一定。