Εκμάθηση μηχανικής εκμάθησης SVM - Τι είναι ο αλγόριθμος διανυσματικών μηχανών υποστήριξης, που εξηγείται με παραδείγματα κώδικα

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

Τα καλά νέα? Υπάρχει ένας αλγόριθμος στη μηχανική εκμάθηση που θα χειρίζεται σχεδόν όλα τα δεδομένα που μπορείτε να ρίξετε σε αυτό. Αλλά θα φτάσουμε εκεί σε ένα λεπτό.

Εποπτευόμενη εναντίον μη εποπτευόμενης μάθησης

Δύο από τις πιο συχνά χρησιμοποιούμενες στρατηγικές στη μηχανική μάθηση περιλαμβάνουν την εποπτευόμενη μάθηση και τη μη εποπτευόμενη μάθηση.

Τι είναι η εποπτευόμενη μάθηση;

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

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

Τι είναι η μη επιτηρούμενη μάθηση;

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

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

Τι είναι λοιπόν ένας αλγόριθμος;

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

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

Γι 'αυτό υπάρχουν τόσοι πολλοί διαφορετικοί αλγόριθμοι για τη διαχείριση διαφορετικών ειδών δεδομένων. Ένας συγκεκριμένος αλγόριθμος είναι το μηχάνημα φορέα υποστήριξης (SVM) και αυτό θα καλύψει λεπτομερώς αυτό το άρθρο.

Τι είναι το SVM;

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

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

Υπάρχουν συγκεκριμένοι τύποι SVM που μπορείτε να χρησιμοποιήσετε για συγκεκριμένα προβλήματα μηχανικής μάθησης, όπως η παλινδρόμηση φορέα υποστήριξης (SVR), η οποία αποτελεί επέκταση της ταξινόμησης φορέα υποστήριξης (SVC).

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

Τα SVM διαφέρουν από άλλους αλγορίθμους ταξινόμησης λόγω του τρόπου με τον οποίο επιλέγουν το όριο απόφασης που μεγιστοποιεί την απόσταση από τα πλησιέστερα σημεία δεδομένων όλων των τάξεων. Το όριο αποφάσεων που δημιουργείται από τα SVM ονομάζεται ταξινομητής μέγιστου περιθωρίου ή υπερπερίγραμμα μέγιστου περιθωρίου.

Πώς λειτουργεί ένα SVM

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

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

Ένα 2-D παράδειγμα βοηθά να κατανοήσουμε όλα τα λόγια της μηχανικής μάθησης. Βασικά έχετε ορισμένα σημεία δεδομένων σε ένα πλέγμα. Προσπαθείτε να διαχωρίσετε αυτά τα σημεία δεδομένων από την κατηγορία που πρέπει να εντάξουν, αλλά δεν θέλετε να έχετε δεδομένα σε λάθος κατηγορία. Αυτό σημαίνει ότι προσπαθείτε να βρείτε τη γραμμή μεταξύ των δύο πλησιέστερων σημείων που διατηρεί τα άλλα σημεία δεδομένων ξεχωριστά.

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

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

Τύποι SVM

Υπάρχουν δύο διαφορετικοί τύποι SVM, ο καθένας χρησιμοποιείται για διαφορετικά πράγματα:

  • Simple SVM: Συνήθως χρησιμοποιείται για προβλήματα γραμμικής παλινδρόμησης και ταξινόμησης.
  • Kernel SVM: Έχει μεγαλύτερη ευελιξία για μη γραμμικά δεδομένα, επειδή μπορείτε να προσθέσετε περισσότερες δυνατότητες για να ταιριάζει σε ένα υπερπλάνο αντί για ένα δισδιάστατο χώρο

Γιατί τα SVM χρησιμοποιούνται στη μηχανική μάθηση

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

Ένας άλλος λόγος για τον οποίο χρησιμοποιούμε SVM είναι επειδή μπορούν να βρουν πολύπλοκες σχέσεις μεταξύ των δεδομένων σας χωρίς να χρειάζεται να κάνετε πολλές αλλαγές μόνοι σας. Είναι μια εξαιρετική επιλογή όταν εργάζεστε με μικρότερα σύνολα δεδομένων που έχουν δεκάδες έως εκατοντάδες χιλιάδες χαρακτηριστικά. Συνήθως βρίσκουν πιο ακριβή αποτελέσματα σε σύγκριση με άλλους αλγόριθμους λόγω της ικανότητάς τους να χειρίζονται μικρά, πολύπλοκα σύνολα δεδομένων.

Εδώ είναι μερικά από τα πλεονεκτήματα και τα μειονεκτήματα για τη χρήση SVM.

Πλεονεκτήματα

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

