Метрики перекрестной проверки в scikit-learn для каждого разделения данных

String.split(String regex) принимает параметр a RegEx.

RegEX для \ - \\\\

Try

String[] strArray = str.split("\\\\");

Причина использования "\\\\",

Regex для \ есть \\

Теперь \\ рассматривается как \ применяет логику escape-символа (\n = новая строка, \\ = \)

Итак, чтобы "\\" мы использовали "\\\\"

Надеемся, что это не смущает ..: D

1
задан desertnaut 15 January 2019 в 16:22
поделиться

1 ответ

Есть некоторые проблемы с вашим подходом.

Для начала вам, конечно, не нужно добавлять данные вручную один за другим в вашей тренировке & amp; проверочные списки (т. е. ваши 2 внутренних цикла for); простая индексация сделает эту работу.

Кроме того, мы обычно никогда не вычисляем & amp; сообщить об ошибке тренировочных сгибов резюме - только ошибка на проверочных сгибах.

Имея это в виду и переключая терминологию на «валидация» вместо «тест», вот простой воспроизводимый пример с использованием данных Бостона, который должен быть простым для адаптации к вашему случаю:

from sklearn.model_selection import KFold
from sklearn.datasets import load_boston
from sklearn.metrics import mean_absolute_error
from sklearn.tree import DecisionTreeRegressor

X, y = load_boston(return_X_y=True)
n_splits = 5
kf = KFold(n_splits=n_splits, shuffle=True)
model = DecisionTreeRegressor(criterion='mae')

cv_mae = []

for train_index, val_index in kf.split(X):
    model.fit(X[train_index], y[train_index])
    pred = model.predict(X[val_index])
    err = mean_absolute_error(y[val_index], pred)
    cv_mae.append(err)
[ 1118], после чего ваш cv_mae должен выглядеть примерно так (детали будут отличаться из-за случайного характера резюме):

[3.5294117647058827,
 3.3039603960396042,
 3.5306930693069307,
 2.6910891089108913,
 3.0663366336633664]

Конечно, все эти явные вещи не нужны; Вы можете сделать работу намного проще с cross_val_score . Однако есть небольшой улов:

from sklearn.model_selection import cross_val_score
cv_mae2 =cross_val_score(model, X, y, cv=n_splits, scoring="neg_mean_absolute_error")
cv_mae2
# result
array([-2.94019608, -3.71980198, -4.92673267, -4.5990099 , -4.22574257])

Помимо отрицательного знака, который на самом деле не является проблемой, вы заметите, что дисперсия результатов выглядит значительно выше по сравнению с нашими cv_mae выше; и причина в том, что мы не перемешали наши данные. К сожалению, cross_val_score не предоставляет возможность тасования, поэтому мы должны сделать это вручную, используя shuffle. Таким образом, наш окончательный код должен быть:

from sklearn.model_selection import cross_val_score
from sklearn.utils import shuffle
X_s, y_s =shuffle(X, y)
cv_mae3 =cross_val_score(model, X_s, y_s, cv=n_splits, scoring="neg_mean_absolute_error")
cv_mae3
# result:
array([-3.24117647, -3.57029703, -3.10891089, -3.45940594, -2.78316832])

, который значительно меньше дисперсии между сгибами и намного ближе к нашему начальному cv_mae ...

0
ответ дан desertnaut 15 January 2019 в 16:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: