Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Розділення на навчальну та тестову вибірки і крос-валідація | Секція
Основи Контрольованого Навчання

bookРозділення на навчальну та тестову вибірки і крос-валідація

У попередніх розділах ми створювали моделі та прогнозували нові значення. Але ми не знаємо, наскільки добре працює модель і чи можна довіряти цим прогнозам.

Розділення на тренувальну та тестову вибірки

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

Це можна зробити за допомогою функції train_test_split() з бібліотеки sklearn.

Аргументи:

  • X — масив ознак;
  • y — масив цільових значень;
  • test_size — частка тестової вибірки;

Повертає:

  • X_train, X_test, y_train, y_test — масиви тих самих типів даних, що й X, y.

Зазвичай модель розділяють приблизно на 70-90% для навчальної вибірки та 10-30% для тестової вибірки.

Note
Примітка

Коли у вашому наборі даних мільйони записів, для тестування зазвичай достатньо лише кількох тисяч. У таких випадках можна виділити навіть менше 10% даних для тестування.

Тепер можна навчити модель на навчальній вибірці та оцінити її точність на тестовій вибірці.

123456789101112131415161718192021
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import train_test_split df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] # Splitting the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

Але цей підхід має певні недоліки:

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

Крос-валідація

Крос-валідація призначена для вирішення проблеми перенавчання та забезпечення здатності моделі узагальнювати результати на нових, невідомих даних. Її можна уявити як тренування в класі для вашої моделі — це допомагає моделі навчатися більш збалансовано перед фінальним тестуванням.

Ідея полягає в тому, щоб перемішати весь набір даних і розділити його на n рівних частин, які називаються фолдами. Далі модель проходить n ітерацій. На кожній ітерації n-1 фолдів використовуються для навчання, а 1 фолд — для валідації. Таким чином, кожна частина даних використовується для валідації один раз, і ми отримуємо більш надійну оцінку якості моделі.

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

Note
Примітка

Поширеним вибором кількості фолдів є 5. У такому випадку один фолд використовується як тестова вибірка, а решта 4 фолди — для навчання.

Ми навчаємо п’ять моделей на трохи різних підмножинах. Для кожної моделі обчислюємо точність на тестовій вибірці:

accuracy=predicted correctlypredicted correctly+predicted incorrectly\text{accuracy} = \frac{\text{predicted correctly}}{\text{predicted correctly} + \text{predicted incorrectly}}

Після цього можна обчислити середнє з цих 5 значень точності, яке буде нашою оцінкою точності крос-валідації:

accuracyavg=accuracy1+accuracy2+...+accuracy55\text{accuracy}_{avg} = \frac{\text{accuracy}_1+\text{accuracy}_2+...+\text{accuracy}_5}{5}

Це більш надійно, оскільки ми обчислили показник точності, використовуючи всі наші дані — лише по-різному розділені у п’яти ітераціях.

Тепер, коли ми знаємо, як працює модель, можна перенавчити її на всьому наборі даних.

На щастя, sklearn надає функцію cross_val_score() для оцінки моделі за допомогою крос-валідації, тому вам не потрібно реалізовувати це самостійно:

Аргументи:

  • estimator — об'єкт моделі;
  • X — масив значень ознак;
  • y — масив цільових значень;
  • cv — кількість фолдів (за замовчуванням 5);
  • scoring — метрика (за замовчуванням точність);

Повертає:

  • scores — масив оцінок для кожної ітерації.

Ось приклад використання крос-валідації з моделлю k-NN, навченою на наборі оцінок Star Wars:

12345678910111213141516171819
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import cross_val_score df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] scaler = StandardScaler() X = scaler.fit_transform(X) knn = KNeighborsClassifier(n_neighbors=3) # Calculating the accuracy for each split scores = cross_val_score(knn, X, y, cv=5) print('Scores: ', scores) print('Average score:', scores.mean())
copy

Оцінка, яка використовується за замовчуванням для класифікації, — це точність.

question mark

Виберіть усі правильні твердження.

