#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()
проверку ваших тестовых данных и новых образцов, которые будут масштабироваться в соответствии с рассчитанным средним значением и отклонениями.
Вы должны:
train_test_split()
fit()
выStandardScaler()
используете данные о поездахfit()
ваша модель с использованием преобразованного набора поездовtransform()
ваши тестовые данные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]]))