Ich nehme seit mehreren Jahren als Hobby am Human Wolf Intelligence Tournament teil, aber meine Noten sind nicht gut. Ich denke, es ist Zeit für unser Team, sich von der Regelbasis zu lösen und einen menschlichen Wolfs-Geheimdienstagenten zu schaffen, der maschinelles Lernen nutzt.
Als ersten Schritt werde ich versuchen, einen Klassifikator zu erstellen, um zu beurteilen, ob es sich um einen menschlichen Wolf handelt oder nicht, indem ich die Merkmalsmenge aus dem vergangenen Kampfprotokoll unter Bezugnahme auf "KI-Programmierung, die von der Intelligenz menschlicher Wölfe gelernt wurde" extrahiere. Wir haben das erstellte Modell jedoch noch nicht in den Geheimdienstagenten des menschlichen Wolfs integriert.
In Anbetracht der Leichtigkeit des Experimentierens haben wir uns entschieden, Java-Code (eine geringfügige Modifikation des offiziell verteilten Beispielcodes) für die Extraktion von Merkmalsmengen aus früheren Kampfprotokollen und Scikit-Learn zum Lernen und Schätzen zu verwenden. tat. Der Autor dieses Dokuments ist kein Experte für maschinelles Lernen, daher wäre ich Ihnen sehr dankbar, wenn Sie auf Fehler oder Missverständnisse hinweisen könnten.
Die Websites und Bücher, auf die ich mich bezog, sind am Ende des Satzes zusammengefasst.
Laden Sie Ihr Lieblingsturnier aus dem "Past Tournament Log" unter Informationen für Entwickler des Human Wolf Intelligence Project herunter. Diesmal habe ich CEDEC 2017 heruntergeladen. * Wenn Sie es als Lerndaten verwenden, sollten Sie lieber die Ergebnisse von Wettbewerben verwenden, die die Entwickler ernsthaft optimiert haben, als kleine Wettbewerbe. Entpacke dieses Protokoll.
find cedec2017/ -type f -name "*.log.gz" -exec gunzip -d {} \;
Wenn Sie das Kampfprotokoll entpacken, finden Sie das nummerierte Verzeichnis und die darin enthaltene tatsächliche Protokolldatei (* .log
). Das Human Wolf Intelligence-Turnier besteht aus 5 und 15 Spielern. In jedem Fall werden jedoch 5 Agenten / 15 Spieler repariert und 100 Schlachten ausgetragen, während ihre Positionen geändert werden. Die Protokolle in jedem Verzeichnis sind also die Kombination der teilnehmenden Agenten. Entspricht den gleichen 100 Schlachten. Dieses Mal werden wir versuchen, maschinelles Lernen unter Verwendung eines Teils von 100 Schlachten mit derselben Kombination von Agenten, die an der 15-Spieler-Schlacht teilnehmen, als Trainingsdaten und den Rest als Testdaten zu versuchen.
Um dieses Mal maschinelles Lernen mit kleinen Daten zu versuchen, erstellen Sie ein Verzeichnis mit dem Namen "cedec2017_small", kopieren Sie das Verzeichnis "004" in "cedec2017" und verwenden Sie es.
ls cedec2017_small/004
// 0300.log ... 0399.Bis zur Protokollierung werden 100 Dateien angezeigt
java -jar /{path_to_jar}/AIbook.jar book.LogdataToVector /{path_to_log}/cedec2017_small/ data/
import os
import subprocess
import sys
if __name__ == '__main__':
if len(sys.argv) != 3:
print('Usage: # python %s input_dir output_file' % argvs[0])
quit()
dir_name = sys.argv[1] # '/{path_to_data}/data/'
files = os.listdir(dir_name)
out_file = sys.argv[2] # '/{path_to_outfile}/new.log.txt'
os.system('rm ' + out_file)
for fin in files:
files_with_path = dir_name + fin
subprocess.call('cat ' + files_with_path + ' >> ' + out_file, shell=True)
――Die fertige libSVM-Datei sieht folgendermaßen aus ――Für die Bedeutung der einzelnen Funktionen ist es schnell, den Quellcode von "LogdataToVector" zu lesen.
$ head -5 mini.log.txt
1 1:0 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0 10:0 11:0
1 1:0 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0 10:0 11:0
1 1:0 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0 10:0 11:0
1 1:0 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0 10:0 11:0
-1 1:0 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0 10:0 11:0
--Installieren Sie scikit-learn
pip install numpy
pip install scipy
pip install -U scikit-learn
from sklearn.datasets import load_svmlight_file
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import classification_report, accuracy_score
x,y = load_svmlight_file('/{path_to_log}/new.log.txt')
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
clf = svm.SVC(cache_size = 2000)
clf.fit(x_train, y_train)
y_pred = clf.predict(x_test)
print accuracy_score(y_test, y_pred)
print classification_report(y_test, y_pred)
――Ich habe dieses Ergebnis erhalten ――Da die positiven und negativen Fälle voreingenommen sind, ist unklar, ob das Ergebnis der Genauigkeit 0,82 zum Nennwert empfangen werden kann. Ich war auch besorgt, dass der Rückruf, als der Agent ein menschlicher Wolf war, extrem schlecht war.
precision recall f1-score support
-1.0 0.74 0.20 0.31 626
1.0 0.84 0.98 0.90 2614
avg / total 0.82 0.83 0.79 3240
Recommended Posts