2017-06-19 3 views
0

Was ich hier versuche, ist, mit dem Tennis Match Statistics Data Set here als Eingabe zur Verfügung gestellt, machte ich ein neuronales Netzwerk-Modell, das die Ergebnisse (1 oder 0) vorhersagt.MXNet Klassifizierung in Python gibt immer die gleichen Vorhersagen

Indem ich die offiziellen mxnet-Dokumente befolgte, entwickelte ich unten ein Programm. Ich versuchte mit verschiedenen Konfigurationsparametern wie Batch_size, unit_size, act_type, learning_rate, aber egal welche Art von Modifizierungen, die ich mir vorstellen konnte, war die Genauigkeit immer um 0,5 herum und sagte immer entweder 1 oder 0 voraus.

Hier
import numpy as np 
from sklearn.preprocessing import normalize 
import mxnet as mx 
import logging 
import warnings 
warnings.filterwarnings("ignore", category=DeprecationWarning) 

logging.basicConfig(level=logging.DEBUG, format='%(asctime)-15s %(message)s') 

batch_size = 100 
train_data = np.loadtxt("dm.csv",delimiter=",") 
train_data = normalize(train_data, norm='l1', axis=0) 
train_lbl = np.loadtxt("dm_lbl.csv",delimiter=",") 
eval_data = np.loadtxt("dw.csv",delimiter=",") 
eval_data = normalize(eval_data, norm='l1', axis=0) 
eval_lbl = np.loadtxt("dw_lbl.csv",delimiter=",") 


train_iter = mx.io.NDArrayIter(train_data, train_lbl, batch_size=batch_size, shuffle=True) 
val_iter = mx.io.NDArrayIter(eval_data, eval_lbl, batch_size=batch_size) 


data = mx.sym.var('data') 
# The first fully-connected layer and the corresponding activation function 
fc1 = mx.sym.FullyConnected(data=data, num_hidden=220) 
#bn1 = mx.sym.BatchNorm(data = fc1, name="bn1") 
act1 = mx.sym.Activation(data=fc1, act_type="sigmoid") 

# The second fully-connected layer and the corresponding activation function 
fc2 = mx.sym.FullyConnected(data=act1, num_hidden = 220) 
#bn2 = mx.sym.BatchNorm(data = fc2, name="bn2") 
act2 = mx.sym.Activation(data=fc2, act_type="sigmoid") 

# The third fully-connected layer and the corresponding activation function 
fc3 = mx.sym.FullyConnected(data=act2, num_hidden = 110) 
#bn3 = mx.sym.BatchNorm(data = fc3, name="bn3") 
act3 = mx.sym.Activation(data=fc3, act_type="sigmoid") 

# output class(es) 
fc4 = mx.sym.FullyConnected(data=act3, num_hidden=2) 
# Softmax with cross entropy loss 
mlp = mx.sym.SoftmaxOutput(data=fc4, name='softmax') 

mod = mx.mod.Module(symbol=mlp, 
        context=mx.cpu(), 
        data_names=['data'], 
        label_names=['softmax_label']) 
mod.fit(train_iter, 
     eval_data=val_iter, 
     optimizer='sgd', 
     optimizer_params={'learning_rate':0.03}, 
     eval_metric='rmse', 
     num_epoch=10, 
     batch_end_callback = mx.callback.Speedometer(batch_size, 100)) # output progress for each 200 data batches) 

prob = mod.predict(val_iter).asnumpy() 
#print(prob) 

for unit in prob: 
    print 'Classified as %d with probability %f' % (unit.argmax(), max(unit)) 

ist die Log-Ausgabe:

