Как уже упоминалось в комментариях, ваши два фрагмента кода фактически эквивалентны; во 2-м фрагменте:
y_pred <- predict(classifier, newdata = test_set)
5-й столбец test_set[5]
, содержащий результаты, под колпаком, фактически удаляется из данных, подаваемых в модель, и не используется для создания реальных прогнозов.
Но это интересный пример, демонстрирующий, как языковая функция, предназначенная для удобства, потенциально может привести новых пользователей к такой путанице: фактически здесь, единственная причина, по которой ваш второй фрагмент работает вообще без ошибка возникает из-за интерфейса формулы (довольно отличительная характеристика c of R), используемого при подгонке модели.
Чтобы увидеть, как ситуация может легко отличаться, давайте сделаем некоторые (казалось бы, неважные и тривиальные) изменения; давайте отделим элементы от меток вручную и вместо этого воспользуемся альтернативным интерфейсом данных для подгонки модели:
X = training_set[,1:4]
y = training_set[5]
classifier = svm(X, y,
type = 'C-classification',
kernel = 'radial')
Это приведет к сбою 2-го фрагмента (теперь, напротив, test_set
X
, используемый для обучения, также содержит метки, то есть еще один столбец, просто потому, что он получает больше входных данных (5), чем он ожидает (4):
pred = predict(classifier, test_set)
Error in scale.default(newdata[, object$scaled, drop = FALSE], center = object$x.scale$"scaled:center", :
length of 'center' must equal the number of columns of 'x'
Calls: predict -> predict.svm -> scale -> scale.default
Execution halted
В этом случае он Мы несем ответственность за подготовку данных таким образом, чтобы они содержали те же самые функции, которые использовались для обучения - не меньше, но и не более:
pred = predict(classifier, test_set[,1:4]) # works OK
, но это, вероятно, предотвращает также потенциальные заблуждения, подобные тем, которые вы здесь выразили ...
Если смотреть дальше, чем R, эта вторая ситуация (то есть интерфейс данных вместо формулы 1) является скорее правилом, чем исключением. Вот случай с Python и sciki-learn; без предоставления полного примера для краткости (оставьте комментарий, если вы хотите, чтобы sh увидел его полностью), с X
и y
функциями и метками радужной оболочки соответственно, мы подходим к классификатору как
clf = LogisticRegression()
clf.fit(X,y)
но если мы объединим X
и y
в одну переменную X_plus
и попытаемся предсказать ее, мы получим ожидаемую ошибку для избыточных столбцов:
clf.predict(X_plus)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-21-b7d5b72a1945> in <module>()
----> 1 clf.predict(X_plus)
/usr/local/lib/python3.6/dist-packages/sklearn/linear_model/_base.py in decision_function(self, X)
271 if X.shape[1] != n_features:
272 raise ValueError("X has %d features per sample; expecting %d"
--> 273 % (X.shape[1], n_features))
274
275 scores = safe_sparse_dot(X, self.coef_.T,
ValueError: X has 5 features per sample; expecting 4