Czy wybór funkcji powinien być wykonywany tylko na danych treningowych (lub wszystkich danych)? Przeszedłem kilka dyskusji i artykułów, takich jak Guyon (2003) i Singhi i Liu (2006) , ale wciąż nie jestem pewien, czy odpowiedź jest prawidłowa.
Moja konfiguracja eksperymentu wygląda następująco:
- Zestaw danych: 50 zdrowych kontroli i 50 pacjentów z chorobą (około 200 cech, które mogą być istotne dla prognozowania choroby).
- Zadanie polega na zdiagnozowaniu choroby na podstawie dostępnych funkcji.
To co robię jest
- Weź cały zestaw danych i dokonaj wyboru funkcji (FS). Zachowuję tylko wybrane funkcje do dalszego przetwarzania
- Podziel, aby przetestować i trenować, klasyfikator pociągów z wykorzystaniem danych pociągu i wybranych funkcji. Następnie zastosuj klasyfikator do testowania danych (ponownie używając tylko wybranych funkcji). Wykorzystywana jest walidacja z pominięciem jednego z nich.
- uzyskać dokładność klasyfikacji
- Uśrednianie: powtórz 1) -3) N razy. (100).
Zgodziłbym się, że wykonanie FS dla całego zestawu danych może wprowadzić pewne odchylenie, ale moim zdaniem jest ono „uśredniane” podczas uśredniania (krok 4). Czy to jest poprawne? (Wariant dokładności wynosi )
1 Guyon, I. (2003) „Wprowadzenie do wyboru zmiennych i cech”, The Journal of Machine Learning Research, t. 3, s. 1157-1182
2 Singhi, SK i Liu, H. (2006) „Bias selekcji podzbiorów funkcji dla uczenia się klasyfikacji”, kontynuacja ICML '06 Materiały z 23. międzynarodowej konferencji nt. Uczenia maszynowego, s. 849-856
Jako dodatek do zamieszczonych tutaj odpowiedzi mam dwa linki, które naprawdę pomogły mi zrozumieć, dlaczego nie jest to dobra procedura:
http://nbviewer.jupyter.org/github/cs109/content/blob/master/lec_10_cross_val.ipynb
https://www.youtube.com/watch?v=S06JpVoNaA0
Edycja: zgodnie z prośbą, krótkie wyjaśnienie zawartości linków:
Załóżmy, że trenuję klasyfikatora i mam zestaw danych zawierający 1000 próbek, z których każdy ma milion funkcji. Nie mogę przetworzyć ich wszystkich, więc potrzebuję mniej funkcji (powiedzmy, że mogę obliczyć 300 funkcji). Posiadam również zestaw testowy 100 próbek, aby dokładnie oszacować moją dokładność poza rzeczywistością.
Jeśli odfiltruję mój milion funkcji do 300, wybierając te, które mają najwyższą korelację z celami całego zbioru danych, popełniam błąd (ponieważ wprowadzam nadmierne dopasowanie, którego później nie może wykryć Cross Validation). Mój trzymany zestaw pokaże to, wyrzucając złą wartość dokładności.
Zgodnie z powyższymi linkami poprawnym sposobem jest podzielenie mojego zestawu danych na zestaw treningowy i zestaw Cross-Validation, a następnie dostrojenie mojego modelu (filtrowanie funkcji itp.) Na podstawie tego zestawu treningowego i powiązanej z nim oceny CV. Jeśli używam K-foldów, muszę nastroić od zera za każdym razem, gdy wykonuję split / fold, a następnie uśredniam wyniki.
Programowo wykonujesz następujące czynności:
Bardzo ważne jest, aby wykonać inżynierię funkcji w pętli, na zestawie przedtreningowym Ti, a nie na pełnym zestawie treningowym T1.
Powodem tego jest to, że kiedy montujesz / wyposażasz inżyniera w Ti, testujesz CVi, czego nie widać w tym modelu. Natomiast jeśli dopasujesz / będziesz inżynierem funkcji na T1, każde wybrane przez Ciebie CV musi być podzbiorem T1, więc będziesz optymistycznie nastawiony, tj. Będziesz się przestawiał, ponieważ trenujesz i testujesz na tych samych próbkach danych.
Naprawdę dobrą odpowiedzią StackExchange jest ta , która naprawdę wyjaśnia ją bardziej szczegółowo i na przykładzie kodu. Zobacz to również jako uzupełnienie.
źródło
Pasek startowy „optymizm” Efron-Gong jest do tego bardzo dobry. Chodzi o wykorzystanie wszystkich dostępnych danych do opracowania modelu predykcyjnego i wykorzystanie wszystkich danych do oszacowania prawdopodobnej przyszłej wydajności tego samego modelu. A twoja próbka jest za mała 100 razy, aby można było zastosować jakiekolwiek podejście podzielonej próby.
źródło