Як розділити набір даних для перехресної перевірки, кривої навчання та остаточного оцінювання?


69

Яка відповідна стратегія розподілу набору даних?

Я прошу зворотний зв'язок на наступний підхід ( а нема на окремих параметрів , таких як test_sizeабо n_iter, але якщо я X, y, X_train, y_train, X_test, і y_testвідповідним чином і , якщо послідовність має сенс):

(продовження цього прикладу з документації scikit-learn)

1. Завантажте набір даних

from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target

2. Розділіть на навчальний і тестовий набір (наприклад, 80/20)

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

3. Оберіть оцінювач

from sklearn.svm import SVC
estimator = SVC(kernel='linear')

4. Виберіть ітератор перехресної перевірки

from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)

5. Налаштуйте гіперпараметри

застосування ітератора перехресної перевірки на навчальному наборі

from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)

6. Алгоритм налагодження з кривою навчання

X_trainвипадковим чином розбивається на навчальний і тестовий набір 10 разів ( n_iter=10). Кожна точка на кривому навчання-бального середнє з 10 балів , де навчалася модель і оцінювала на першому я навчальні прикладах. Кожна точка на крос-перевірка оцінку кривого являє собою середнє значення 10 балів , де була навченої модель на першому я навчальні прикладах і оцінені на все приклади тестового набору.

from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()

Крива навчання

plot_learning_curve () можна знайти в поточній версії розробника scikit-learn (0,15-git).

7. Підсумкове оцінювання на тестовому наборі

classifier.score(X_test, y_test)

7а. Перевірте надмірну придатність у виборі моделі за допомогою вкладеної перехресної перевірки (використовуючи весь набір даних)

from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)

Додаткове запитання: чи має сенс замінити крок 7 вкладеною перехресною перевіркою? Або слід вкладений cv вважати доповненням до кроку 7

(начебто, код працює з перехресною валідацією k-fold у scikit-learn, але не з перетасуванням та розділенням. Тому cvйого потрібно змінити вище, щоб код працював)

8. Тренуйте остаточну модель на цілому наборі даних

classifier.fit(X, y)

EDIT: Зараз я погоджуюся з cbeleites, що етап 7a не має особливого сенсу в цій послідовності. Тож я б не прийняв цього.


Яке правило оцінки точності ви використовуєте? Якщо це класифікаційна точність, таке неправильне бальне правило скасує велику частину роботи, яку ви пройшли.
Френк Харрелл

Я використав за замовчуванням, що дійсно є точністю класифікації. Я знаю, що, наприклад, F1 було б більш доречним. Але тут мене просто цікавить, чи розбиття використовуються добре.
tobip

3
Я майже впевнений, що F1 - це нова назва для старої концепції. Я думаю, що вигадувати нові назви для старих речей контрпродуктивно. Що ще важливіше, це неправильне правило балів, яке призведе до вибору неправильних функцій, а також додасть велику кількість шуму всьому процесу.
Френк Харрелл

3
... у будь-якому випадку F1 поділяє проблеми точності @FrankHarrell натякає на: це походить від підрахунку фракцій тестових випадків жорстких класифікацій. Щоб отримати одне з правил правильного балу Франка, вам потрібно буде переключитися на ймовірнісний вихід SVM, а потім, наприклад, використовувати точку Brier (середню квадратичну помилку) замість точності. Я думаю, ви також можете отримати версію F1 типу MSE. Такі заходи справді повинні бути кращими для кроку налаштування. Для повідомлення про кінцевий показник вам також можуть знадобитися типові способи (наприклад, точність, F1) вираження ефективності для вашої спільноти.
cbeleites

1
@ ta.ft: неправильний підхід чи ні, залежить від того, що ви вважаєте неправильним: пошук сітки за пропорціями несе серйозний ризик зменшення розбіжності, якщо ви не маєте смішно велику кількість незалежних випадків. Так, для багатьох ситуацій твердження, що пошук за сіткою дає оптимальну модель, є помилковим. Однак якщо ви робите належну вкладену перевірку, зовнішня перевірка дає сумлінну міру ефективності обраної "оптимальної" моделі. Так що це не неправильно. Ви просто не маєте гарантії, що пошук в сітці отримав оптимальну модель. Щодо літератури, я оновлю свою відповідь.
cbeleites

