【问题标题】:Confusion Matrix doesn't show all outputs after NN混淆矩阵在 NN 之后不显示所有输出
【发布时间】: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_vorhy_test 中是否有所有10 个标签?
  • 所以我最初将 0-9 的标签作为带有 0 和 1 的向量(onehotencoding),并且在应用np.argmax我之后只有零和一个作为向量
  • 我真的不知道如何解码我的 oneHotEncoding..如果你明白我的意思

标签: python pandas machine-learning keras


【解决方案1】:

应该是因为这几行:

# 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]

您排除了部分训练和测试数据,这看起来没有必要。这很可能从测试集中排除了两个类,因此,创建了一个只有 8 个类的混淆矩阵。我希望删除 [:5000] 可以解决意外观察。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 2020-03-09
    • 2020-07-25
    • 2017-02-18
    • 2019-09-28
    相关资源
    最近更新 更多