Technologieaustausch

[Maschinelles Lernen] Anwendung von Support-Vektor-Maschinen und Hauptkomponentenanalyse beim maschinellen Lernen

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Support Vector Machine (SVM) ist ein leistungsstarkes und vielseitiges Modell für maschinelles Lernen, das sich für lineare und nichtlineare Klassifizierung, Regression und Ausreißererkennung eignet. In diesem Artikel werden der Support-Vector-Machine-Algorithmus und seine Implementierung in Scikit-Learn vorgestellt und kurz die Hauptkomponentenanalyse und ihre Anwendung in Scikit-Learn untersucht.

1. Übersicht über Support-Vektor-Maschinen

Support Vector Machine (SVM) ist ein weit verbreiteter Algorithmus im Bereich des maschinellen Lernens, der wegen seiner Eigenschaft, mit weniger Rechenressourcen eine hohe Genauigkeit zu liefern, beliebt ist. SVM kann sowohl für Klassifizierungs- als auch für Regressionsaufgaben verwendet werden, wird jedoch am häufigsten bei Klassifizierungsproblemen eingesetzt.

Was ist eine Support-Vektor-Maschine?

Das Ziel von Support-Vektor-Maschinen ist es NNN Dimensionsraum ( NNN ist die Anzahl der Features), um eine Hyperebene zu finden, die die Datenpunkte klar unterscheiden kann. Mit dieser Hyperebene können Datenpunkte verschiedener Kategorien getrennt und so weit wie möglich von der Hyperebene entfernt werden, um die Robustheit der Klassifizierung sicherzustellen.

Fügen Sie hier eine Bildbeschreibung ein

Um eine effektive Trennung von Datenpunkten zu erreichen, können mehrere Hyperebenen vorhanden sein. Unser Ziel ist es, eine Hyperebene mit maximalem Spielraum zu wählen, also dem maximalen Abstand zwischen zwei Klassen. Die Maximierung der Margen trägt zur Verbesserung der Klassifizierungsgenauigkeit bei.

Hyperebenen und Unterstützungsvektoren

Fügen Sie hier eine Bildbeschreibung ein

Eine Hyperebene ist eine Entscheidungsgrenze, die Datenpunkte teilt. Datenpunkte, die sich auf beiden Seiten der Hyperebene befinden, können in verschiedene Kategorien eingeteilt werden. Die Abmessungen der Hyperebene hängen von der Anzahl der Features ab: Wenn die Eingabemerkmale 2 sind, ist die Hyperebene eine gerade Linie; wenn es 3 Features sind, ist die Hyperebene eine zweidimensionale Ebene. Wenn die Anzahl der Features 3 überschreitet, wird es schwierig, die Hyperebene intuitiv zu verstehen.

Fügen Sie hier eine Bildbeschreibung ein

Unterstützungsvektoren beziehen sich auf die Punkte, die der Hyperebene am nächsten liegen und die Position und Richtung der Hyperebene beeinflussen. Mit diesen Unterstützungsvektoren können wir den Spielraum des Klassifikators maximieren. Durch das Entfernen von Unterstützungsvektoren ändert sich die Position der Hyperebene, daher sind sie für den Aufbau einer SVM von entscheidender Bedeutung.

Intuition mit großem Spielraum

Bei der logistischen Regression verwenden wir die Sigmoidfunktion, um den Ausgabewert der linearen Funktion in den Bereich [0,1] zu komprimieren und Beschriftungen basierend auf einem Schwellenwert (0,5) zuzuweisen. In SVM verwenden wir den Ausgabewert einer linearen Funktion, um die Klassifizierung zu bestimmen: Wenn die Ausgabe größer als 1 ist, gehört sie zu einer Klasse; wenn die Ausgabe -1 ist, gehört sie zu einer anderen Klasse. SVM bildet den Grenzbereich [-1,1], indem es den Schwellenwert des Ausgabewerts auf 1 und -1 setzt.

2. Datenvorverarbeitung und Visualisierung

Vorhersage gutartiger und bösartiger Krebsdiagnosen mithilfe von Support-Vektor-Maschinen.