Select all correct answers

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 19

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

bookРозділення на навчальну та тестову вибірки і крос-валідація

Свайпніть щоб показати меню

У попередніх розділах ми створювали моделі та прогнозували нові значення. Але ми не знаємо, наскільки добре працює модель і чи можна довіряти цим прогнозам.

Розділення на тренувальну та тестову вибірки

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

Це можна зробити за допомогою функції train_test_split() з бібліотеки sklearn.

Аргументи:

  • X — масив ознак;
  • y — масив цільових значень;
  • test_size — частка тестової вибірки;

Повертає:

  • X_train, X_test, y_train, y_test — масиви тих самих типів даних, що й X, y.

Зазвичай модель розділяють приблизно на 70-90% для навчальної вибірки та 10-30% для тестової вибірки.

Note
Примітка

Коли у вашому наборі даних мільйони записів, для тестування зазвичай достатньо лише кількох тисяч. У таких випадках можна виділити навіть менше 10% даних для тестування.

Тепер можна навчити модель на навчальній вибірці та оцінити її точність на тестовій вибірці.

123456789101112131415161718192021
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import train_test_split df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] # Splitting the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

Але цей підхід має певні недоліки:

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

Крос-валідація

Крос-валідація призначена для вирішення проблеми перенавчання та забезпечення здатності моделі узагальнювати результати на нових, невідомих даних. Її можна уявити як тренування в класі для вашої моделі — це допомагає моделі навчатися більш збалансовано перед фінальним тестуванням.

Ідея полягає в тому, щоб перемішати весь набір даних і розділити його на n рівних частин, які називаються фолдами. Далі модель проходить n ітерацій. На кожній ітерації n-1 фолдів використовуються для навчання, а 1 фолд — для валідації. Таким чином, кожна частина даних використовується для валідації один раз, і ми отримуємо більш надійну оцінку якості моделі.

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

Note
Примітка

Поширеним вибором кількості фолдів є 5. У такому випадку один фолд використовується як тестова вибірка, а решта 4 фолди — для навчання.

Ми навчаємо п’ять моделей на трохи різних підмножинах. Для кожної моделі обчислюємо точність на тестовій вибірці:

accuracy=predicted correctlypredicted correctly+predicted incorrectly\text{accuracy} = \frac{\text{predicted correctly}}{\text{predicted correctly} + \text{predicted incorrectly}}

Після цього можна обчислити середнє з цих 5 значень точності, яке буде нашою оцінкою точності крос-валідації:

accuracyavg=accuracy1+accuracy2+...+accuracy55\text{accuracy}_{avg} = \frac{\text{accuracy}_1+\text{accuracy}_2+...+\text{accuracy}_5}{5}

Це більш надійно, оскільки ми обчислили показник точності, використовуючи всі наші дані — лише по-різному розділені у п’яти ітераціях.

Тепер, коли ми знаємо, як працює модель, можна перенавчити її на всьому наборі даних.

На щастя, sklearn надає функцію cross_val_score() для оцінки моделі за допомогою крос-валідації, тому вам не потрібно реалізовувати це самостійно:

Аргументи:

  • estimator — об'єкт моделі;
  • X — масив значень ознак;
  • y — масив цільових значень;
  • cv — кількість фолдів (за замовчуванням 5);
  • scoring — метрика (за замовчуванням точність);

Повертає:

  • scores — масив оцінок для кожної ітерації.

Ось приклад використання крос-валідації з моделлю k-NN, навченою на наборі оцінок Star Wars:

12345678910111213141516171819
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import cross_val_score df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] scaler = StandardScaler() X = scaler.fit_transform(X) knn = KNeighborsClassifier(n_neighbors=3) # Calculating the accuracy for each split scores = cross_val_score(knn, X, y, cv=5) print('Scores: ', scores) print('Average score:', scores.mean())
copy

Оцінка, яка використовується за замовчуванням для класифікації, — це точність.

question mark

Виберіть усі правильні твердження.

Select all correct answers

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 19
some-alt