Bei dieser Herausforderung erhalten Sie eine begrenzte Menge an Informationen zu einer bestimmten Partie Schach und müssen vorhersagen, wer die Partie gewonnen hat .
Sie erhalten zwei Datensätze:
- Stückzahl (Welche Stücke leben noch)
- Brettfarben (Die Farbe der Stücke auf dem Brett)
Noch wichtiger ist, dass Sie nicht wissen, wo sich die Teile befinden . Sie müssen bestimmen, wer Ihrer Meinung nach gewinnen wird.
Die Spiele werden aus allen Events ausgewählt, die von 2010 bis jetzt auf PGNMentor gelistet sind . Ich habe 10% aller Brettpositionen aus jedem Spiel ausgewählt, das mit einem Gewinn oder einer Niederlage endet. Brettpositionen werden immer mindestens 30 Züge im Spiel sein. Die Testfälle finden Sie hier . (Weiße Gewinne werden zuerst aufgeführt, gefolgt von schwarzen Gewinnen)
Eingang
Die Stückzahl ist eine Zeichenfolge, die aus einem Zeichen für jedes Stück besteht: k
ing, q
ueen, r
ook, k n
ight, b
ishop oder awn p
. Kleinbuchstaben bedeuten schwarz, Großbuchstaben sind weiß. Die Tafel besteht aus einer Zeichenfolge von 64 Zeichen (8 Zeilen x 8 Spalten). B
repräsentiert ein schwarzes Stück, W
repräsentiert ein weißes Stück und .
repräsentiert eine leere Stelle. Probe:
W..WB......W.BB....W..B..W.WWBBB..W...B....W..BBWWW...BB.W....B.,BBKPPPPPPPQRRbbkpppppppqrr
würde das folgende Board vertreten
...B.BB.
.BBBBBBB
.B.B....
B..W....
WWWW.W..
....W.W.
...W..WW
W.....W.
und wo beide Farben 2 Bischöfe, 1 König, 7 Bauern, 1 Dame, 2 Türme haben
Ausgabe
Sie müssen eine Gleitkommazahl zwischen 0 und 1 (einschließlich) zurückgeben, um zu bestimmen, wie wahrscheinlich es ist, dass Weiß gewinnt. Probe:
0.3 (30% chance that white wins)
Mehr Details:
- Jeder Testfall ist 1 Punkt wert. Ihre Punktzahl ist,
1 - (1-Output)^2
wenn Weiß gewinnt oder1 - (Output)^2
wenn Schwarz gewinnt. - Ihre endgültige Punktzahl ist die Summe aller Testfälle.
- Wenn ich der Meinung bin, dass Einsendungen die Eingabe fest codieren, behalte ich mir das Recht vor, die Testfälle zu ändern. (Wenn ich sie ändere, haben sie den SHA-256-Hash
893be4425529f40bb9a0a7632f7a268a087ea00b0eb68293d6c599c6c671cdee
) - Ihr Programm muss Testfälle unabhängig ausführen. Keine Speicherung von Informationen von einem Testfall zum nächsten.
- Wenn Sie maschinelles Lernen verwenden, empfehle ich dringend, die ersten 80% der Daten zu trainieren und die restlichen 20% zu testen . (Oder welche Prozentsätze Sie verwenden). Ich benutze die Spiele mehrmals in den Daten, aber ich setze die gleichen Spiele nacheinander zusammen.
- UPDATE: Ich habe über eine Million Testfälle zu Test- und Lernzwecken hinzugefügt . Sie werden aufgrund der Größenbeschränkungen für Github-Repos in schwarze und weiße Teile aufgeteilt.
Viel Glück und hab Spaß!
quelle
Antworten:
Java 8 + Weka, 6413 Punkte, 94,5%
Diese Antwort verwendet einen maschinellen Lernansatz. Sie müssen die Weka- Bibliothek abrufen , insbesondere
weka.jar
undPackageManager.jar
.Hier verwende ich ein mehrschichtiges Perzeptron als Klassifikator; Sie können
mlp
mit jederClassifier
Klasse von Weka ersetzen , um die Ergebnisse zu vergleichen.Ich habe nicht viel an den Parametern des MLP herumgebastelt und sie einfach in Augenschein genommen (eine verborgene Schicht aus 50 Neuronen, 100 Epochen, 0,2 Lernrate, 0,1 Impuls).
Ich schwelle den Ausgabewert des MLP ein, so dass die Ausgabe tatsächlich entweder 1 oder 0 ist, wie in der Abfrage definiert. Auf diese Weise ist die Anzahl der korrekt klassifizierten Instanzen, wie sie von Weka gedruckt wurden, direkt unsere Punktzahl.
Feature-Vektorkonstruktion
Ich wandle jede Instanz von einem String in einen Vektor mit 76 Elementen um, wobei:
1
es sich um ein weißes Stück,-1
ein schwarzes Stück und0
eine leere Zelle handelt.0
"kein Teil dieses Typs"). Man könnte eine Normalisierung anwenden, um diese Werte zwischen -1 und 1 wiederherzustellen, aber dies ist hier wahrscheinlich nicht sehr hilfreich.Anzahl der Trainingsinstanzen
Wenn ich alle angegebenen Testfälle verwende, um meinen Klassifikator zu trainieren, habe ich es geschafft, 6694 (dh 98,6588%) korrekt klassifizierte Instanzen zu erhalten . Dies ist offensichtlich nicht verwunderlich, da das Testen eines Modells mit denselben Daten, die Sie zum Trainieren verwendet haben, viel zu einfach ist (da in diesem Fall das Modell eigentlich gut überpasst).
Unter Verwendung einer zufälligen Untermenge von 80% der Instanzen als Trainingsdaten erhalten wir die 6413 (dh 94,5173%) korrekt klassifizierte Instanzzahl , die im Header angegeben ist (da die Untermenge zufällig ist, erhalten Sie möglicherweise leicht abweichende Ergebnisse). Ich bin zuversichtlich, dass das Modell bei neuen Daten anständig gut funktionieren würde, da das Testen der verbleibenden 20% der Instanzen (die nicht für das Training verwendet wurden) eine korrekte Klassifizierung von 77,0818% ergibt Die hier angegebenen Beispiele sind repräsentativ für die neuen Testfälle, die wir erhalten würden.
Wenn die Hälfte der Instanzen für das Training und die andere Hälfte für das Testen verwendet wird, erhalten wir 86,7502% für die Trainings- und Testdaten und 74,4988% nur für die Testdaten.
Implementierung
Wie gesagt, dieser Code benötigt
weka.jar
undPackageManager.jar
von Weka.Mit können Sie den Prozentsatz der im Trainingssatz verwendeten Daten steuern
TRAIN_PERCENTAGE
.Die Parameter des MLP können direkt darunter geändert werden
TRAIN_PERCENTAGE
. Man kann andere Klassifikatoren von Weka ausprobieren (zBSMO
für SVMs), indem man sie einfach durch einenmlp
anderen Klassifikator ersetzt.Dieses Programm druckt in Ergebnissätzen, wobei sich der erste auf den gesamten Satz (einschließlich der für das Training verwendeten Daten) bezieht, bei dem es sich um die in dieser Challenge festgelegte Punktzahl handelt, und der zweite auf die Daten, die nicht für das Training verwendet wurden.
Man gibt die Daten ein, indem man den Pfad der Datei, die sie enthält, als Argument an das Programm übergibt.
quelle
GNU sed + bc,
43365074,5 Punkte,6475%Update: Das OP gab eine neue Möglichkeit, die Punktzahl der Vorhersage für einen einzelnen Testfall zu berechnen. Mit Wolfram Alpha habe ich beide Formelsätze gezeichnet, um die Unterschiede zu erkennen.
Der derzeitige Weg bietet einen starken Anreiz, tatsächliche Wahrscheinlichkeiten auszugeben, und nicht nur die Extreme 0 und 1, für die die neuen Formeln die gleiche maximale Punktzahl wie zuvor liefern. Dies ist der Grund, warum der unten stehende unveränderte Algorithmus jetzt eine bessere Vorhersagerate aufweist, in der Tat eine große Rate aufgrund seiner Einfachheit.
Mit den neuen Formeln ist jedoch auch ein Nachteil verbunden, wie in 'Edit 1' erläutert.
Dies ist eine einfache Schätzung, die nur auf dem Materialvorteil / -nachteil basiert und die tatsächliche Platzierung der Teile ignoriert. Ich war gespannt, wie sich das entwickeln wird. Der Grund, warum ich sed verwende und nicht irgendeine Sprache, die dies in einer Zeile kann, ist, dass es meine Lieblingsesoteriksprache ist.
Verwendete Standardstückwerte:
Ich berechne das Material für beide Seiten und subtrahiere das Material von Schwarz von dem von Weiß. Die Ausgabe für jeden Testfall basiert auf diesem Unterschied wie folgt:
Dies ist mein einziger Teil der Ausgabe, daher der Grund für die oben erläuterte Verbesserung.
Die Prognoserate für diese Methode betrug 64%. Jetzt sind es 75% mit den neuen Formeln.
Edit 1: der Nachteil
Die einfache Lösung besteht darin, für jeden Testfall 0,5 auszugeben, da Sie auf diese Weise einen halben Punkt erzielt haben, unabhängig davon, wer gewonnen hat. Für unsere Testfälle bedeutete dies eine Gesamtpunktzahl von 3392,5 Punkten (50%).
Aber mit den neuen Formeln wird 0,5 (was eine Ausgabe ist, die Sie geben würden, wenn Sie nicht wissen, wer gewinnt) in 0,75 Punkte umgewandelt. Denken Sie daran, dass die maximale Punktzahl, die Sie für einen Testfall erhalten können, 1 ist, um 100% Vertrauen in den Gewinner zu haben. Die neue Gesamtpunktzahl für eine konstante Ausgabe von 0,5 beträgt also 5088,75 Punkte oder 75%! Meiner Meinung nach ist der Anreiz für diesen Fall zu stark.
Diese Punktzahl ist, wenn auch geringfügig, besser als mein Algorithmus, der auf materiellen Vorteilen basiert. Der Grund dafür ist, dass der Algorithmus eine Wahrscheinlichkeit von 1 oder 0 (kein Anreiz), angenommene Gewinne oder Verluste, mehr Male (3831) als 0,5 (Anreiz), angenommene Unentschieden (2954) gibt. Die Methode ist letztendlich einfach und hat daher keinen hohen Prozentsatz an korrekten Antworten. Der Boost von der neuen Formel auf konstant 0,5 schafft es, diesen Prozentsatz künstlich zu erreichen.
Bearbeiten 2:
Es ist eine bekannte Tatsache, die in Schachbüchern erwähnt wird, dass es normalerweise besser ist, ein Läuferpaar als ein Ritterpaar zu haben. Dies gilt insbesondere für die mittlere bis letzte Phase des Spiels, in der die Testfälle vorliegen, da es wahrscheinlicher ist, dass eine Position offen ist, in der die Reichweite eines Bischofs erhöht wird.
Deshalb habe ich einen zweiten Test gemacht, aber dieses Mal habe ich den Wert der Bischöfe von 3 auf 3,5 geändert. Der Wert des Ritters blieb 3. Dies ist eine persönliche Präferenz, daher habe ich ihn nicht zu meiner Standard-Vorlage gemacht. Die Gesamtpunktzahl betrug in diesem Fall 4411 Punkte (65%). Es wurde nur ein Anstieg von 1 Prozentpunkt beobachtet.
Mit den neuen Formeln beträgt die Gesamtpunktzahl 4835 Punkte (71%). Jetzt schneidet der gewichtete Läufer schlechter ab. Der Effekt wird jedoch erklärt, da die gewichtete Methode jetzt noch mehr Male angenommene Gewinne oder Verluste liefert (5089) als angenommene Unentschieden (1696).
quelle
Python 3 - 84,6%, 5275 Punkte in einem Validierungssatz
Wenn wir alle Daten betrügen und verwenden, können wir eine Genauigkeit von 99,3% und eine Punktzahl von 6408 erzielen
Nur eine einfache große MLP mit Dropout mit Keras
quelle
Python 3 - 94,3% Genauigkeit, 6447 Punkte bei einem Validierungssatz von 20% der Daten
Verwendet 3 neuronale Netze, einen Regressor des nächsten Nachbarn, eine zufällige Gesamtstruktur und eine Gradientenverstärkung. Diese Vorhersagen werden mit einer zufälligen Gesamtstruktur kombiniert, die auch Zugriff auf die Daten hat.
quelle
Python 3 - 4353,25 / 6785 Punkte - 64%
Also habe ich gestern meistens daran gearbeitet. Mein erster Beitrag zum Golfen, und ich benutze Python erst seit ungefähr einer Woche. Verzeihen Sie mir, wenn nicht alles optimiert ist.
Ich endete auf dem gleichen Weg wie Seshoumaras Antwort. Aber die große Anzahl von Testfällen mit geraden Stückzahlen hat mich unzufrieden gemacht.
Also habe ich Eigenschaften gegoogelt, die bestimmen, wer im Schach gewinnt (ich spiele das Spiel nicht selbst), und festgestellt, dass die Brettposition, insbesondere die Zentralkontrolle, groß ist. Hier kommt dieses Bit ins Spiel.
Beide Hälften werden kombiniert, um die Punktzahl zu ermitteln (0,0, 0,25, 0,50, 0,75, 1,0).
Sehr interessant, dass diese zusätzliche Boardposition die Chance, den Gewinner zu erraten, nicht zu erhöhen scheint.
Wenn Sie die Testfälle in einige Dateien ablegen, finden Sie hier das Testen.
Ich weiß, dass dies keine Golfherausforderung ist, aber alle Tipps oder Ratschläge in dieser Hinsicht sind willkommen!
quelle