{"id":2483,"date":"2026-06-24T08:00:00","date_gmt":"2026-06-24T07:00:00","guid":{"rendered":"https:\/\/olgamironczuk.pl\/?p=2483"},"modified":"2026-06-29T14:53:05","modified_gmt":"2026-06-29T13:53:05","slug":"chess-style-classifier-czy-algorytm-rozpozna-mistrza-po-stylu-gry","status":"publish","type":"post","link":"https:\/\/olgamironczuk.pl\/en\/chess-style-classifier-czy-algorytm-rozpozna-mistrza-po-stylu-gry\/","title":{"rendered":"Chess Style Classifier &#8211; czy algorytm rozpozna mistrza po stylu gry?"},"content":{"rendered":"<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"426\" height=\"240\" src=\"https:\/\/olgamironczuk.pl\/wp-content\/uploads\/2026\/05\/0523.gif\" alt=\"\" class=\"wp-image-2488\"\/><\/figure>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Project:<\/strong>Chess Style Classifier &#8211; czy algorytm rozpozna mistrza po stylu gry?<br><strong>Tools:&nbsp;<\/strong>Python, scikit-learn, Stockfish, python-chess, Supabase (PostgreSQL), GitHub Actions, GitHub Pages, JavaScript (chessboard.js, Chart.js)<br><strong>Description:&nbsp;<\/strong>Projekt ML sprawdzaj\u0105cy, czy algorytm potrafi rozpozna\u0107 arcymistrza po stylu gry. Model analizuje partie z Chess.com przy u\u017cyciu Stockfisha i wyznacza prawdopodobie\u0144stwo przynale\u017cno\u015bci ka\u017cdego ruchu do konkretnego gracza.<br><strong>Objective:<\/strong>&nbsp;Klasyfikacja stylu gry przy u\u017cyciu uczenia maszynowego<strong><br>Data:&nbsp;<\/strong>Chess.com API &#8211; partie Magnus Carlsen i Hikaru Nakamura<br><strong>Repository:<\/strong> <img decoding=\"async\" style=\"width:26px; height:auto; vertical-align:middle; position:relative; top:0px; margin:0 6px 0 6px;\" src=\"http:\/\/olgamironczuk.pl\/wp-content\/uploads\/2026\/01\/github-mark.png\" alt=\"GitHub\"> <a href=\"https:\/\/github.com\/Waderlla\/Chess_Fingerprint\" data-type=\"link\" data-id=\"https:\/\/github.com\/Waderlla\/Warkan_-_Cost-Aware_AI_Assistant_for_Blog_Search\" target=\"_blank\" rel=\"noreferrer noopener\">See on GitHub<\/a><\/p>\n<\/div>\n<\/div>\n\n\n\n<!--more Czytaj wi\u0119cej-->\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:15px\">Interesowa\u0142o mnie, czy styl gry szachowej da si\u0119 zmierzy\u0107 &#8211; nie intuicyjnie, ale liczbowo. Magnus Carlsen i Hikaru Nakamura to gracze o bardzo r\u00f3\u017cnych podej\u015bciach do partii: jeden znany z pozycyjnej precyzji, drugi ze spektakularnego stylu i agresywnego tempa. Pytanie brzmia\u0142o: czy Random Forest wytrenowany na ich partiach b\u0119dzie w stanie to uchwyci\u0107?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Data<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Partie pobieram automatycznie z publicznego API Chess.com &#8211; miesi\u0119czne archiwa dla obu graczy. Ka\u017cda partia to PGN (Portable Game Notation), z kt\u00f3rego wyci\u0105ga\u0142am cechy opisuj\u0105ce zachowanie gracza: d\u0142ugo\u015b\u0107 partii, liczb\u0119 bi\u0107 i szach\u00f3w, typ roszady, kategori\u0119 czasow\u0105 (bullet \/ blitz \/ rapid), kod otwarcia ECO.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dane trafiaj\u0105 do bazy Supabase (PostgreSQL) i s\u0105 od\u015bwie\u017cane automatycznie co tydzie\u0144 przez GitHub Actions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Process<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:16px\"><strong>1) <strong>Cechy heurystyczne (52% dok\u0142adno\u015bci)<\/strong><\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pierwsza wersja klasyfikatora pracowa\u0142a wy\u0142\u0105cznie na cechach wyci\u0105gni\u0119tych z PGN. Wynik 52% to niemal rzut monet\u0105 model nie mia\u0142 czym si\u0119 r\u00f3\u017cnicowa\u0107.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:16px\"><strong>2) <strong>Analiza silnikiem szachowym<\/strong><\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li style=\"font-size:15px\">Kluczow\u0105 decyzj\u0105 by\u0142o dodanie analizy Stockfishem. Dla ka\u017cdej partii i ka\u017cdego ruchu gracza silnik oblicza:<\/li>\n\n\n\n<li>ACPL (Average Centipawn Loss) &#8211; miara precyzji<\/li>\n\n\n\n<li>odsetek najlepszych ruch\u00f3w (best move rate)<\/li>\n\n\n\n<li>wska\u017aniki niedok\u0142adno\u015bci, b\u0142\u0119d\u00f3w i powa\u017cnych b\u0142\u0119d\u00f3w<\/li>\n\n\n\n<li>wska\u017anik ofiar &#8211; ruch, kt\u00f3ry oddaje materia\u0142, ale jest oceniany przez silnik jako dobry<\/li>\n\n\n\n<li style=\"font-size:15px\">Te cechy s\u0105 z natury znacznie bardziej informacyjne ni\u017c sama struktura parti<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3) K<strong><strong>lasyfikator<\/strong><\/strong><\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li style=\"font-size:15px\">Random Forest na 21 cechach. Dok\u0142adno\u015b\u0107 wzros\u0142a do ~70%. Model trenuje si\u0119 na nowo przy ka\u017cdym cotygodniowym uruchomieniu workflowu.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4) <strong>Prawdopodobie\u0144stwa ruch po ruchu<\/strong><\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li style=\"font-size:15px\">Zamiast klasyfikowa\u0107 ca\u0142\u0105 parti\u0119, klasyfikuj\u0119 ka\u017cdy ruch z narastaj\u0105cymi statystykami. Wynik to sekwencja prawdopodobie\u0144stw zapisana jako JSONB w bazie &#8211; jeden wiersz na parti\u0119 zamiast jednego wiersza na ruch.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Results<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Frontend pokazuje:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>karty statystyk obu graczy<\/li>\n\n\n\n<li>wykres radarowy por\u00f3wnuj\u0105cy style<\/li>\n\n\n\n<li>odtwarzacz partii z szachownic\u0105<\/li>\n\n\n\n<li>animowany pasek prawdopodobie\u0144stwa zmieniaj\u0105cy si\u0119 z ka\u017cdym ruchem<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Strona \u0142aduje dane bezpo\u015brednio z Supabase przez klienta JS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wyzwania<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li style=\"font-size:15px\">Najwi\u0119kszym wyzwaniem nie by\u0142a budowa modelu, tylko zarz\u0105dzanie czasem analizy silnikiem. Stockfish analizuje pozycj\u0119 przed i po ka\u017cdym ruchu \u2014 dla 1000 partii to kilkadziesi\u0105t minut pracy. Rozwi\u0105zaniem by\u0142o obliczanie inkrementalne: ka\u017cdy nowy tydzie\u0144 analizuje tylko nowe partie.<\/li>\n\n\n\n<li style=\"font-size:15px\">Drugi problem to rozmiar bazy (plan darmowy Supabase ma limit 500 MB) \u2014 rozwi\u0105zany przez limitowanie liczby przechowywanych partii na gracza i usuwanie najstarszych przy przekroczeniu progu.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Strona \u0142aduje dane bezpo\u015brednio z Supabase przez klienta JS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Refleksja<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li style=\"font-size:15px\">70% dok\u0142adno\u015bci przy dw\u00f3ch graczach to wynik skromny, ale uczciwy &#8211; model naprawd\u0119 si\u0119 uczy, nie zapami\u0119tuje. Gdyby doda\u0107 wi\u0119cej graczy o wyra\u017anie r\u00f3\u017cnych stylach, klasyfikacja prawdopodobnie by si\u0119 poprawi\u0142a. Na razie projekt odpowiada na pytanie, kt\u00f3re zada\u0142am: tak, styl gry da si\u0119 zmierzy\u0107. Przynajmniej cz\u0119\u015bciowo.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:63px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<iframe id=\"chess-frame\" src=\"https:\/\/waderlla.github.io\/Chess_Fingerprint\/embed.html\" width=\"100%\" frameborder=\"0\" scrolling=\"no\" style=\"border:none; display:block; overflow:hidden; min-height:1000px;\" loading=\"lazy\" title=\"Chess Fingerprint \u2014 Magnus vs Hikaru\">\n<\/iframe>\n<script>\nwindow.addEventListener('message', function(e) {\n  if (e.origin !== 'https:\/\/waderlla.github.io') return;\n  var f = document.getElementById('chess-frame');\n  if (f && e.data && e.data.iframeHeight) {\n    f.style.height = (e.data.iframeHeight + 40) + 'px';\n  }\n});\n<\/script>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"<p>Projekt:Chess Style Classifier &#8211; czy algorytm rozpozna mistrza po stylu gry?Narz\u0119dzia:&nbsp;Python, scikit-learn, Stockfish, python-chess, Supabase (PostgreSQL), GitHub Actions, GitHub Pages, JavaScript (chessboard.js, Chart.js)Opis:&nbsp;Projekt ML sprawdzaj\u0105cy, czy algorytm potrafi rozpozna\u0107 arcymistrza po stylu gry. Model analizuje partie z Chess.com przy u\u017cyciu Stockfisha i wyznacza prawdopodobie\u0144stwo przynale\u017cno\u015bci ka\u017cdego ruchu do konkretnego gracza.Cel:&nbsp;Klasyfikacja stylu gry przy u\u017cyciu uczenia&#8230;<\/p>","protected":false},"author":1,"featured_media":2488,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[38,37,21,17,36],"tags":[],"class_list":["post-2483","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-automatyzacja","category-machine-learning","category-projekty","category-python","category-sql"],"_links":{"self":[{"href":"https:\/\/olgamironczuk.pl\/en\/wp-json\/wp\/v2\/posts\/2483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/olgamironczuk.pl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/olgamironczuk.pl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/olgamironczuk.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/olgamironczuk.pl\/en\/wp-json\/wp\/v2\/comments?post=2483"}],"version-history":[{"count":4,"href":"https:\/\/olgamironczuk.pl\/en\/wp-json\/wp\/v2\/posts\/2483\/revisions"}],"predecessor-version":[{"id":2489,"href":"https:\/\/olgamironczuk.pl\/en\/wp-json\/wp\/v2\/posts\/2483\/revisions\/2489"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/olgamironczuk.pl\/en\/wp-json\/wp\/v2\/media\/2488"}],"wp:attachment":[{"href":"https:\/\/olgamironczuk.pl\/en\/wp-json\/wp\/v2\/media?parent=2483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/olgamironczuk.pl\/en\/wp-json\/wp\/v2\/categories?post=2483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/olgamironczuk.pl\/en\/wp-json\/wp\/v2\/tags?post=2483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}