Προσέγγιση ταξινόμησης με νευρωνικά δίκτυα

Προσέγγιση ταξινόμησης με νευρωνικά δίκτυα

Oktober 1, 2022 0 Von admin

Αυτό το άρθρο δημοσιεύτηκε ως μέρος του Data Science Blogathon.

Εισαγωγή στην Ταξινόμηση

Η ταξινόμηση είναι μία από τις βασικές εργασίες που μπορεί να εκπαιδεύσει ένα μηχάνημα. Αυτό μπορεί να περιλαμβάνει την ταξινόμηση εάν θα βρέξει ή όχι σήμερα χρησιμοποιώντας τα δεδομένα καιρού, τον προσδιορισμό της έκφρασης του ατόμου με βάση την εικόνα του προσώπου ή το συναίσθημα της κριτικής βάσει κειμένου κ.λπ. Η ταξινόμηση εφαρμόζεται εκτενώς σε διάφορες εφαρμογές, καθιστώντας έτσι μία από τις πιο θεμελιώδεις εργασίες υπό την εποπτευόμενη μηχανική εκμάθηση.

Υπάρχουν διάφοροι αλγόριθμοι που χρησιμοποιούνται για την εκτέλεση ταξινόμησης με βάση τον τύπο του συνόλου δεδομένων που εξετάζεται. Αυτό κυμαίνεται από ταξινομητές που βασίζονται σε δέντρα, όπως Random Forests και δέντρα αποφάσεων, έως αλγόριθμους ενισχυμένους με κλίση όπως XGboost ή ταξινομητές που βασίζονται σε νευρωνικά δίκτυα. Σε αυτό το ιστολόγιο, ας διερευνήσουμε πώς να χρησιμοποιήσουμε νευρωνικά δίκτυα για τη δημιουργία προσαρμοσμένων ταξινομητών για ένα πίνακα δεδομένων. Το πλεονέκτημα της χρήσης νευρωνικών δικτύων είναι ότι μπορούμε εύκολα να εντοπίσουμε και να μάθουμε άγνωστα μοτίβα που υπάρχουν στα δεδομένα.

Αλλά πριν ξεκινήσουμε με την ταξινόμηση, ας ξεκινήσουμε…

Αναφορά Ι|  Ταξινόμηση

Σχετικά με το σύνολο δεδομένων

Το σύνολο δεδομένων που χρησιμοποιούμε για να εκπαιδεύσουμε το μοντέλο μας είναι το Ίρις Σύνολο δεδομένων. Αυτό το σύνολο δεδομένων αποτελείται από 150 δείγματα που ανήκουν σε 3 είδη λουλουδιών Iris, δηλαδή Iris Setosa, Iris Versicolour και Iris Virginica. Αυτό είναι ένα σύνολο δεδομένων πολλαπλών παραλλαγών, δηλαδή υπάρχουν 4 χαρακτηριστικά που παρέχονται για κάθε δείγμα, π.χ. μήκος σέπαλου, πλάτος σέπαλου, μήκος πετάλου και πλάτος πετάλου. Πρέπει να χρησιμοποιήσουμε αυτά τα 4 χαρακτηριστικά και να ταξινομήσουμε τον τύπο του είδους της ίριδας. Έτσι, χρησιμοποιείται ένα μοντέλο ταξινόμησης πολλαπλών τάξεων για εκπαίδευση σε αυτό το σύνολο δεδομένων. Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με αυτό το σύνολο δεδομένων εδώ.

Ξεκινώντας με την ταξινόμηση

Ας ξεκινήσουμε εισάγοντας πρώτα τις απαιτούμενες βιβλιοθήκες,

import os
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras import layers
from tensorflow.keras import models
from tensorflow.keras import optimizers
from tensorflow.keras import losses
from tensorflow.keras import metrics
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score
from tensorflow import keras
from sklearn.preprocessing import LabelEncoder

Ελέγξτε την έκδοση του TensorFlow που έχει εγκατασταθεί ως εξής:

print(tf.__version__)

Στη συνέχεια, πρέπει να κατεβάσουμε και να εξαγάγουμε το σύνολο δεδομένων από εδώ. Στη συνέχεια, μετακινήστε το στη θέση του σημειωματάριου/σεναρίου ή αντιγράψτε τη θέση του συνόλου δεδομένων. Τώρα διαβάστε το αρχείο CSV από αυτήν τη θέση,