Відповіді:


41

Я не впевнений, що ви хочете зробити на етапі 7а. Як я це зараз розумію, для мене це не має сенсу.

Ось як я розумію ваш опис: на кроці 7 ви хочете порівняти ефективність витримки з результатами перехресної перевірки, що охоплює кроки 4 - 6. (так, так, це було б вкладеною установкою).

Основні моменти, чому я не думаю, що це порівняння має багато сенсу:

  • Це порівняння не може виявити два основних джерела результатів надмірної валідації, з якими я стикаюсь на практиці:

    • витоки даних (залежність) між навчальними та тестовими даними, які викликані ієрархічною (інакше кластеризованою) структурою даних, і яка не враховується при розщепленні. У моєму полі ми, як правило, множинні (іноді тисячі) читання (= рядки в матриці даних) одного і того ж пацієнта або біологічні копії експерименту. Вони не є незалежними, тому розбиття валідації потрібно проводити на рівні пацієнта. Однак таке витік даних трапляється, ви матимете його як у розбитті для набору витримки, так і в розбитті міжперехресної перевірки. Тоді витримка повинна бути настільки ж оптимістично упередженою, як і перехресне підтвердження.

    • Попередня обробка даних проводиться на всій матриці даних, де обчислення не є незалежними для кожного рядка, але багато / всі рядки використовуються для обчислення параметрів для попередньої обробки. Типовими прикладами можуть бути, наприклад, проекція PCA перед "фактичною" класифікацією.
      Знову ж таки, це вплине як на вашу витримку, так і на зовнішню перехресну перевірку, тому ви не можете її виявити.

    Для даних, з якими я працюю, обидві помилки можуть легко призвести до недооцінки частки класифікацій на порядок!

  • Якщо ви обмежуєтесь цією підрахованою часткою тестових випадків типу продуктивності, для порівняння моделей потрібні або надзвичайно велика кількість тестових випадків, або смішно великі відмінності у справжній продуктивності. Порівняння двох класифікаторів з необмеженими даними про навчання може бути хорошим початком для подальшого читання.

Однак, порівнюючи якість моделі, заявки на внутрішню перехресну валідацію для "оптимальної" моделі та зовнішню перехресну валідацію чи витримку перевірки має сенс: якщо розбіжність велика, сумнівно, чи спрацювала оптимізація пошуку в сітці (можливо, у вас є знежирена дисперсія через високу дисперсію міри продуктивності). Це порівняння простіше тим, що ви можете помітити неприємності, якщо внутрішня оцінка є смішно хорошою порівняно з іншими - якщо це не так, вам не потрібно так сильно переживати за оптимізацію. Але в будь-якому випадку, якщо ваше зовнішнє (7) вимірювання продуктивності є чесним і надійним, ви, принаймні, маєте корисну оцінку отриманої моделі, оптимальна вона чи ні.

Вимірювання кривої навчання ІМХО - це ще одна проблема. Я б , ймовірно , мати справу з цим окремо, і я думаю , що вам потрібно , щоб більш ясно , що вам потрібно криве навчання для (вам потрібно криві навчань для визначення в наборі даних даного завдання, даних і методу класифікації або криве навчання для цього набору даних даної проблеми, даних та класифікаційного мехтоду) та купі подальших рішень (наприклад, як поводитися зі складністю моделі як функцією розміру вибіркового тренінгу? Оптимізувати все заново, використовувати фіксовані гіперпараметри, вирішити функція для фіксації гіперпараметрів залежно від розміру навчального набору?)

(Мої дані, як правило, мають так мало незалежних випадків, щоб визначити криву навчання достатньо точною, щоб використовувати її на практиці - але вам може бути краще, якщо ваші 1200 рядків насправді незалежні)


оновлення: Що "не так" у прикладі scikit-learn?

Перш за все, тут немає нічого поганого з вкладеною перехресною валідацією. Вкладена валідація має надзвичайно важливе значення для оптимізації, керованої даними, і перехресне підтвердження є дуже потужним підходом (особливо, якщо повторне / повторне).

Тоді, чи взагалі щось не так, залежить від вашої точки зору: якщо ви робите чесну вкладену перевірку (зберігаючи суворо незалежні дані зовнішніх тестів), зовнішня перевірка є належним показником ефективності "оптимальної" моделі. Нічого поганого в цьому немає.

