【发布时间】:2020-08-15 20:07:34
【问题描述】:
我使用来自 uci 机器学习存储库的 pokerhand 数据集,我应用了一个神经网络,一切都很顺利。只是混淆矩阵的呈现,就有问题了。 所以这是我的代码(请忽略我的 cmets,我是德国人..):
# Code reproduzierbar machen
from numpy.random import seed
seed(0)
from tensorflow import set_random_seed
set_random_seed(0)
# Importiere Datasets (Training und Test)
import pandas as pd
poker_train = pd.read_csv("C:/Users/elihe/Documents/Studium Master/WS 19 und 20/Softwareprojekt/poker-hand-training-true.data", header = None, names= ['Farbe K1', 'Rang K1', 'Farbe K2', 'Rang K2', 'Farbe K3', 'Rang K3', 'Farbe K4', 'Rang K4', 'Farbe K5', 'Rang K5', 'Poker-Hand'])
poker_test = pd.read_csv("C:/Users/elihe/Documents/Studium Master/WS 19 und 20/Softwareprojekt/poker-hand-testing.data", header = None, names= ['Farbe K1', 'Rang K1', 'Farbe K2', 'Rang K2', 'Farbe K3', 'Rang K3', 'Farbe K4', 'Rang K4', 'Farbe K5', 'Rang K5', 'Poker-Hand'])
# Umwandlung der Outputs
from sklearn.preprocessing import OneHotEncoder
# Trainings- und Testset in Input und Output verwandeln
X_tr = poker_train.iloc[:, 0:10].values
y_tr = poker_train.iloc[:, 10:11].values
X_te = poker_test.iloc[:, 0:10].values
y_te = poker_test.iloc[:, 10:11].values
encode = OneHotEncoder()
y_tr = encode.fit_transform(y_tr).toarray()
y_te = encode.fit_transform(y_te).toarray()
# Skalierung
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_tr = sc.fit_transform(X_tr)
X_te = sc.transform(X_te)
# Kürzen der Datasets aufgrund der Rechenzeit
# train_test_split unnötig
X_train = X_tr[:5000]
y_train = y_tr[:5000]
X_test = X_te[:5000]
y_test = y_te[:5000]
# NN mit Keras erstellen
import keras
from keras.models import Sequential
from keras.layers import Dense
# Schritt für Schritt Layer hinzufügen
nen = Sequential()
# Input Layer: 10 Features als Input, 5 Units für den Hidden Layer
nen.add(Dense(512, input_dim = 10, activation = 'sigmoid'))
nen.add(Dense(512, activation = 'sigmoid'))
# Output Layer: eine Unit, erhält 5 Inputs vom Hidden Layer und 10 Outputs (für jeden möglichen Ausgang)
nen.add(Dense(10, activation = 'softmax'))
# Kompilieren
from keras.optimizers import RMSprop
# Loss-Funktion und Optimizer wählen
# Loss gibt den Unterschied zwischen Vorhersage und wahrem Wert an, sollte sinken
# Optimizer ist Methode, gibt an, wie die Gewichte im NN verändert werden müssen, sodass die Loss-Funktion fällt
nen.compile(loss='binary_crossentropy', optimizer=RMSprop(0.001), metrics=['accuracy'])
# batch_size = Anzahl an Samples pro Batch, Batch = teile Dataset auf
# epochs = ein ganzes(!) Dataset geht einmal durch das NN
nen_fit = nen.fit(X_train, y_train,epochs=30, batch_size=15, verbose=1, validation_split = 0.2, shuffle = False)
from sklearn.metrics import confusion_matrix
np.set_printoptions(suppress = True)
y_vorh = nen.predict(X_test)
y_vorh = np.argmax(y_vorh, axis =1)
y_test = np.argmax(y_test, axis = 1)
confmat = confusion_matrix(y_test ,y_vorh)
print(confmat)
作为输出,我只得到 8 个东西,但我希望有 10 个,因为我的输出可能是从 0 到 9:
[[2155 359 0 0 0 0 0 0]
[1525 562 0 0 0 0 0 0]
[ 153 91 0 0 0 0 0 0]
[ 57 54 0 0 0 0 0 0]
[ 8 11 0 0 0 0 0 0]
[ 10 2 0 0 0 0 0 0]
[ 2 7 0 0 0 0 0 0]
[ 1 3 0 0 0 0 0 0]]
问题出在哪里?我该如何解决这个问题?
【问题讨论】:
-
您的
y_vorh或y_test中是否有所有10 个标签? -
所以我最初将 0-9 的标签作为带有 0 和 1 的向量(onehotencoding),并且在应用
np.argmax我之后只有零和一个作为向量 -
我真的不知道如何解码我的 oneHotEncoding..如果你明白我的意思
标签: python pandas machine-learning keras