Обмен технологиями

[Машинное обучение] Применение машин опорных векторов и анализа главных компонентов в машинном обучении

2024-07-12

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

Каталог статей

Машина опорных векторов (SVM) — это мощная и универсальная модель машинного обучения, подходящая для линейной и нелинейной классификации, регрессии и обнаружения выбросов. В этой статье будет представлен алгоритм машины опорных векторов и его реализация в scikit-learn, а также кратко рассмотрен анализ главных компонентов и его применение в scikit-learn.

1. Обзор машин опорных векторов

Машина опорных векторов (SVM) — это широко используемый алгоритм в области машинного обучения, известный своей способностью обеспечивать значительную точность при меньших вычислительных ресурсах. SVM можно использовать как для задач классификации, так и для задач регрессии, но наиболее широко он используется в задачах классификации.

Что такое машина опорных векторов?

Целью машин опорных векторов является ННН многомерное пространство ( ННН — количество признаков), чтобы найти гиперплоскость, которая позволяет четко различать точки данных. Эта гиперплоскость позволяет разделить точки данных разных категорий и расположить их как можно дальше от гиперплоскости, чтобы обеспечить надежность классификации.

Вставьте сюда описание изображения

Чтобы добиться эффективного разделения точек данных, может существовать несколько гиперплоскостей. Наша цель — выбрать гиперплоскость с максимальным запасом, то есть максимальным расстоянием между двумя классами. Максимизация полей помогает повысить точность классификации.

Гиперплоскости и опорные векторы

Вставьте сюда описание изображения

Гиперплоскость — это граница решения, которая разделяет точки данных. Точки данных, расположенные по обе стороны гиперплоскости, можно разделить на разные категории. Размеры гиперплоскости зависят от количества объектов: если входных объектов 2, гиперплоскость представляет собой прямую линию, если объектов 3, гиперплоскость является двумерной плоскостью; Когда количество признаков превышает 3, гиперплоскость становится трудно понять интуитивно.

Вставьте сюда описание изображения

Опорные векторы относятся к точкам, ближайшим к гиперплоскости, которые влияют на положение и направление гиперплоскости. С помощью этих опорных векторов мы можем максимизировать предел классификатора. Удаление опорных векторов меняет положение гиперплоскости, поэтому они имеют решающее значение для построения SVM.

Интуиция большой прибыли

В логистической регрессии мы используем сигмовидную функцию для сжатия выходного значения линейной функции в диапазон [0,1] и присваиваем метки на основе порога (0,5). В SVM мы используем выходное значение линейной функции для определения классификации: если выходное значение больше 1, оно принадлежит одному классу, если выходное значение равно -1, оно принадлежит другому классу; SVM формирует предельный диапазон [-1,1], устанавливая порог выходного значения на 1 и -1.

2. Предварительная обработка и визуализация данных.

Прогнозирование диагнозов доброкачественного и злокачественного рака с использованием машин опорных векторов.

Основная информация о наборе данных

  • Количество функций равно 30, например:
    • Радиус (среднее расстояние от центра до точек периметра)
    • Текстура (стандартное отклонение значений оттенков серого)
    • периметр
    • область
    • Гладкость (локальное изменение длины радиуса)
    • Компактность (Периметр^2 / Площадь - 1,0)
    • Вогнутость (выраженность вдавленного участка контура)
    • Ямочки (количество вогнутых частей контура)
    • симметрия
    • Фрактальное измерение («Приближение береговой линии» - 1)
  • Набор данных содержит 569 образцов, а распределение по классам составляет 212 злокачественных образцов и 357 доброкачественных образцов.
  • Целевая категория:
    • злокачественный
    • доброкачественный

Импортируйте необходимые библиотеки

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

Загрузить набор данных

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

Обзор данных

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

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

визуализация данных

Матрица рассеяния пар признаков
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
Гистограмма распределения категорий
sns.countplot(x=df['target'], label="Count")
  • 1

Вставьте сюда описание изображения

Диаграмма рассеяния средней площади в зависимости от средней гладкости
plt.figure(figsize=(10, 8))
sns.scatterplot(x='mean area', y='mean smoothness', hue='target', data=df)
  • 1
  • 2

Вставьте сюда описание изображения

Тепловая карта корреляций между переменными
plt.figure(figsize=(20,10))
sns.heatmap(df.corr(), annot=True)
  • 1
  • 2

Вставьте сюда описание изображения

3. Модельное обучение (решение проблем)

В машинном обучении обучение модели является важным шагом в поиске решений проблем.Ниже мы покажем, как использоватьscikit-learn Проведите обучение модели и продемонстрируйте производительность машины опорных векторов (SVM) под различными ядрами.

Подготовка и предварительная обработка данных

Во-первых, нам нужно подготовить и предварительно обработать данные. Ниже приведен пример кода для предварительной обработки данных:

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

В коде мы используем MinMaxScaler иStandardScaler Масштабируйте данные. Данные разделены на обучающие и тестовые наборы, при этом 30% данных используется для тестирования.

Оцените производительность модели

Чтобы оценить производительность модели, мы определяем print_score функция, которая может выводить точность, отчет о классификации и матрицу путаницы результатов обучения и испытаний:

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

Машина опорных векторов (SVM)

