Шаг 66.
Введение в машинное обучение с использованием Python. ... . Ядерный метод опорных векторов. Предварительная обработка данных для SVM

    На этом шаге мы рассмотрим способы выполнения такой обработки.

    Один из способов решения этой проблемы - масштабирование всех признаков таким образом, чтобы все они имели примерно один и тот же масштаб. Общераспространенный метод масштабирования для ядерного SVM заключается в масштабировании данных так, чтобы все признаки принимали значения от 0 до 1. Мы увидим, как это делается с помощью метода предварительной обработки MinMaxScaler в последующих шагах, в которых дадим более подробную информацию. А сейчас давайте сделаем это "вручную":

[In 12]:
# вычисляем минимальное значение для каждого признака обучающего набора 
min_on_training = X_train.min(axis=0)
# вычисляем ширину диапазона для каждого признака (max - min) обучающего набора 
range_on_training = (X_train - min_on_training).max(axis=0)

# вычитаем минимальное значение и затем делим на ширину диапазона
# min=0 и max=1 для каждого признака
X_train_scaled = (X_train - min_on_training) / range_on_training
print("Минимальное значение для каждого признака\n {}".
      format(X_train_scaled.min(axis=0))) 
print("Максимальное значение для каждого признака\n {}".
      format(X_train_scaled.max(axis=0)))

Минимальное значение для каждого признака
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0.]
Максимальное значение для каждого признака
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1.]
[In 13]:
# используем ТО ЖЕ САМОЕ преобразование для тестового набора,
# используя минимум и ширину диапазона из обучающего набора
X_test_scaled = (X_test - min_on_training) / range_on_training
[In 14]:
svc = SVC()
svc.fit(X_train_scaled, y_train)
print("Правильность на обучающем наборе: {:.3f}".
      format(svc.score(X_train_scaled, y_train)))
print("Правильность на тестовом наборе: {:.3f}".
      format(svc.score(X_test_scaled, y_test))) 

Правильность на обучающем наборе: 0.984
Правильность на тестовом наборе: 0.972
Масштабирование данных привело к некоторой разнице. На самом деле качество модели на обучающем и тестовом наборе весьма схоже. Попробуем попытаться увеличить С или gamma, чтобы попробовать использовать более сложную модель. Например:
[In 15]:
svc = SVC(C=1000)
svc.fit(X_train_scaled, y_train)
print("Правильность на обучающем наборе: {:.3f}".
      format(svc.score(X_train_scaled, y_train)))
print("Правильность на тестовом наборе: {:.3f}".
      format(svc.score(X_test_scaled, y_test))) 

Правильность на обучающем наборе: 1.000
Правильность на тестовом наборе: 0.958

    В данном случае увеличение C ухудшило модель, в результате правильность на тестовом наборе составляет 95.8%.

    Архив блокнота со всеми вычислениями, выполненными на 62-66 шагах, можно взять здесь.

    На следующем шаге мы рассмотрим преимущества, недостатки и параметры.




Предыдущий шаг Содержание Следующий шаг