Grundlegende Informationen zum Datensatz

  • Die Anzahl der Funktionen beträgt 30, zum Beispiel:
    • Radius (durchschnittlicher Abstand von der Mitte zu den Umfangspunkten)
    • Textur (Standardabweichung der Grauwerte)
    • Umfang
    • Bereich
    • Glätte (lokale Variation der Radiuslänge)
    • Kompaktheit (Umfang^2 / Fläche – 1,0)
    • Konkavität (der Schweregrad des vertieften Teils der Kontur)
    • Grübchen (die Anzahl der konkaven Teile der Kontur)
    • Symmetrie
    • Fraktale Dimension („Küstenliniennäherung“ – 1)
  • Der Datensatz enthält 569 Proben und die Klassenverteilung umfasst 212 bösartige Proben und 357 gutartige Proben.
  • Zielkategorie:
    • maligne
    • gutartig

Importieren Sie die erforderlichen Bibliotheken

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
sns.set_style('whitegrid')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Datensatz laden

from sklearn.datasets import load_breast_cancer

cancer = load_breast_cancer()

# 创建 DataFrame
col_names = list(cancer.feature_names)
col_names.append('target')
df = pd.DataFrame(np.c_[cancer.data, cancer.target], columns=col_names)
df.head()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Datenübersicht

df.info()print(cancer.target_names)
# ['malignant', 'benign']

# 数据描述:
df.describe()
# 统计摘要:
df.info()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Datenvisualisierung

Streudiagrammmatrix von Merkmalspaaren
sns.pairplot(df, hue='target', vars=[
    'mean radius', 'mean texture', 'mean perimeter', 'mean area',
    'mean smoothness', 'mean compactness', 'mean concavity',
    'mean concave points', 'mean symmetry', 'mean fractal dimension'
])
  • 1
  • 2
  • 3
  • 4
  • 5
Balkendiagramm zur Kategorieverteilung
sns.countplot(x=df['target'], label="Count")
  • 1

Fügen Sie hier eine Bildbeschreibung ein

Streudiagramm der durchschnittlichen Fläche gegenüber der durchschnittlichen Glätte
plt.figure(figsize=(10, 8))
sns.scatterplot(x='mean area', y='mean smoothness', hue='target', data=df)
  • 1
  • 2

Fügen Sie hier eine Bildbeschreibung ein

Heatmap der Korrelationen zwischen Variablen
plt.figure(figsize=(20,10))
sns.heatmap(df.corr(), annot=True)
  • 1
  • 2

Fügen Sie hier eine Bildbeschreibung ein

3. Modellschulung (Problemlösung)

Beim maschinellen Lernen ist das Modelltraining ein entscheidender Schritt bei der Lösungsfindung für Probleme.Im Folgenden stellen wir die Verwendung vorscikit-learn Führen Sie ein Modelltraining durch und demonstrieren Sie die Leistung der Support Vector Machine (SVM) unter verschiedenen Kerneln.

Datenaufbereitung und Vorverarbeitung

Zuerst müssen wir die Daten vorbereiten und vorverarbeiten. Das Folgende ist ein Codebeispiel für die Datenvorverarbeitung:

from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, MinMaxScaler

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

print(f"'X' shape: {X.shape}")
print(f"'y' shape: {y.shape}")
# 'X' shape: (569, 30)
# 'y' shape: (569,)

pipeline = Pipeline([
    ('min_max_scaler', MinMaxScaler()),
    ('std_scaler', StandardScaler())
])

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

Im Code verwenden wir MinMaxScaler UndStandardScaler Skalieren Sie die Daten. Die Daten sind in Trainings- und Testsätze unterteilt, wobei 30 % der Daten zum Testen verwendet werden.

Bewerten Sie die Modellleistung

Um die Leistung des Modells zu bewerten, definieren wir a print_score Funktion, die die Genauigkeit, den Klassifizierungsbericht und die Verwirrungsmatrix von Trainings- und Testergebnissen ausgeben kann:

from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import pandas as pd