file_path="iris_dataset.csv"
df = pd.read_csv(file_path)
df.head()

Μπορούμε να δούμε ότι το σύνολο δεδομένων μας έχει 4 χαρακτηριστικά εισόδου και 1 μεταβλητή στόχο. Η μεταβλητή στόχος αποτελείται από 3 κλάσεις, δηλαδή «Iris-setosa», «Iris-versicolor» και «Iris-verginica». Τώρα ας προετοιμάσουμε περαιτέρω το σύνολο δεδομένων μας για εκπαίδευση μοντέλων.

Προετοιμασία Δεδομένων

Αρχικά, ας ελέγξουμε αν το σύνολο δεδομένων μας αποτελείται από μηδενικές τιμές.

print(df.isnull().sum())

Δεν υπάρχουν μηδενικές τιμές. Επομένως, μπορούμε να συνεχίσουμε να διαχωρίζουμε τις εισροές και τους στόχους.

X = df.drop('target', axis=1)
y = df['target']

Εφόσον τώρα έχουμε διαχωρίσει τις δυνατότητες εισαγωγής (X) και τις ετικέτες στόχου (y), ας χωρίσουμε το σύνολο δεδομένων σε σύνολα εκπαίδευσης και επικύρωσης. Για το σκοπό αυτό ας χρησιμοποιήσουμε το Scikit-Learn’s train_test_split μέθοδος για τον διαχωρισμό των δεδομένων μας.

X_train, X_test, y_train, y_test = train_test_split(X, 
                                                    y, 
                                                    test_size=0.2, 
                                                    random_state=42)
print("The length of training dataset: ", len(X_train))
print("The length of validation dataset: ", len(X_test))

Στον παραπάνω κώδικα, έχουμε χωρίσει το σύνολο δεδομένων έτσι ώστε τα δεδομένα επικύρωσης να περιέχουν το 20% των τυχαία επιλεγμένων δειγμάτων από ολόκληρο το σύνολο δεδομένων. Ας κάνουμε τώρα περαιτέρω κάποια επεξεργασία πριν δημιουργήσουμε το μοντέλο.

Επεξεργασία δεδομένων

Εφόσον έχουμε έτοιμο τον διαχωρισμό δεδομένων, ας κάνουμε τώρα κάποια βασική επεξεργασία, όπως κλιμάκωση χαρακτηριστικών και κωδικοποίηση ετικετών. Τα χαρακτηριστικά εισόδου περιέχουν χαρακτηριστικά πετάλου και σέπαλου, δηλαδή μήκος και πλάτος σε εκατοστά. Επομένως, αυτά τα χαρακτηριστικά είναι αριθμητικά και πρέπει να κανονικοποιηθούν, δηλαδή να μετασχηματιστούν τα δεδομένα έτσι ώστε ο μέσος όρος να είναι 0 και η τυπική απόκλιση να είναι 1.

Ας χρησιμοποιήσουμε το Scikit-learn’s StandardScalar ενότητα για να κάνει το ίδιο.

features_encoder = StandardScaler()
features_encoder.fit(X_train)
########################################################
X_train = features_encoder.transform(X_train)
X_test = features_encoder.transform(X_test)

Τώρα θα πρέπει να κωδικοποιήσουμε τις κατηγορικές ετικέτες στόχων. Αυτό συμβαίνει επειδή το μοντέλο μας δεν θα μπορεί να καταλάβει εάν οι κατηγορίες αντιπροσωπεύονται σε συμβολοσειρές. Επομένως, ας κωδικοποιήσουμε τις ετικέτες χρησιμοποιώντας Scikit-learn’s LabelEncoder μονάδα μέτρησης.

label_encoder = LabelEncoder()
label_encoder.fit(y_train)
########################################################
y_train = label_encoder.transform(y_train).reshape(-1, 1)
y_test = label_encoder.transform(y_test).reshape(-1, 1)

Τώρα ας ελέγξουμε τα σχήματα των συνόλων δεδομένων,

print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)

Μεγάλος! Τώρα είμαστε έτοιμοι να καθορίσουμε και να εκπαιδεύσουμε το μοντέλο μας.

Δημιουργία μοντέλου