Μειονεκτήματα

  • Εάν ο αριθμός των δυνατοτήτων είναι πολύ μεγαλύτερος από τον αριθμό των σημείων δεδομένων, η αποφυγή υπερβολικής προσαρμογής κατά την επιλογή λειτουργιών πυρήνα και ο όρος κανονικοποίησης είναι ζωτικής σημασίας.
  • Τα SVM δεν παρέχουν άμεσα εκτιμήσεις πιθανότητας. Αυτά υπολογίζονται χρησιμοποιώντας μια ακριβή πενταπλή διασταυρούμενη επικύρωση.
  • Λειτουργεί καλύτερα σε μικρά σετ δειγμάτων λόγω του υψηλού χρόνου προπόνησής του.

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

Λειτουργίες πυρήνα

Γραμμικός

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

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

Εδώ είναι η συνάρτηση που καθορίζει τον γραμμικό πυρήνα:

f(X) = w^T * X + b

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

Πολυώνυμος

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

Εδώ είναι η συνάρτηση για έναν πολυωνυμικό πυρήνα:

f(X1, X2) = (a + X1^T * X2) ^ b

Αυτή είναι μια από τις πιο απλές εξισώσεις πυρήνα πολυωνύμου που μπορείτε να χρησιμοποιήσετε. Το f (X1, X2) αντιπροσωπεύει το πολυώνυμο όριο αποφάσεων που θα διαχωρίσει τα δεδομένα σας. Τα X1 και X2 αντιπροσωπεύουν τα δεδομένα σας.

Λειτουργία ακτινικής βάσης Gaussian (RBF)

Ένας από τους πιο ισχυρούς και συνήθως χρησιμοποιούμενους πυρήνες στα SVMs. Συνήθως η επιλογή για μη γραμμικά δεδομένα.

Εδώ είναι η εξίσωση για έναν πυρήνα RBF:

f(X1, X2) = exp(-gamma * ||X1 - X2||^2)

Σε αυτήν την εξίσωση, το gamma καθορίζει πόσο έχει ένα μόνο σημείο προπόνησης στα άλλα σημεία δεδομένων γύρω από αυτό. || X1 - X2 || είναι το προϊόν κουκκίδων μεταξύ των χαρακτηριστικών σας.

Σιγμοειδές

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

Εδώ είναι η συνάρτηση για έναν σιγμοειδή πυρήνα:

f(X, y) = tanh(alpha * X^T * y + C)

In this function, alpha is a weight vector and C is an offset value to account for some mis-classification of data that can happen.

Others

There are plenty of other kernels you can use for your project. This might be a decision to make when you need to meet certain error constraints, you want to try and speed up the training time, or you want to super tune parameters.

Some other kernels include: ANOVA radial basis, hyperbolic tangent, and Laplace RBF.

Now that you know a bit about how the kernels work under the hood, let's go through a couple of examples.

Examples with datasets

To show you how SVMs work in practice, we'll go through the process of training a model with it using the Python Scikit-learn library. This is commonly used on all kinds of machine learning problems and works well with other Python libraries.

Here are the steps regularly found in machine learning projects:

  • Import the dataset
  • Explore the data to figure out what they look like
  • Pre-process the data
  • Split the data into attributes and labels
  • Divide the data into training and testing sets
  • Train the SVM algorithm
  • Make some predictions
  • Evaluate the results of the algorithm

Some of these steps can be combined depending on how you handle your data. We'll do an example with a linear SVM and a non-linear SVM. You can find the code for these examples here.

Linear SVM Example

We'll start by importing a few libraries that will make it easy to work with most machine learning projects.

import matplotlib.pyplot as plt import numpy as np from sklearn import svm

For a simple linear example, we'll just make some dummy data and that will act in the place of importing a dataset.

# linear data X = np.array([1, 5, 1.5, 8, 1, 9, 7, 8.7, 2.3, 5.5, 7.7, 6.1]) y = np.array([2, 8, 1.8, 8, 0.6, 11, 10, 9.4, 4, 3, 8.8, 7.5])

The reason we're working with numpy arrays is to make the matrix operations faster because they use less memory than Python lists. You could also take advantage of typing the contents of the arrays. Now let's take a look at what the data look like in a plot:

# show unclassified data plt.scatter(X, y) plt.show()

Once you see what the data look like, you can take a better guess at which algorithm will work best for you. Keep in mind that this is a really simple dataset, so most of the time you'll need to do some work on your data to get it to a usable state.

We'll do a bit of pre-processing on the already structured code. This will put the raw data into a format that we can use to train the SVM model.

# shaping data for training the model training_X = np.vstack((X, y)).T training_y = [0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1]

Now we can create the SVM model using a linear kernel.

# define the model clf = svm.SVC(kernel='linear', C=1.0)

That one line of code just created an entire machine learning model. Now we just have to train it with the data we pre-processed.

# train the model clf.fit(training_X, training_y)

That's how you can build a model for any machine learning project. The dataset we have might be small, but if you encounter a real-world dataset that can be classified with a linear boundary this model still works.

With your model trained, you can make predictions on how a new data point will be classified and you can make a plot of the decision boundary. Let's plot the decision boundary.