def print_score(clf, X_train, y_train, X_test, y_test, train=True):
    if train:
        pred = clf.predict(X_train)
        clf_report = pd.DataFrame(classification_report(y_train, pred, output_dict=True))
        print("Train Result:n================================================")
        print(f"Accuracy Score: {accuracy_score(y_train, pred) * 100:.2f}%")
        print("_______________________________________________")
        print(f"CLASSIFICATION REPORT:n{clf_report}")
        print("_______________________________________________")
        print(f"Confusion Matrix: n {confusion_matrix(y_train, pred)}n")
    else:
        pred = clf.predict(X_test)
        clf_report = pd.DataFrame(classification_report(y_test, pred, output_dict=True))
        print("Test Result:n================================================")        
        print(f"Accuracy Score: {accuracy_score(y_test, pred) * 100:.2f}%")
        print("_______________________________________________")
        print(f"CLASSIFICATION REPORT:n{clf_report}")
        print("_______________________________________________")
        print(f"Confusion Matrix: n {confusion_matrix(y_test, pred)}n")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

Support-Vektor-Maschine (SVM)

Support Vector Machine (SVM) ist ein leistungsstarker Klassifizierungsalgorithmus, dessen Leistung durch Hyperparameter beeinflusst wird. Im Folgenden werden die Hauptparameter von SVM und ihre Auswirkungen auf die Modellleistung vorgestellt:

  • C-Parameter : Steuert den Kompromiss zwischen der korrekten Klassifizierung von Trainingspunkten und glatten Entscheidungsgrenzen.kleiner CCC(lose) verringert die Kosten (Strafen) für Fehlklassifizierungen (weiche Margen), während sie größer sind CCC(streng) macht eine Fehlklassifizierung kostspieliger (harte Marge) und zwingt das Modell, die Eingabedaten strenger zu interpretieren.
  • Gamma-Parameter : Kontrollieren Sie den Einflussbereich eines einzelnen Trainingssatzes.größer γ-Gammaγ Machen Sie den Einflussbereich enger (nähere Datenpunkte haben ein höheres Gewicht) und verkleinern Sie ihn γ-Gammaγ Erweitern Sie die Reichweite (breitere Lösungen).
  • Gradparameter: Polynomkernfunktion ('poly' ), von anderen Kerneln ignoriert. Die optimalen Hyperparameterwerte können durch Rastersuche gefunden werden.

Lineare Kernel-SVM

Die lineare Kernel-SVM eignet sich für die meisten Situationen, insbesondere wenn der Datensatz eine große Anzahl von Funktionen aufweist. Das Folgende ist ein Codebeispiel für die Verwendung einer linearen Kernel-SVM:

from sklearn.svm import LinearSVC

model = LinearSVC(loss='hinge', dual=True)
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Die Trainings- und Testergebnisse sind wie folgt:

Trainingsergebnisse:

Accuracy Score: 86.18%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    1.000000    0.819079  0.861809    0.909539      0.886811
recall       0.630872    1.000000  0.861809    0.815436      0.861809
f1-score     0.773663    0.900542  0.861809    0.837103      0.853042
support    149.000000  249.000000  0.861809  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[ 94  55]
 [  0 249]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Testergebnisse:

Accuracy Score: 89.47%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   1.000000    0.857143  0.894737    0.928571      0.909774
recall      0.714286    1.000000  0.894737    0.857143      0.894737
f1-score    0.833333    0.923077  0.894737    0.878205      0.890013
support    63.000000  108.000000  0.894737  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 45  18]
 [  0 108]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Polynomkernel-SVM

Der polynomische Kernel SVM eignet sich für nichtlineare Daten. Das Folgende ist ein Codebeispiel unter Verwendung eines Polynomkerns zweiter Ordnung:

from sklearn.svm import SVC

model = SVC(kernel='poly', degree=2, gamma='auto', coef0=1, C=5)
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Die Trainings- und Testergebnisse sind wie folgt:

Trainingsergebnisse:

Accuracy Score: 96.98%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    0.985816    0.961089  0.969849    0.973453      0.970346
recall       0.932886    0.991968  0.969849    0.962427      0.969849
f1-score     0.958621    0.976285  0.969849    0.967453      0.969672
support    149.000000  249.000000  0.969849  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[139  10]
 [  2 247]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Testergebnisse:

Accuracy Score: 97.08%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   0.967742    0.972477   0.97076    0.970109      0.970733
recall      0.952381    0.981481   0.97076    0.966931      0.970760
f1-score    0.960000    0.976959   0.97076    0.968479      0.970711
support    63.000000  108.000000   0.97076  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 60   3]
 [  2 106]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Kernel-SVM mit radialer Basisfunktion (RBF).

Radiale Basisfunktionskerne (RBF) eignen sich für die Verarbeitung nichtlinearer Daten. Das Folgende ist ein Codebeispiel unter Verwendung des RBF-Kerns:

model = SVC(kernel='rbf', gamma=0.5, C=0.1)
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5

Die Trainings- und Testergebnisse sind wie folgt:

Trainingsergebnisse:

Accuracy Score: 62.56%
_______________________________________________
CLASSIFICATION REPORT:
             0.0         1.0  accuracy   macro avg  weighted avg
precision    0.0    0.625628  0.625628    0.312814      0.392314
recall       0.0    1.000000  0.625628    0.500000      0.625628
f1-score     0.0    0.769231  0.625628    0.384615      0.615385
support    149.0  249.0    0.625628  398.0        398.0
_______________________________________________
Confusion Matrix: 
 [[  0 149]
 [  0 249]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Testergebnisse:

Accuracy Score: 64.97%
_______________________________________________
CLASSIFICATION REPORT:
             0.0         1.0  accuracy   macro avg  weighted avg
precision    0.0    0.655172  0.649661    0.327586      0.409551
recall       0.0    1.000000  0.649661    0.500000      0.649661
f1-score     0.0    0.792453  0.649661    0.396226      0.628252
support    63.0  108.0    0.649661  171.0        171.0
_______________________________________________
Confusion Matrix: 
 [[  0  63]
 [  0 108]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Zusammenfassen

Durch den oben genannten Modellschulungs- und Bewertungsprozess können wir die Leistungsunterschiede verschiedener SVM-Kernel beobachten. Die lineare Kernel-SVM bietet eine gute Leistung in Bezug auf Genauigkeit und Trainingszeit und eignet sich für Situationen mit höheren Datendimensionen. Polynom-Kernel-SVM und RBF-Kernel-SVM bieten eine bessere Leistung bei nichtlinearen Daten, können jedoch unter bestimmten Parametereinstellungen zu einer Überanpassung führen. Die Auswahl geeigneter Kernel und Hyperparameter ist entscheidend für die Verbesserung der Modellleistung.

4. SVM-Datenvorbereitung

digitale Eingabe : SVM geht davon aus, dass die Eingabedaten numerisch sind. Wenn es sich bei den Eingabedaten um kategoriale Variablen handelt, müssen Sie diese möglicherweise in binäre Dummy-Variablen (eine Variable pro Kategorie) konvertieren.

binäre Klassifizierung :Basic SVM eignet sich für binäre Klassifizierungsprobleme. Obwohl SVM hauptsächlich für die binäre Klassifizierung verwendet wird, gibt es auch erweiterte Versionen für die Regression und die Klassifizierung mehrerer Klassen.

X_train = pipeline.fit_transform(X_train)
X_test = pipeline.transform(X_test)
  • 1
  • 2

Modellschulung und -bewertung

Das Folgende zeigt die Trainings- und Testergebnisse verschiedener SVM-Kernel:

Lineare Kernel-SVM

print("=======================Linear Kernel SVM==========================")
model = SVC(kernel='linear')
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Trainingsergebnisse:

Accuracy Score: 98.99%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    1.000000    0.984190   0.98995    0.992095      0.990109
recall       0.973154    1.000000   0.98995    0.986577      0.989950
f1-score     0.986395    0.992032   0.98995    0.989213      0.989921
support    149.000000  249.000000   0.98995  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[145   4]
 [  0 249]]

测试结果

Accuracy Score: 97.66%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   0.968254    0.981481  0.976608    0.974868      0.976608
recall      0.968254    0.981481  0.976608    0.974868      0.976608
f1-score    0.968254    0.981481  0.976608    0.974868      0.976608
support    63.000000  108.000000  0.976608  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 61   2]
 [  2 106]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
Polynomkernel-SVM
print("=======================Polynomial Kernel SVM==========================")
from sklearn.svm import SVC

