Aufgabe
KI lernt gerade / ungerade Zahlen zu unterscheiden
Methode
Categorical Naive Bayes - ein Machine Learning Modell auf Basis der "Naive Bayes" Data Analytics Methode
Links
1. Problem Definition
Features:
M0, M1, ...
Dezimalstellen einer ganzen (nicht-negativen) Zahl. Hier beschränkt auf Läge m = 6
. Einer-Stelle rechts (M5
).
Kategorien: Für jede Dezimalstelle a
in 0,1,...,9
Response: R
, Klassen-Labels: 0 Zahl gerade, 1 Zahl ungerade
Data sets: Input 6 Ziffern, Response 1 Ziffer binär. Dataset aufgeteilt in Training- und Testdaten
Die notwendigen Imports
# Von numpy
import numpy as np
import numpy.random as rd
np.set_printoptions(precision=3,suppress=True)
# Von sklearn
from sklearn.naive_bayes import CategoricalNB
from sklearn import metrics
from sklearn.model_selection import train_test_split
2. Die Problem-Dimensionen
n_feat = 6 # M0,M1,M2,M3,M4,M5 - M5 definiert die Einer-Stellen
n_attr = 10 # 0,1,...9 Dezimalziffern
n_labl = 2 # Ergebnis-Klassen 0 (gerade), 1 (ungerade)
N = 200 # Umfang des Datasets
3. Parameter für Problem-Variationen
Standard: div=2
für die Gerade/Ungerade Lernaufgabe
# Parameter für Problem-Variationen
div = 2 # Division durch div mit Rest zur Erzeugung von Trainings-Responses
# div = 5 # Variante 2: Teilbarkeit durch 5
4. Generierung des Datasets
N
Ganze Zahlen und gerade/ungerade Klassifikation
# Features: Ganze Zahlen Zufallswahl
A = rd.randint(n_attr,size=(N,n_feat))
# Zugehörige Response: gerade (0) oder ungerade (1) per Rest modulo 2
low_digit = 5 # Position der Einerstelle in a ist M5
y = list()
y = np.fmod(A[:,low_digit],div) # R = y generiert als Rest modulo div aus der Einer-Stelle
Ansicht der ersten 20 generierten Daten
# Ausgabe der ersten 20 Daten
print(' M0........M5 y ')
print('--------------------------')
for i in range(20):
print(A[i,:],' ',y[i],)
5. Datenset Aufteilung in Trainings- und Testdaten
# Aufteilung in Training- und Test-Set: 30% für Test, zufällig ausgewählt
A_train, A_test, y_train, y_test = train_test_split(A,y,test_size=0.3,random_state=109)
6. Das Categorical NaiveBayes Modell
# Definition und Training des NB Modells aus sklearn
g_u_model = CategoricalNB(alpha=0) # alpha=0: Keine Glättung für missing values
g_u_model.fit(A_train,y_train) # "Training" des Modells mittels Trainingsdatenset
7. Ergebnisse, Tests und Accuracy des trainierten Modells
# 7.1 Gerade-Ungerade-Klassifikation für ein paar Einzel-Testzahlen
print('Ein paar Testzahlen:')
print('Testzahl y_pred y_true')
for i in range(10):
test_zahl = A_test[i]
pred = g_u_model.predict([test_zahl])
print(test_zahl,pred,' ',y_test[i])
# 7.2 Accuracy über alle Trainingsdaten und Testdaten:
# Vergleich predictions mit y_train bzw. y_test
pred_train = g_u_model.predict(A_train)
print('Accuracy Trainingset: %6.2f' % metrics.accuracy_score(y_train,pred_train))
pred_test = g_u_model.predict(A_test)
print('Accuracy Testset: %6.2f' % metrics.accuracy_score(y_test,pred_test))
# 7.3 Einige NaiveBayes-interne Ergebnisse des trainierten Modells
print('Classes :',g_u_model.classes_)
print('Class count :',g_u_model.class_count_,np.sum(g_u_model.class_count_))
logprior = g_u_model.class_log_prior_
print('Prior classes :',np.exp(logprior))
print()
print('N_features :',g_u_model.n_features_)
print('N_Categories :',g_u_model.n_categories_)
print('Category count :\n',g_u_model.category_count_)
logprob = g_u_model.feature_log_prob_
prob = np.exp(logprob)
print('Probability of features per class:\n',prob)
8. Variationen der Aufgabenstellung
Die folgenden Zellen sind je nach Aufgabenvariation im Standard-Ablauf oben zwischen zu schalten
8.1 Robustheit: Einfügen von zufälligen Fehlern in den Trainingsdaten
8.2 Vielfache von 5
# 8.1 Variation 1:
# Fehler-Generierung für Trainingsdaten: Zufällig Änderung von y_train
# --- Diese Zelle starten im Anschluß an Zelle 5. "Train-Test-Split" ---
# --- Dann weiter mit Zelle 6. "Categorical NaiveBayes Modell"
err_level = 0.05 # 5% Zufalls-Fehler in Trainingsdaten
rd_count = 0
print(y_train[:20])
for i in range(len(y_train)):
if rd.rand()<err_level:
y_train[i] = rd.choice([r for r in range(div)])
rd_count += 1
print(y_train[:20])
print('Errors:',rd_count)
# 8.2 Variation 2:
# Vielfache von 5 lernen
# --- In Zelle 3. "Parameter für Problem-Variationen" Parameter div=5 setzen ---
# --- Dann weiter in normaler Abfolge ---