# get the weight values for the linear equation from the trained SVM model w = clf.coef_[0] # get the y-offset for the linear equation a = -w[0] / w[1] # make the x-axis space for the data points XX = np.linspace(0, 13) # get the y-values to plot the decision boundary yy = a * XX - clf.intercept_[0] / w[1] # plot the decision boundary plt.plot(XX, yy, 'k-') # show the plot visually plt.scatter(training_X[:, 0], training_X[:, 1], c=training_y) plt.legend() plt.show()

Non-Linear SVM Example

For this example, we'll use a slightly more complicated dataset to show one of the areas SVMs shine in. Let's import some packages.

import matplotlib.pyplot as plt import numpy as np from sklearn import datasets from sklearn import svm

This set of imports is similar to those in the linear example, except it imports one more thing. Now we can use a dataset directly from the Scikit-learn library.

# non-linear data circle_X, circle_y = datasets.make_circles(n_samples=300, noise=0.05)

The next step is to take a look at what this raw data looks like with a plot.

# show raw non-linear data plt.scatter(circle_X[:, 0], circle_X[:, 1], c=circle_y, marker=".") plt.show()

Now that you can see how the data are separated, we can choose a non-linear SVM to start with. This dataset doesn't need any pre-processing before we use it to train the model, so we can skip that step. Here's how the SVM model will look for this:

# make non-linear algorithm for model nonlinear_clf = svm.SVC(kernel='rbf', C=1.0)

In this case, we'll go with an RBF (Gaussian Radial Basis Function) kernel to classify this data. You could also try the polynomial kernel to see the difference between the results you get. Now it's time to train the model.

# training non-linear model nonlinear_clf.fit(circle_X, circle_y)

You can start labeling new data in the correct category based on this model. To see what the decision boundary looks like, we'll have to make a custom function to plot it.

# Plot the decision boundary for a non-linear SVM problem def plot_decision_boundary(model, ax=None): if ax is None: ax = plt.gca() xlim = ax.get_xlim() ylim = ax.get_ylim() # create grid to evaluate model x = np.linspace(xlim[0], xlim[1], 30) y = np.linspace(ylim[0], ylim[1], 30) Y, X = np.meshgrid(y, x) # shape data xy = np.vstack([X.ravel(), Y.ravel()]).T # get the decision boundary based on the model P = model.decision_function(xy).reshape(X.shape) # plot decision boundary ax.contour(X, Y, P, levels=[0], alpha=0.5, linestyles=['-'])

You have everything you need to plot the decision boundary for this non-linear data. We can do that with a few lines of code that use the Matlibplot library, just like the other plots.

# plot data and decision boundary plt.scatter(circle_X[:, 0], circle_X[:, 1], c=circle_y, s=50) plot_decision_boundary(nonlinear_clf) plt.scatter(nonlinear_clf.support_vectors_[:, 0], nonlinear_clf.support_vectors_[:, 1], s=50, lw=1, facecolors="none") plt.show()

When you have your data and you know the problem you're trying to solve, it really can be this simple.

You can change your training model completely, you can choose different algorithms and features to work with, and you can fine tune your results based on multiple parameters. There are libraries and packages for all of this now so there's not a lot of math you have to deal with.

Tips for real world problems

Real world datasets have some common issues because of how large they can be, the varying data types they hold, and how much computing power they can need to train a model.

There are a few things you should watch out for with SVMs in particular:

  • Make sure that your data are in numeric form instead of categorical form. SVMs expect numbers instead of other kinds of labels.
  • Avoid copying data as much as possible. Some Python libraries will make duplicates of your data if they aren't in a specific format. Copying data will also slow down your training time and skew the way your model assigns the weights to a specific feature.
  • Watch your kernel cache size because it uses your RAM. If you have a really large dataset, this could cause problems for your system.
  • Scale your data because SVM algorithms aren't scale invariant. That means you can convert all of your data to be within the ranges of [0, 1] or [-1, 1].

Other thoughts

You might wonder why I didn't go into the deep details of the math here. It's mainly because I don't want to scare people away from learning more about machine learning.

It's fun to learn about those long, complicated math equations and their derivations, but it's rare you'll be writing your own algorithms and writing proofs on real projects.

It's like using most of the other stuff you do every day, like your phone or your computer. You can do everything you need to do without knowing the how the processors are built.

Machine learning is like any other software engineering application. There are a ton of packages that make it easier for you to get the results you need without a deep background in statistics.

Once you get some practice with the different packages and libraries available, you'll find out that the hardest part about machine learning is getting and labeling your data.

Δουλεύω σε μια νευροεπιστήμη, μια μηχανική μάθηση, ένα διαδικτυακό πράγμα! Θα πρέπει να με ακολουθήσετε στο Twitter για να μάθετε περισσότερα σχετικά με αυτό και άλλα θέματα τεχνολογίας.