model = SVC(kernel='poly', degree=2, gamma='auto')
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Trainingsergebnisse:

Accuracy Score: 85.18%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    0.978723    0.812500  0.851759    0.895612      0.874729
recall       0.617450    0.991968  0.851759    0.804709      0.851759
f1-score     0.757202    0.893309  0.851759    0.825255      0.842354
support    149.000000  249.000000  0.851759  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[ 92  57]
 [  2 247]]

测试结果:

Accuracy Score: 82.46%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   0.923077    0.795455  0.824561    0.859266      0.842473
recall      0.571429    0.972222  0.824561    0.771825      0.824561
f1-score    0.705882    0.875000  0.824561    0.790441      0.812693
support    63.000000  108.000000  0.824561  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 36  27]
 [  3 105]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
Radialer Basisfunktionskernel SVM
print("=======================Radial Kernel SVM==========================")
from sklearn.svm import SVC

model = SVC(kernel='rbf', gamma=1)
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Trainingsergebnisse:

Accuracy Score: 100.00%
_______________________________________________
CLASSIFICATION REPORT:
             0.0    1.0  accuracy  macro avg  weighted avg
precision    1.0    1.0       1.0        1.0           1.0
recall       1.0    1.0       1.0        1.0           1.0
f1-score     1.0    1.0       1.0        1.0           1.0
support    149.0  249.0       1.0      398.0         398.0
_______________________________________________
Confusion Matrix: 
 [[149   0]
 [  0 249]]

测试结果:

Accuracy Score: 63.74%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   1.000000    0.635294  0.637427    0.817647      0.769659
recall      0.015873    1.000000  0.637427    0.507937      0.637427
f1-score    0.031250    0.776978  0.637427    0.404114      0.502236
support    63.000000  108.000000  0.637427  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[  1  62]
 [  0 108]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Unterstützt die Optimierung von Vektormaschinen-Hyperparametern

from sklearn.model_selection import GridSearchCV

param_grid = {'C': [0.01, 0.1, 0.5, 1, 10, 100], 
              'gamma': [1, 0.75, 0.5, 0.25, 0.1, 0.01, 0.001], 
              'kernel': ['rbf', 'poly', 'linear']} 

grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=1, cv=5)
grid.fit(X_train, y_train)

best_params = grid.best_params_
print(f"Best params: {best_params}")

svm_clf = SVC(**best_params)
svm_clf.fit(X_train, y_train)
print_score(svm_clf, X_train, y_train, X_test, y_test, train=True)
print_score(svm_clf, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

Trainingsergebnisse:

Accuracy Score: 98.24%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    0.986301    0.980159  0.982412    0.983230      0.982458
recall       0.966443    0.991968  0.982412    0.979205      0.982412
f1-score     0.976271    0.986028  0.982412    0.981150      0.982375
support    149.000000  249.000000  0.982412  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[144   5]
 [  2 247]]

测试结果:

Accuracy Score: 98.25%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   0.983871    0.981651  0.982456    0.982761      0.982469
recall      0.968254    0.990741  0.982456    0.979497      0.982456
f1-score    0.976000    0.986175  0.982456    0.981088      0.982426
support    63.000000  108.000000  0.982456  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 61   2]
 [  1 107]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

5. Hauptkomponentenanalyse

Einführung in PCA

Die Hauptkomponentenanalyse (PCA) ist eine Technik, die eine lineare Dimensionsreduktion durch die Projektion von Daten in einen niedrigerdimensionalen Raum erreicht. Die spezifischen Schritte sind wie folgt:

  • Verwenden Sie die Singularwertzerlegung: Projizieren Sie Daten durch Singulärwertzerlegung in einen niedrigdimensionalen Raum.
  • unbeaufsichtigtes Lernen: PCA erfordert keine gekennzeichneten Daten zur Dimensionsreduzierung.
  • Feature-Transformation: Versuchen Sie herauszufinden, welche Merkmale die größte Varianz in den Daten erklären.

PCA-Visualisierung

Da es schwierig ist, hochdimensionale Daten direkt zu visualisieren, können wir PCA verwenden, um die ersten beiden Hauptkomponenten zu finden und die Daten im zweidimensionalen Raum zu visualisieren. Um dies zu erreichen, müssen die Daten zunächst normalisiert werden, sodass die Varianz jedes Merkmals eine Einheitsvarianz ist.

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 数据标准化
scaler = StandardScaler()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# PCA 降维
pca = PCA(n_components=2)
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)

# 可视化前两个主成分
plt.figure(figsize=(8,6))
plt.scatter(X_train[:,0], X_train[:,1], c=y_train, cmap='plasma')
plt.xlabel('First Principal Component')
plt.ylabel('Second Principal Component')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

Fügen Sie hier eine Bildbeschreibung ein

Durch die ersten beiden Hauptkomponenten können wir verschiedene Kategorien von Datenpunkten im zweidimensionalen Raum leicht trennen.

Erklären Sie Komponenten

Obwohl die Reduzierung der Dimensionalität wirkungsvoll ist, ist die Bedeutung der Komponenten schwer direkt zu verstehen. Jede Komponente entspricht einer Kombination ursprünglicher Merkmale, die durch Anpassen eines PCA-Objekts erhalten werden können.

Zu den komponentenbezogenen Eigenschaften gehören:

  • Zutatenbewertung: Der transformierte Variablenwert.
  • Lastgewicht): Kombinationsgewicht der Features.
  • Datenkomprimierung und Informationsbewahrung: Die Datenkomprimierung wird durch PCA erreicht, während wichtige Informationen erhalten bleiben.
  • Rauschfilterung: Rauschen kann während des Dimensionsreduktionsprozesses herausgefiltert werden.
  • Merkmalsextraktion und Engineering: Wird zum Extrahieren und Konstruieren neuer Features verwendet.

Parameteranpassung des Support Vector Machine (SVM)-Modells

Wenn wir Support Vector Machines (SVM) für das Modelltraining verwenden, müssen wir die Hyperparameter anpassen, um das beste Modell zu erhalten. Im Folgenden finden Sie Beispielcode zum Anpassen von SVM-Parametern mithilfe der Rastersuche (GridSearchCV):

from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {'C': [0.01, 0.1, 0.5, 1, 10, 100], 
              'gamma': [1, 0.75, 0.5, 0.25, 0.1, 0.01, 0.001], 
              'kernel': ['rbf', 'poly', 'linear']} 

# 网格搜索
grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=1, cv=5)
grid.fit(X_train, y_train)
best_params = grid.best_params_
print(f"Best params: {best_params}")

# 使用最佳参数训练模型
svm_clf = SVC(**best_params)
svm_clf.fit(X_train, y_train)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

Trainingsergebnisse:

Accuracy Score: 96.48%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    0.978723    0.957198  0.964824    0.967961      0.965257
recall       0.926174    0.987952  0.964824    0.957063      0.964824
f1-score     0.951724    0.972332  0.964824    0.962028      0.964617
support    149.000000  249.000000  0.964824  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[138  11]
 [  3 246]]

测试结果:

Accuracy Score: 96.49%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   0.967213    0.963636  0.964912    0.965425      0.964954
recall      0.936508    0.981481  0.964912    0.958995      0.964912
f1-score    0.951613    0.972477  0.964912    0.962045      0.964790
support    63.000000  108.000000  0.964912  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 59   4]
 [  2 106]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

6. Zusammenfassung

In diesem Artikel haben wir Folgendes gelernt:

  • Support-Vektor-Maschine (SVM): Verstehen Sie die Grundkonzepte von SVM und seine Implementierung in Python.
  • SVM-Kernelfunktion: Einschließlich linearer, radialer Basisfunktionen (RBF) und polynomialer Kernelfunktionen.
  • Datenaufbereitung: So bereiten Sie Daten für den SVM-Algorithmus vor.
  • Hyperparameter-Tuning: Optimieren von SVM-Hyperparametern durch Rastersuche.
  • Hauptkomponentenanalyse (PCA): So verwenden Sie PCA, um die Datenkomplexität zu reduzieren und sie in scikit-learn wiederzuverwenden.

beziehen auf:Support Vector Machine & PCA-Tutorial für Anfänger
Empfehlen Sie meine verwandten Kolumnen:


Fügen Sie hier eine Bildbeschreibung ein