Детектор объектов SVM HOG

#python #scikit-learn #svm

Вопрос:

Я столкнулся с проблемой при обучении детектора объектов SVM HOG, и вот что я сделал. Я поместил все функции в список, который называется features и используется

 X_scaler = StandardScaler().fit(features)
scaled_X = X_scaler.transform(features)
rand_state = np.random.randint(0, 100)
X_train, X_test, y_train, y_test = train_test_split(np.array(features), labels, test_size=0.3, random_state=rand_state)
 

Согласно sklearn.preprocessing.StandardScaler , это преобразование StandardScaler() основано на среднем и стандартном отклонении всех обучающих выборок. Итак, возникает вопрос: если я хочу протестировать свой обученный SVM только на 1 недавно просмотренном образце, как я могу его применить StandardScaler() ? поскольку я не могу рассчитать среднее и стандартное отклонение только по 1 выборке.

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

 X_scaler = StandardScaler().fit(test_feature)
scaled_X = X_scaler.transform(test_feature_feature)
 

кажется, все работает правильно, и SVM выдает правильный вывод , но когда len(test_feature) == 1 , независимо от того, использую StandardScaler() ли я преобразование test_feature или прямое использование y_pred = clf.predict(np.array(test_feature)) , вывод-это все мусор.

Есть какие-нибудь комментарии?

Ответ №1:

Вам нужно соответствовать вашим StandardScaler() данным только для обучения, иначе ваши средства и отклонения будут предвзятыми, поскольку они рассчитываются с использованием тестовых данных. Как только этот трансформатор будет установлен, вы сможете выполнить transform() проверку ваших тестовых данных и новых образцов, которые будут масштабироваться в соответствии с рассчитанным средним значением и отклонениями.

Вы должны:

  1. train_test_split()
  2. fit() вы StandardScaler() используете данные о поездах
  3. fit() ваша модель с использованием преобразованного набора поездов
  4. transform() ваши тестовые данные
  5. predict() преобразованные тестовые данные

Следующим образом:

 X_train, X_test, y_train, y_test = train_test_split(np.array(features), labels, test_size=0.3, random_state=rand_state)

scaler = StandardScaler()
    
X_train = scaler.fit_transform(X_train)

clf.fit(X_train, y_train)

X_test = scaler.transform(X_test)

clf.predict(X_train)
 

Ответ №2:

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

 from sklearn.preprocessing import StandardScaler
data = [[0, 0], [0, 0], [1, 1], [1, 1]]
scaler = StandardScaler()
# calling fit will calculate the mean and std
print(scaler.fit(data))
# print out the calcualted mean for example
print(scaler.mean_)
# transform a new data point
print(scaler.transform([[2, 2]]))