Поділ на навчальну та тестову вибірки і перехресна валідація
У попередніх розділах ми створювали моделі та прогнозували нові значення. Проте ми не маємо уявлення про те, наскільки добре працює модель і чи є ці прогнози надійними.
Розділення на навчальну та тестову вибірки
Щоб оцінити ефективність моделі, необхідно мати підмножину розмічених даних, які модель ще не бачила. Тому всі розмічені дані випадковим чином розділяють на навчальну вибірку та тестову вибірку.
Це можна реалізувати за допомогою функції train_test_split() з бібліотеки sklearn.
Зазвичай модель розділяють приблизно на 70-90% для навчальної вибірки та 10-30% для тестової вибірки.
Коли у вашому наборі даних мільйони записів, для тестування зазвичай достатньо лише кількох тисяч. У таких випадках можна виділити навіть менше 10% даних для тестування.
Тепер можна навчити модель на навчальній вибірці та оцінити її точність на тестовій вибірці.
123456789101112131415161718192021from 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 = scaler.fit_transform(X_train) X_test = 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))
Але цей підхід має певні недоліки:
- Не використовується вся доступна інформація для навчання, що могло б покращити модель;
- Оскільки оцінка точності моделі проводиться на невеликій частині даних (тестовій вибірці), цей показник може бути ненадійним для малих наборів даних. Ви можете запустити код вище кілька разів і побачити, як змінюється точність щоразу, коли вибирається нова тестова вибірка.
Крос-валідація
Крос-валідація призначена для вирішення проблеми перенавчання та забезпечення здатності моделі добре узагальнювати на нових, невідомих даних. Її можна порівняти з тренуванням у класі для вашої моделі — це допомагає моделі навчатися більш збалансовано перед справжнім фінальним тестом.
Ідея полягає в тому, щоб перемішати весь набір даних і розділити його на n рівних частин, які називаються фолдами. Далі модель проходить n ітерацій. На кожній ітерації n-1 фолдів використовуються для навчання, а 1 фолд — для валідації. Таким чином, кожна частина даних використовується для валідації один раз, і ми отримуємо більш надійну оцінку якості моделі.
Зверніть увагу, що крос-валідація не замінює тестову вибірку. Після використання крос-валідації для вибору та налаштування моделі її слід оцінити на окремій тестовій вибірці, щоб отримати неупереджену оцінку ефективності в реальних умовах.
Поширеним вибором кількості фолдів є 5. У такому випадку один фолд використовується як тестова вибірка, а решта 4 фолди — для навчання.
Ми навчаємо п’ять моделей на дещо різних підмножинах. Для кожної моделі обчислюємо точність на тестовій вибірці:
accuracy=predicted correctly+predicted incorrectlypredicted correctlyПісля цього можна обчислити середнє з 5 отриманих значень точності, що й буде нашою оцінкою точності крос-валідації:
accuracyavg=5accuracy1+accuracy2+...+accuracy5Цей підхід є більш надійним, оскільки ми обчислювали показник точності, використовуючи всі наші дані — лише по-різному розділені у п’яти ітераціях.
Тепер, коли ми знаємо, наскільки добре працює модель, можна перенавчити її на всьому наборі даних.
На щастя, sklearn надає функцію cross_val_score() для оцінювання моделі за допомогою крос-валідації, тому не потрібно реалізовувати це самостійно:
Приклад використання крос-валідації з моделлю k-NN, навченою на наборі оцінок Star Wars:
12345678910111213141516171819from 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())
Оцінка, яка використовується за замовчуванням для класифікації, — це точність.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Can you explain the difference between train-test split and cross-validation?
How do I choose the right number of folds for cross-validation?
What are some common pitfalls when using cross-validation?
Awesome!
Completion rate improved to 4.17
Поділ на навчальну та тестову вибірки і перехресна валідація
Свайпніть щоб показати меню
У попередніх розділах ми створювали моделі та прогнозували нові значення. Проте ми не маємо уявлення про те, наскільки добре працює модель і чи є ці прогнози надійними.
Розділення на навчальну та тестову вибірки
Щоб оцінити ефективність моделі, необхідно мати підмножину розмічених даних, які модель ще не бачила. Тому всі розмічені дані випадковим чином розділяють на навчальну вибірку та тестову вибірку.
Це можна реалізувати за допомогою функції train_test_split() з бібліотеки sklearn.
Зазвичай модель розділяють приблизно на 70-90% для навчальної вибірки та 10-30% для тестової вибірки.
Коли у вашому наборі даних мільйони записів, для тестування зазвичай достатньо лише кількох тисяч. У таких випадках можна виділити навіть менше 10% даних для тестування.
Тепер можна навчити модель на навчальній вибірці та оцінити її точність на тестовій вибірці.
123456789101112131415161718192021from 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 = scaler.fit_transform(X_train) X_test = 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))
Але цей підхід має певні недоліки:
- Не використовується вся доступна інформація для навчання, що могло б покращити модель;
- Оскільки оцінка точності моделі проводиться на невеликій частині даних (тестовій вибірці), цей показник може бути ненадійним для малих наборів даних. Ви можете запустити код вище кілька разів і побачити, як змінюється точність щоразу, коли вибирається нова тестова вибірка.
Крос-валідація
Крос-валідація призначена для вирішення проблеми перенавчання та забезпечення здатності моделі добре узагальнювати на нових, невідомих даних. Її можна порівняти з тренуванням у класі для вашої моделі — це допомагає моделі навчатися більш збалансовано перед справжнім фінальним тестом.
Ідея полягає в тому, щоб перемішати весь набір даних і розділити його на n рівних частин, які називаються фолдами. Далі модель проходить n ітерацій. На кожній ітерації n-1 фолдів використовуються для навчання, а 1 фолд — для валідації. Таким чином, кожна частина даних використовується для валідації один раз, і ми отримуємо більш надійну оцінку якості моделі.
Зверніть увагу, що крос-валідація не замінює тестову вибірку. Після використання крос-валідації для вибору та налаштування моделі її слід оцінити на окремій тестовій вибірці, щоб отримати неупереджену оцінку ефективності в реальних умовах.
Поширеним вибором кількості фолдів є 5. У такому випадку один фолд використовується як тестова вибірка, а решта 4 фолди — для навчання.
Ми навчаємо п’ять моделей на дещо різних підмножинах. Для кожної моделі обчислюємо точність на тестовій вибірці:
accuracy=predicted correctly+predicted incorrectlypredicted correctlyПісля цього можна обчислити середнє з 5 отриманих значень точності, що й буде нашою оцінкою точності крос-валідації:
accuracyavg=5accuracy1+accuracy2+...+accuracy5Цей підхід є більш надійним, оскільки ми обчислювали показник точності, використовуючи всі наші дані — лише по-різному розділені у п’яти ітераціях.
Тепер, коли ми знаємо, наскільки добре працює модель, можна перенавчити її на всьому наборі даних.
На щастя, sklearn надає функцію cross_val_score() для оцінювання моделі за допомогою крос-валідації, тому не потрібно реалізовувати це самостійно:
Приклад використання крос-валідації з моделлю k-NN, навченою на наборі оцінок Star Wars:
12345678910111213141516171819from 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())
Оцінка, яка використовується за замовчуванням для класифікації, — це точність.
Дякуємо за ваш відгук!