2017-06-19 17:18:34,961 Epoch[0] Train-rmse=0.500574 
2017-06-19 17:18:34,961 Epoch[0] Time cost=0.007 
2017-06-19 17:18:34,968 Epoch[0] Validation-rmse=0.500284 
2017-06-19 17:18:34,975 Epoch[1] Train-rmse=0.500703 
2017-06-19 17:18:34,975 Epoch[1] Time cost=0.007 
2017-06-19 17:18:34,982 Epoch[1] Validation-rmse=0.500301 
2017-06-19 17:18:34,990 Epoch[2] Train-rmse=0.500713 
2017-06-19 17:18:34,990 Epoch[2] Time cost=0.008 
2017-06-19 17:18:34,998 Epoch[2] Validation-rmse=0.500302 
2017-06-19 17:18:35,005 Epoch[3] Train-rmse=0.500713 
2017-06-19 17:18:35,005 Epoch[3] Time cost=0.007 
2017-06-19 17:18:35,012 Epoch[3] Validation-rmse=0.500302 
2017-06-19 17:18:35,019 Epoch[4] Train-rmse=0.500713 
2017-06-19 17:18:35,019 Epoch[4] Time cost=0.007 
2017-06-19 17:18:35,027 Epoch[4] Validation-rmse=0.500302 
2017-06-19 17:18:35,035 Epoch[5] Train-rmse=0.500713 
2017-06-19 17:18:35,035 Epoch[5] Time cost=0.008 
2017-06-19 17:18:35,042 Epoch[5] Validation-rmse=0.500302 
2017-06-19 17:18:35,049 Epoch[6] Train-rmse=0.500713 
2017-06-19 17:18:35,049 Epoch[6] Time cost=0.007 
2017-06-19 17:18:35,056 Epoch[6] Validation-rmse=0.500302 
2017-06-19 17:18:35,064 Epoch[7] Train-rmse=0.500712 
2017-06-19 17:18:35,064 Epoch[7] Time cost=0.008 
2017-06-19 17:18:35,071 Epoch[7] Validation-rmse=0.500302 
2017-06-19 17:18:35,079 Epoch[8] Train-rmse=0.500712 
2017-06-19 17:18:35,079 Epoch[8] Time cost=0.007 
2017-06-19 17:18:35,085 Epoch[8] Validation-rmse=0.500301 
2017-06-19 17:18:35,093 Epoch[9] Train-rmse=0.500712 
2017-06-19 17:18:35,093 Epoch[9] Time cost=0.007 
2017-06-19 17:18:35,099 Epoch[9] Validation-rmse=0.500301 
Classified as 0 with probability 0.530638 
Classified as 0 with probability 0.530638 
Classified as 0 with probability 0.530638 
. 
. 
. 
Classified as 0 with probability 0.530638 

Kann jemand bitte Ahnung mich, wo ich falsch?

Aus dem Dataset habe ich einige nicht informative Spalten und Header entfernt und dann in das CSV-Format konvertiert.

train_data.shape == (491, 22) 
train_lbl.shape == (491,) 
eval_data.shape == (452, 22) 
eval_lbl.shape == (452,) 
+0

Ich habe den Datensatz in diesem Programm [hier] hochgeladen (https://www.dropbox.com/sh/f7d79gu4w9xgbdx/AABvKPiwN0axn4iVpOH4p_sya?dl=0) –

Antwort

0

Die Netzwerkdefinition scheint richtig. Können Sie den train_iter und val_iter ausdrucken, um zu sehen, ob die Daten nach der Normalisierung immer noch so sind, wie Sie es erwarten? Welche Spalten werden aus den Originaldaten entfernt?

+0

Vielen Dank für Ihren Kommentar @Naveen. Der train_iter und val_iter sehen normal aus, normal verteilt. Aber mit oder ohne Normalisierungscode ergeben beide ein schlechtes Ergebnis: keine Genauigkeit/Verbesserung. Ich habe die Anzahl der Spalten aus den Originaldaten wie Spielernamen gelöscht, aber könnten Sie sich die hochgeladenen Dateien ansehen? Der Link hat die genauen Daten, die ich in diesem Programm verwende. –

Verwandte Themen