Closed zitkovalenka closed 1 year ago
Připojuji - odevzdávám včetně KNN. Hodnoty accuracy mi vyšly ale jinak. Zkoušela jsem také najít optimální počet sousedů, ale nepodařilo se mi to. Něco mi tam nefunguje správně. Prosím o radu.
Děkuji,
Ahoj Lenko, konečně mám čas se na úkol podívat. Dobrá práce - postupům a použití metod není co vytknout, takže úkol píšu jako splněný. A teď ke kódu a praktickým záležitostem:
y_pred = clf2.predict(X_test)
namísto y_pred = clf.predict(X_test)
a to stejné i ve for cyklu. Po opravě už vychází očekávaná accuracy a zobrazí se graf. Za to můžu já, protože jsem zavedl tyhle zmatky s přidáním čísla do názvu :D. Ale bylo to v zájmu nemíchání obsahu proměnných z různých částí kódu.plt.plot(ks, accuracy_score)
má být plt.plot(ks, accuracy_scores)
... A X.get_feature_names_out()
, protože v X
se na onom místě už nachází numpy array, která žádné názvy sloupců nemá.X_train
, atd.). Ještě mikro poznámka ke gitu... a dost možná to víš, tak jen nosím dříví do lesa: Vylepšenou verzi úkolu by šlo klidně nahrát pod původním názvem, tzn. commitnout jeho aktualizovanou verzi. V gitu se u každého souboru dostaneš ke všem jeho předchozím verzím (a vidíš i zvýrazněné rozdíly mezi nimi), takže není potřeba nové verze nahrávat jako nový soubor.
Kdyby něco, klidně zase piš :-).
V zadání je ještě poslední bod Nyní uvažuj, že se rozhodneš testovat jedince pomocí jednoho ze cviků., tak můžeš případně doplnit. Ale na splněnosti úkolu to nic nemění.
Ahoj Martine,
ano, vždy posílám původní soubor, který je jen upravený, jen jsem to minule potřebovala udělat jinak :-) . Ještě jsem tam něco málo poupravila v grafu i dle tvých komentářů a samozřejmě jsem chtěla ještě dojít k poslednímu bodu úkolu, tak tak činím :-) .
KNN clf - já chtěla záměrně používat také očíslování klasifikátorů a proměnných. Člověk se v tom lépe orientuje a vyzkouší si, jestli tomu rozumí správně. Špatně použitého clf jsem si bohužel nevšimla - opraveno.
Píšeš:
"Scaling a one-hot-encoding v části s KNN hned v první buňce je myslím zbytečný, protože dál stejně používáš proměnné vytvořené v první části úkolu (X_train, atd.)."
Je tam část:
X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) X_train
Ta nepřevezme znormalizované hodnoty? Beru to tak, že Rozhodovací strom nepotřebuje znormalizovat hodnoty, ale KNN nebo SVM ano.
U KNN jsem zkoušela standardní predikci pomocí KNN (clf_2
), predikci a nalezení optimálního počtu sousedů pomocí cyklu (clf2b
) a pomocí GridSearchCV (clf_3
).
Proč vychází jiné hodnoty pomocí standardní predikce KNN a pomocí nalezení optimálního počtu sousedů? Očekávala bych, že KNN bude mít stejný výsledek, protože si to najde sama. Nebo kde uvádím, jaký počet sousedů má použít? Jak poznám, co ta první KNN vlastně použila za počet sousedů? Příp. jak jí to konkrétně nadefinuji? V tomto jsem se při úkolu trochu ztratila a najednou tomuto rozdílu nerozumím, co vlastně to první KNN použije?
v části kódu optimálního počtu sousedů KNN (clf2b
) nevím, jaký počet sousedů algoritmus vybral? Jen vidím graf, ze kterého to není úplně patrné a vypočtenou accuracy s tím nejlepším počtem sousedů. Ale jaký ten počet je?
Znám nyní nejlepší model pro predikci fyzické výkonnosti při náboru (61% accuracy, model SVM OVO, RBF) se potřebou změřit alespoň sed a předklon v cm. Ale co s tím dál? :-) Pak bychom při náboru získali další soubor a prohnali to tímto modelem? Stejným způsobem nebo se to pak dělá jinak? Stačí co nejjednodušeji a teoreticky, pokud to není příliš komplikované :-) .
Zkoušela jsem i ostatní fyzické proměnné, ale "sed a předklon" má nejvyšší accuracy.
Děkuji, Lenka
Lenko,
doplněná poslední část vypadá dobře. K Tvým otázkám:
ad 3. Máš pravdu, pro strom není scaling potřeba a pro KNN ideálně ano. Myslel jsem to tak, že v KNN části si nejdřív připravíš X = numpy.concatenate([encoded_columns, numeric_data], axis=1), ale o dvě buňky níž místo tohoto X
použiješ X_train
(X_train = scaler.fit_transform(X_train)
), které pochází z předchozí části příkladu. Pokud dobře koukám, tak X
už nikde není využité a tím pádem je tam zbytečně.
ad 5. Model clf_2 = KNeighborsClassifier()
se tu vytvoří bez definovaného argumentu n_neighbors
, což zafunguje tak, že metoda použije výchozí hodnotu n_neighbors=5
, jak se píše ve scikit dokumentaci. Bere tedy napevno 5 sousedů a nic dalšího neřeší. Ručně pomocí cyklu s clf2b
a automatizovaně přes grid search s clf_3
vyšly accuracy a optima jinak asi kvůli cross validaci (CV) - ručně v cyklu bereme výsledek "na první dobrou", zatímco metoda s CV si data nascaluje, náhodně přeskládá a model nafituje několikrát.
ad 6. Algoritmus sám žádný počet sousedů nevybral - princip je, že "ručně" ve for cyklu připravíš klasifikátor a spočítáš accuracy pro předdefinované počty sousedů, pak si to zobrazíš v grafu a podle něj sama vybereš optimální počet. Když chceš pak klasifikátor s tímhle vybraným počtem sousedů (třeba 15) použít, připravíš si ho prostě zase ručně pomocí KNeighborsClassifier(n_neighbors=15)
.
ad 7. Nevím, jaké jsou plány Korejské sportovní asociace:), ale představuju si to následovně: Připravíš optimální model a třeba ho převedeš do nějaké použitelnější formy (aplikace, webová stránka, apod.). Lidi z asociace pak udělají přijímačky, zadají výsledky kandidátů do aplikace a model jim ukáže jejich výkonnostní třídu místo toho, aby to nějak měřili nebo to určovali lidští experti. Tím se určitě ušetří hromada peněz a času:). V téhle fázi už se model nijak netrénuje - jen vezme data na vstupu (třeba jen od jednoho člověka) a klasifikuje je do výkonnostní třídy jakožto výstup. Neboli neprovádí se fit()
a ostatní části, ale už jen predict()
.
Achjo, to je zas román :D. Snad je to srozumitelné - kdyby ne, klidně piš.
Ahoj Martine,
nene, žádný román. Takhle je to naprosto v pořádku a jsem za to ráda :-) .
ad 3. Poslala jsem ti změnu v kódu, zejména u využití X (znormalizovaných dat) a nějak mi to nefunguje dál:
Změněno takto:
Trénování modelu (fit) X_train = scaler.fit_transform(X) X_test = scaler.transform(X) X_train
Další část ódu jsem nechala stejný s 5 sousedy KNN. Kde všude musím změnit na X? Já měla za to, že když tomu nadefinuji, že trénování modelu podle X se má nahrát do "X_train" a "X_test", že zbytek bude fungovat v pořádku. Nebo je problém v y_train? clf_2.fit(X_train, y_train)
Moc děkuji za radu. Já si totiž myslím, že by to mělo fungovat už takto :-D
ad.6 Doplnila jsem tuto část kódu, abych si vypočítala model, accuracy a confusion matrix. Patrně bude fungovat až jakmile mi bude fungovat bod 3 :-).
`Dle grafu nejlepší metriky accuracy dosahuje při 15 sousedech. clf_2b = KNeighborsClassifier(n_neighbors = 15) # metoda vezme 15 sousedů, které jsem mu nadefinovala dle grafu
Natrénování na trénovacích datech clf_2b.fit(X_train, y_train)
Predikce z testovacích dat y_pred = clf_2b.predict(X_test) # vytvoření nového bodu uprostřed (na obrázku z lekce je ten čtverečkovaný)
Zobrazení Confusion matrix KNN ConfusionMatrixDisplay.from_estimator(clf_2, X_test, y_test, displaylabels=clf.classes) `
Děkuji.
Ahoj Lenko,
ad ad 3. Ta chyba při volání clf_2.fit(X_train, y_train)
je způsobená nestejnými rozměry X_train
a y_train
, vypadají takto:
Problém vzniká tím, že pomocí X_train = scaler.fit_transform(X)
(jak jsi změnila) se do X_train
nascalují všechny řádky z X
(13393), zatímco v y_train zůstává z předchozího kroku jen trénovací sada dat vzniklá rozdělením pomocí train_test_split()
někdy předtím, tedy 70 % všech dat, neboli oněch 9375 řádků. Je tedy potřeba po scalingu ještě zavolat train_test_split()
, ať se data zase rozdělí na 70 % trénovacích a 30 % testovacích do "train" a "test" proměnných. Možná jsem předchozím komentářem vyvolal nějaké zmatení, ale každopádně takhle by to mělo jít opravit:).
ad ad 6. Po opravě už všechno funguje.
Mimochodem, kdyby ses chtěla ve strojovém učení posouvat dál, můžeš prozkoumat (hluboké) neuronové sítě. To už je pravá magie, jelikož v základu na úrovni jednoho "neuronu" je sice stále jednoduché matematické rozhodování, ale po pospojování neuronů do sítě o mnoha vrstvách a natrénování už prakticky nejde zjistit, co přesně se uvnitř děje a proč a jak to (ne)funguje:). Někde jsem četl pěkné přirovnání sítí k lidské intuici - máš pocit, že něco nějak je, ale nedokážeš říct proč... v porovnání třeba s matematickým příkladem nebo programováním, kdy jsi schopná výsledek vysvětlit jednotlivými kroky.
Ahoj Martine,
ad 3) díky za opravu. Intuice nezklamala, že bude problém v y_pred
(přesně proto, že s touto proměnnou jsem nic nedělala, kdežto s ostatními ano), ale netušila jsem v čem a proč. Znamená to tedy, že vždy musí jít o stejný počet řádků? A jak to, že je vlastně ten počet řádků stejný, když data rozděluji na 70% a 30% :-))) . Se v tom nějak zamotávám...
7) Jinak je mi jasné, že u poslední části, kde řeším model s 1 fyzickou proměnnou modelu KNN nemusím znovu data normalizovat a rozdělovat, protože je už mám takto upravená z předchozích kroků, ale dala jsem to sem spíš pro úplnost, že za jiných okolností bych toto provést musela. Nebo vlastně asi musím provést znovu, protože mám v datech o sloupec navíc (ten sed leh). Je to tak?
8) Buňka 478 metoda SVM.
Predikce z testovacích dat
y_pred = clf_4.predict(X_test)
# vytvoření nového bodu uprostřed (na obrázku z lekce je ten čtverečkovaný)
Proč se zdá, že není potřeba tento krok? y_pred = clf_4.predict(X_test)
, když ho vynechám čísla zůstanou stejná.
Ohledně strojového učení - určitě to je zajímavé si takhle "hrát". Ale je už to vyšší dívčí a těžko říct, jestli by mi to šlo. Si vezmi, kolik otázek na tebe mám :-D .
Ohledně intuice - asi bych ji měla používat/poslouchat častěji. Byla jsem se podívat v Brně do té Anthology firmy. Měli tam soutěž, jak jsme dávali pozor a jestli jsme v průběhu neusly. Otázky byly kladeny průběžně vždy po nějakém celku a často byla odpověď jen řečena, ne promítána. U 2 otázek jsem ani nevěděla, že to bylo zmíněno a u jedné jsem si (až jsem měla odpověď napsanou) vzpomněla, že toto téma tam opravdu padlo a patrně skutečně řekli toto číslo. Ale až jsem měla odpověď zaznamenanou. Do té doby jsem si ani nevzpomněla, že to padlo. Původně jsem měla v plánu se mrknout k sousedce :-D. Ale pak jsem si řekla, že nene, vůbec o nic nejde a napíšu si odpovědi pěkně podle sebe s vidinou 60-70% správných odpovědí. A měla jsem je všechny správně. Jsem vůbec nečekala... Tak se zdá, že vím víc než si myslím, že vím :-). Byly jsme nakonec 4 s plným počtem a moje sousedka to nebyla :-) ,
Děkuji, přeji pěkný den a snad už je to poslední vstup :-)
Ahoj Lenko,
pěkný příběh z Anthology:). Mít takovou schopnost si automaticky ukládat informace se hodí... akorát je nevýhoda, že pak asi nejdou z podvědomí vytáhnout jinak než testem :D.
K rozdělení dat: Stejný počet řádků musí být, jelikož ke každému řádku vstupu (třeba naměřené parametry vína) musí existovat odpovídající řádek výstupu (označení kategorie vína). A tohle platí i po rozdělení dat pomocí X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
, jelikož poměr 70:30 máme mezi trénovací (X_train
a y_train
) a testovací (X_test
a y_test
) sadou. Při datasetu o 100 řádcích budou počty řádků následující:
X_train
: 70y_train
: 70X_test
: 30y_test
: 30
... nejde tady o nic víc, než rozdělení dat na dvě hromádky, abychom klasifikátor netrénovali a zároveň netestovali na stejných datech. Pak by model sice skvěle zmákl klasifikovat tenhle jeden dataset, ale nevěděli bychom, jak funguje s jinými daty.ad 7. Ano, po přidání cviku je potřeba znova normalizovat, aby se normalizoval i ten nový cvikový sloupec.
ad 8. Jestli myslíš čísla v matici záměn, tak je to tím, že funkce k vytvoření matice nepoužívá proměnnou y_pred
, ale spočítá si predikce sama ze vstupních parametrů. Neboli výsledek clf_4.predict(X_test)
se uloží do y_pred
, ale to se už pak nikde nepoužívá. Vlastně je to celkem vtipné zjištění, že y_pred
pořád dokola ze zvyku počítáme, ale pak ho k ničemu nepotřebujeme :D. Nicméně bývá potřeba k výpočtu accuracy a dalších metrik, takže smysl to dává.
Pěkný den :-)
https://github.com/zitkovalenka/Python2-042023/blob/main/UKOL_05-reseni-Fyzicka_kondice.ipynb
Ahoj Martine,
prosím o shlédnutí první části úkolu a to je rozhodovací strom včetně metriky accuracy a matice zámen (Confusion Matrix). Jestli jsem úkol pochopila správně, budu pokračovat v KNN nebo Vectory a modelem s jedním ze cviků.
Ráda bych, pokud by ses na to podíval takto postupně, abych věděla, že první část mám správně :-).
Moc děkuji, Lenka