Машина опорных векторов (SVM) — это мощный алгоритм классификации, на производительность которого влияют гиперпараметры. Ниже будут представлены основные параметры SVM и их влияние на производительность модели:

  • C-параметры : контролирует компромисс между правильной классификацией тренировочных точек и плавными границами принятия решений.меньше ССС(свободный) снижает затраты за неправильную классификацию (штрафы) (мягкая маржа), но увеличивает ССС(строгий) делает неправильную классификацию более дорогостоящей (жесткая маржа), вынуждая модель более строго интерпретировать входные данные.
  • гамма-параметр : контролировать масштаб влияния одного обучающего набора.больше γ гаммаγ Сделайте сферу влияния ближе (более близкие точки данных имеют больший вес), меньше γ гаммаγ Расширьте охват (более широкие решения).
  • параметр степени: полиномиальная функция ядра ('poly' ), игнорируется другими ядрами. Оптимальные значения гиперпараметров можно найти с помощью поиска по сетке.

Линейное ядро ​​SVM

SVM с линейным ядром подходит для большинства ситуаций, особенно когда набор данных имеет большое количество функций. Ниже приведен пример кода с использованием 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

Результаты обучения и тестирования следующие:

Результаты обучения:

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

Результаты теста:

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

Полиномиальное ядро ​​SVM

Полиномиальное ядро ​​SVM подходит для нелинейных данных. Ниже приведен пример кода с использованием полиномиального ядра второго порядка:

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

Результаты обучения и тестирования следующие:

Результаты обучения:

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

Результаты теста:

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

Ядро радиальной базисной функции (RBF) SVM

Ядра радиальной базисной функции (RBF) подходят для обработки нелинейных данных. Ниже приведен пример кода с использованием ядра RBF:

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

Результаты обучения и тестирования следующие:

Результаты обучения:

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

Результаты теста:

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

Подведем итог

Посредством описанного выше процесса обучения и оценки модели мы можем наблюдать различия в производительности различных ядер SVM. SVM с линейным ядром хорошо работает с точки зрения точности и времени обучения и подходит для ситуаций с более высокими размерностями данных. SVM с полиномиальным ядром и SVM с ядром RBF имеют лучшую производительность при работе с нелинейными данными, но могут привести к переобучению при определенных настройках параметров. Выбор подходящих ядер и гиперпараметров имеет решающее значение для повышения производительности модели.

4. Подготовка данных SVM

цифровой вход : SVM предполагает, что входные данные являются числовыми. Если входные данные представляют собой категориальные переменные, вам может потребоваться преобразовать их в двоичные фиктивные переменные (одна переменная на категорию).

бинарная классификация :Basic SVM подходит для задач двоичной классификации. Хотя SVM в основном используется для бинарной классификации, существуют также расширенные версии для регрессии и многоклассовой классификации.

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

Обучение и оценка моделей

Ниже показаны результаты обучения и тестирования различных ядер SVM:

Линейное ядро ​​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

Результаты обучения:

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
Полиномиальное ядро ​​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

Результаты обучения:

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
Радиальная базисная функция Ядро 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

Результаты обучения:

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

Настройка гиперпараметра опорной векторной машины

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

Результаты обучения:

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. Анализ главных компонентов

Введение в PCA

Анализ главных компонентов (PCA) — это метод, позволяющий добиться уменьшения линейной размерности путем проецирования данных в пространство меньшей размерности. Конкретные шаги заключаются в следующем:

  • Используйте разложение по сингулярным значениям: Проецирование данных в низкоразмерное пространство посредством разложения по сингулярным значениям.
  • обучение без присмотра:PCA не требует размеченных данных для уменьшения размерности.
  • Преобразование функций: попытайтесь определить, какие особенности объясняют наибольшую дисперсию данных.

PCA-визуализация

Поскольку многомерные данные трудно визуализировать напрямую, мы можем использовать PCA, чтобы найти первые два основных компонента и визуализировать данные в двумерном пространстве. Для этого данные необходимо сначала нормализовать, чтобы дисперсия каждого признака была единичной дисперсией.

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

Вставьте сюда описание изображения

С помощью первых двух основных компонентов мы можем легко разделить различные категории точек данных в двумерном пространстве.

Объяснение компонентов

Хотя уменьшение размерности является мощным инструментом, значение компонентов трудно понять напрямую. Каждый компонент соответствует комбинации исходных функций, которые можно получить путем подгонки объекта PCA.

Свойства, связанные с компонентом, включают в себя:

  • оценка ингредиента: преобразованное значение переменной.
  • Нагрузка (вес): Комбинация функций.
  • Сжатие данных и сохранение информации: Сжатие данных с помощью PCA с сохранением ключевой информации.
  • Фильтрация шума: шум можно отфильтровать во время процесса уменьшения размерности.
  • Извлечение функций и инжиниринг: используется для извлечения и создания новых функций.

Настройка параметров модели машины опорных векторов (SVM)

При использовании машин опорных векторов (SVM) для обучения модели нам необходимо настроить гиперпараметры, чтобы получить лучшую модель. Ниже приведен пример кода для настройки параметров SVM с использованием поиска по сетке (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

Результаты обучения:

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. Резюме

В этой статье мы узнали следующее:

  • Машина опорных векторов (SVM): Понимание основных концепций SVM и ее реализации на Python.
  • Функция ядра SVM: Включая линейные, радиальные базисные функции (RBF) и полиномиальные функции ядра.
  • подготовка данных: Как подготовить данные для алгоритма SVM.
  • Настройка гиперпараметров: Настройка гиперпараметров SVM посредством поиска по сетке.
  • Анализ главных компонентов (PCA): Как использовать PCA для уменьшения сложности данных и повторного использования их в scikit-learn.

Ссылаться на:Учебник по опорным векторным машинам и PCA для начинающих
Порекомендуйте мои похожие рубрики:


Вставьте сюда описание изображения