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