Але декілька речей можуть і не помилитися з пошуком сітки цих заходів щодо пропорційного типу для налаштування гіперпараметрів SVM. В основному вони означають, що ви (напевно?) Не можете розраховувати на оптимізацію. Тим не менше, якщо ваш зовнішній розкол був виконаний належним чином, навіть якщо модель не найкраща, ви маєте чесну оцінку продуктивності отриманої вами моделі.

Я спробую дати інтуїтивні пояснення, чому оптимізація може спричинити проблеми:

  • Математично / статистично кажучи, проблема пропорцій полягає в тому, що виміряні пропорції підлягають величезній дисперсії через кінцевий розмір тестового зразка (залежно також від справжньої продуктивності моделі, ): прВг( р )=р(1-р)p^np
    Var(p^)=p(1p)n

    Вам потрібна смішно величезна кількість справ (принаймні порівняно з кількістю справ, які я, як правило, маю), щоб досягти необхідної точності (зміщення / зміщення дисперсії) для оцінки виклику, точності (сенс виконання машинного навчання). Це звичайно стосується також співвідношень, які ви обчислюєте з таких пропорцій. Подивіться на довірчі інтервали для біноміальних пропорцій. Вони шокуюче великі! Часто більше, ніж справжнє поліпшення продуктивності над сіткою гіперпараметра. І статистично кажучи, пошук сітки - це велика проблема багаторазового порівняння: чим більше точок сітки ви оцінюєте, тим вище ризик знайти деяку комбінацію гіперпараметрів, яка випадково виглядає дуже добре для розбиття поїздів / тестів, які ви оцінюєте. Це те, що я маю на увазі під варіантом скимінгу.

  • Інтуїтивно розглянемо гіпотетичну зміну гіперпараметра, що повільно призводить до погіршення моделі: один тестовий випадок рухається до межі рішення. Заходи щодо "жорсткої" пропорції не виявляють цього, поки справа не перетне кордон і не стане на стороні. Тоді, однак, вони негайно призначають повну помилку для нескінченно малої зміни гіперпараметра.
    Для того, щоб зробити чисельну оптимізацію, вам потрібно добре поводитись із показником ефективності. Це означає: ані стрибкована (не безперервно диференційована) частина показника продуктивності пропорційного типу, ні той факт, що крім цього стрибка, фактично не виявлені зміни, не підходять для оптимізації.
    Правильні бали визначаються таким чином, що особливо підходить для оптимізації. Вони мають свій глобальний максимум, коли передбачувані ймовірності відповідають справжній ймовірності для кожного випадку належності до відповідного класу.

  • Для SVM у вас є додаткова проблема, що не тільки ефективність, але і модель реагує таким стрибковим способом: невеликі зміни гіперпараметра нічого не змінять. Модель змінюється лише тоді, коли гіперпараметри є достатньо зміненими, щоб змусити якийсь випадок перестати бути вектором підтримки або стати вектором підтримки. Знову ж таки, такі моделі важко оптимізувати.

Література:


Оновлення II: Відхилення від знежирення

що ви можете собі дозволити з точки зору порівняння моделі, очевидно, залежить від кількості незалежних випадків. Давайте зробимо тут кілька швидких та брудних моделей щодо ризику зменшення скромності:

scikit.learnговорить, що їх 1797 є в digitsданих.

  • припустимо, що порівнюється 100 моделей, наприклад, сітка для 2 параметрів.10×10
  • припустимо, що обидва параметри (діапазони) взагалі не впливають на моделі,
  • тобто всі моделі мають однакову справжню продуктивність, скажімо, 97% (типова продуктивність для digitsнабору даних).

  • Виконайте моделювання "тестування цих моделей" з розміром вибірки = 1797 рядків у наборі даних104digits

    p.true = 0.97 # hypothetical true performance for all models
    n.models = 100 # 10 x 10 grid
    
    n.rows = 1797 # rows in scikit digits data
    
    sim.test <- replicate (expr= rbinom (n= nmodels, size= n.rows, prob= p.true), 
                           n = 1e4)
    sim.test <- colMaxs (sim.test) # take best model
    
    hist (sim.test / n.rows, 
          breaks = (round (p.true * n.rows) : n.rows) / n.rows + 1 / 2 / n.rows, 
          col = "black", main = 'Distribution max. observed performance',
          xlab = "max. observed performance", ylab = "n runs")
    abline (v = p.outer, col = "red")
    