Ας ορίσουμε το μοντέλο ταξινόμησης χρησιμοποιώντας το Keras Ακολουθητικός API. Μπορούμε να στοιβάξουμε τα απαιτούμενα επίπεδα και να ορίσουμε την αρχιτεκτονική του μοντέλου. Για αυτό το μοντέλο, ας ορίσουμε Πυκνός επίπεδα για να ορίσετε τα επίπεδα εισόδου, εξόδου και ενδιάμεσων επιπέδων.

model = Sequential([
    layers.Dense(8, activation="relu", input_shape=(4,)),
    layers.Dense(16, activation="relu"),
    layers.Dense(32, activation="relu"),
    layers.Dense(3, activation="softmax")
])

Στο παραπάνω μοντέλο, έχουμε ορίσει 4 πυκνά στρώματα. Το επίπεδο εξόδου αποτελείται από 3 νευρώνες, δηλαδή ίσο με τον αριθμό των ετικετών εξόδου που υπάρχουν. Χρησιμοποιούμε το softmax συνάρτηση ενεργοποίησης στο τελικό επίπεδο επειδή επιτρέπει στο μοντέλο να παρέχει πιθανότητες για κάθε μία από τις ετικέτες. Η ετικέτα εξόδου που έχει τη μεγαλύτερη πιθανότητα είναι η πρόβλεψη εξόδου που καθορίζεται από το μοντέλο. Σε άλλα στρώματα, χρησιμοποιήσαμε το ΒΙΟΓΡΑΦΙΚΟ λειτουργία ενεργοποίησης.

Τώρα ας συντάξουμε το μοντέλο ορίζοντας τη συνάρτηση απώλειας, τον βελτιστοποιητή και τις μετρήσεις.

model.compile(optimizer=optimizers.SGD(),
              loss=losses.SparseCategoricalCrossentropy(),
              metrics=metrics.SparseCategoricalAccuracy())

Σύμφωνα με τον παραπάνω κώδικα, χρησιμοποιήσαμε SGD ή Στοχαστική Κάθοδος Κλίσης ως ο βελτιστοποιητής με προεπιλεγμένο ρυθμό εκμάθησης 0,01. ο ΑραιήΚατηγορικήΔιασταυρούμενηΕντροπία χρησιμοποιείται η συνάρτηση απώλειας. Χρησιμοποιούμε τη συνάρτηση απώλειας SparseCategoricalCrossEntropy αντί της συνάρτησης CategoricalCrossEntropy επειδή οι κατηγορίες εξόδων μας είναι σε μορφή ακέραιου αριθμού. Το CategoricalCrossEntropy θα ήταν μια καλή επιλογή όταν οι κατηγορίες κωδικοποιούνται μεμονωμένα. Τέλος, χρησιμοποιούμε SparseCategoricalAccuracy ως η μέτρηση που παρακολουθείται.

Τώρα ας εκπαιδεύσουμε το μοντέλο…

Εκπαίδευση και Αξιολόγηση Μοντέλων

Τώρα ας εκπαιδεύσουμε το μοντέλο μας χρησιμοποιώντας τα επεξεργασμένα δεδομένα εκπαίδευσης για 200 εποχές και ας παρέχουμε το δοκιμαστικό σύνολο δεδομένων για επικύρωση.

history = model.fit(x=X_train,
          y=y_train,
          epochs=200,
          validation_data=(X_test, y_test),
          verbose=0)

Τώρα έχουμε εκπαιδεύσει το μοντέλο μας χρησιμοποιώντας το σύνολο δεδομένων εκπαίδευσης. Πριν την αξιολόγηση ας ελέγξουμε την περίληψη του μοντέλου που έχουμε ορίσει.

# Check model summary
model.summary()

Τώρα ας αξιολογήσουμε το μοντέλο στο σύνολο δεδομένων δοκιμής.

# Perform model evaluation on the test dataset
model.evaluate(X_test, y_test)

Αυτά είναι εξαιρετικά αποτελέσματα… Τώρα ας ορίσουμε μερικές βοηθητικές συναρτήσεις για να σχεδιάσουμε τα διαγράμματα ακρίβειας και απώλειας.

# Plot history
# Function to plot loss
def plot_loss(history):
    plt.plot(history.history['loss'], label="loss")
    plt.plot(history.history['val_loss'], label="val_loss")
    plt.ylim([0,10])
    plt.xlabel('Epoch')
    plt.ylabel('Error (Loss)')
    plt.legend()
    plt.grid(True)
########################################################
# Function to plot accuracy
def plot_accuracy(history):
    plt.plot(history.history['sparse_categorical_accuracy'], label="accuracy")
    plt.plot(history.history['val_sparse_categorical_accuracy'], label="val_accuracy")
    plt.ylim([0, 1])
    plt.xlabel('Epoch')
    plt.ylabel('Accuracy')
    plt.legend()
    plt.grid(True)

Τώρα ας περάσουμε το ιστορικό εκπαίδευσης του μοντέλου και ας ελέγξουμε την απόδοση του μοντέλου στο σύνολο δεδομένων.

plot_loss(history)
plot_accuracy(history)
Οικόπεδο Ακρίβειας|  Ταξινόμηση
Οικόπεδο απώλειας|  Ταξινόμηση

Μπορούμε να δούμε από τα παρακάτω γραφήματα ότι το μοντέλο έχει μάθει με την πάροδο του χρόνου να ταξινομεί διαφορετικά είδη με σχεδόν ακρίβεια.

Αποθήκευση και φόρτωση μοντέλου

Εφόσον διαθέτουμε το εκπαιδευμένο μοντέλο, μπορούμε να το εξαγάγουμε για περαιτέρω περιπτώσεις χρήσης, να το αναπτύξουμε σε εφαρμογές ή να συνεχίσουμε την εκπαίδευση από τα αριστερά. Μπορούμε να το κάνουμε αυτό χρησιμοποιώντας το αποθηκεύσετε μέθοδο και εξαγωγή του μοντέλου σε H5 μορφή.

# Save the model
model.save("trained_classifier_model.h5")

Μπορούμε να φορτώσουμε το αποθηκευμένο σημείο ελέγχου μοντέλου χρησιμοποιώντας το load_model μέθοδος.

# Load the saved model and perform classification
loaded_model = models.load_model('trained_classifier_model.h5')

Τώρα ας προσπαθήσουμε να βρούμε προβλέψεις από το φορτωμένο μοντέλο. Εφόσον το μοντέλο περιέχει το softmax ως συνάρτηση ενεργοποίησης εξόδου, πρέπει να χρησιμοποιήσουμε το np.argmax() μέθοδος επιλογής της κλάσης με τη μεγαλύτερη πιθανότητα.

# The results the model returns are softmax outputs i.e. the probabilities of each class.
results = loaded_model.predict(X_test)
preds = np.argmax(results, axis=1)

Τώρα μπορούμε να αξιολογήσουμε τις προβλέψεις χρησιμοποιώντας μετρικές συναρτήσεις.

# Predictions
print(accuracy_score(y_test, preds))
print(classification_report(y_test, preds))

Φοβερός! Τα αποτελέσματά μας ταιριάζουν με τα προηγούμενα.

Μέχρι τώρα έχουμε εκπαιδεύσει ένα βαθύ νευρωνικό δίκτυο χρησιμοποιώντας το TensorFlow για την εκτέλεση βασικών εργασιών ταξινόμησης χρησιμοποιώντας δεδομένα πίνακα. Χρησιμοποιώντας την παραπάνω μέθοδο, μπορούμε να εκπαιδεύσουμε μοντέλα ταξινομητών σε οποιοδήποτε πίνακα δεδομένων με οποιονδήποτε αριθμό χαρακτηριστικών εισόδου. Αξιοποιώντας τους διαφορετικούς τύπους επιπέδων που διατίθενται στο Keras, μπορούμε να βελτιστοποιήσουμε και να έχουμε περισσότερο έλεγχο στην εκπαίδευση του μοντέλου, βελτιώνοντας έτσι τη μετρική απόδοση. Συνιστάται να δοκιμάσετε να αναπαραγάγετε την παραπάνω διαδικασία σε άλλα σύνολα δεδομένων και να πειραματιστείτε αλλάζοντας διαφορετικές υπερπαραμέτρους όπως το ρυθμό εκμάθησης, τον αριθμό των επιπέδων, τους βελτιστοποιητές κ.λπ. μέχρι να επιτύχουμε την επιθυμητή απόδοση του μοντέλου.