Ось розподіл найкращих спостережуваних показників:

моделювання дисперсії на скрім

Червона лінія позначає справжню ефективність усіх наших гіпотетичних моделей. В середньому ми спостерігаємо лише 2/3 справжнього коефіцієнта помилок для, здавалося б, найкращого з 100 порівняних моделей (для моделювання ми знаємо, що всі вони працюють однаково з 97% правильними прогнозами).

Це моделювання, очевидно, дуже спрощено:

  • На додаток до дисперсії розміру тестового зразка є щонайменше дисперсія через нестабільність моделі, тому ми тут недооцінюємо дисперсію
  • Налаштування параметрів, що впливають на складність моделі, зазвичай охоплює набори параметрів, де моделі нестабільні і, отже, мають велику дисперсію.
  • Для цифр UCI з прикладу оригінальна база даних має приблизно. 11000 цифр, написаних 44 особами. Що робити, якщо дані кластеруються відповідно до особи, яка написала? (Тобто легше розпізнати 8, написаний кимось, якщо ви знаєте, як ця людина пише, скажімо, 3?) Ефективний розмір вибірки тоді може становити до 44.
  • Налаштування гіперпараметрів моделі може призвести до кореляції між моделями (насправді це вважатиметься добре сприйнятим з точки зору числової оптимізації). Важко передбачити вплив цього (і я підозрюю, що це неможливо без врахування фактичного типу класифікатора).

Однак загалом, як низька кількість незалежних тестових випадків, так і велика кількість порівняних моделей збільшують упередженість. Також папір Cawley and Talbot дає емпіричну спостережувану поведінку.


@cbleites: Якщо пошук по сітці може бути не підходящим методом пошуку оптимальної моделі, то який метод я повинен вибрати тоді?
tobip

1
@ ta.ft: два підходи: а) включити якомога більше зовнішніх знань про вашу програму та дані в моделювання, щоб різко зменшити кількість моделей, які потрібно порівнювати (= вирішуйте гіперпараметри замість оптимізації). Можливо, загалом краще змінити класифікатор, який має суттєво значущі гіперпараметри, тобто там, де ви можете дізнатись із програми та типу даних, яким повинен бути (приблизно) гіперпараметр. б) порівняйте декілька решти моделей за правильним балом. Наприклад, оцінка Briers має набагато кращі дисперсійні властивості для багатьох класифікаторів.
cbeleites

1
Ви також можете взагалі відмовитись від оптимізації (через рішення (а)). Якщо ви отримаєте достатньо хороший класифікатор і можете стверджувати, що у вас немає шансів довести перевагу над іншим класифікатором, враховуючи наявний розмір вибірки (наприклад, зробіть кілька демо-підрахунків McNemar, знайдіть необхідний розмір вибірки для порівняння пропорцій для гіпотетичного кращого класифікатора - є хороший шанс, що вони будуть смішно великими навіть для смішно великих гіпотетичних удосконалень), ви можете стверджувати, що оптимізація не має сенсу і просто створює ризик перевитрати.
cbeleites

Я не згоден з вами щодо "дисперсії на знімку". Якщо у вас є багато точок у сітці для оптимізації гіперпараметрів, точка може умовно пощастити в одній складці резюме; але якщо у вас, скажімо, 10-кратне резюме, навряд чи набір параметрів випадково пощастить у всіх 10-ти кратних резюме.
РНК

1
@RNA: Ймовірність "пощастити" у всіх складках безпосередньо пов'язана із загальною кількістю випадків (у всіх 10 разів), і, як правило, враховується лише середнє значення для всіх цих складок. Я оновив відповідь за допомогою моделювання гіпотетичного підбору найкращої з 100 моделей (скажімо, 2 гіперпараметри з 10 кроками кожна), що вже пов'язано зі значним ухилом для прикладу сценарію (занадто низький показник помилок на 1/3) . Багато людей тут рідко мають під рукою кілька тисяч незалежних випадків - наприклад, у мене рідко буває навіть 44 особи, які писали цифри для повного набору даних про UCI.
cbeleites
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.