Je participe au tournoi Human Wolf Intelligence en tant que passe-temps depuis plusieurs années, mais mes notes ne sont pas bonnes. Je pense qu'il est temps pour notre équipe de rompre avec la base de règles et de créer un agent de renseignement humain-loup qui utilise l'apprentissage automatique.
Comme première étape pour cela, je vais essayer de faire un classificateur pour juger s'il s'agit d'un loup humain ou non en extrayant la quantité de caractéristiques du journal de bataille passé en référence à "la programmation d'IA apprise par l'intelligence humaine du loup". Cependant, nous n'avons pas encore incorporé le modèle créé dans l'agent de renseignement humain loup.
Compte tenu de la facilité d'expérimentation, nous avons décidé d'utiliser le code Java (une modification mineure de l'exemple de code officiellement distribué) pour l'extraction de la quantité de fonctionnalités à partir des journaux de bataille passés, et scikit-learn pour l'apprentissage et l'estimation. fait. L'auteur de ce document n'est pas un expert en apprentissage automatique, je vous serais donc très reconnaissant de bien vouloir signaler des erreurs ou des malentendus.
Les sites et livres auxquels j'ai fait référence sont résumés à la fin de la phrase.
--Télécharger le journal des matchs --Étiquette du journal de bataille et extraire le montant de la fonctionnalité (code Java presque officiel) --Apprentissage et estimation du problème de classification binaire de savoir s'il s'agit ou non d'un loup humain (Scikit-learn de Python)
Téléchargez votre tournoi préféré à partir du "Journal des tournois passés" dans Information pour les développeurs de Human Wolf Intelligence Project. Cette fois, j'ai téléchargé CEDEC 2017. * Lorsque vous les utilisez comme données d'apprentissage, il est préférable d'utiliser les résultats de concours que les développeurs ont sérieusement réglés, plutôt que des concours à petite échelle. Décompressez ce journal.
find cedec2017/ -type f -name "*.log.gz" -exec gunzip -d {} \;
Lorsque vous décompressez le journal de combat, vous trouverez le répertoire numéroté et le fichier journal réel (* .log
) qu'il contient. Il y a 5 et 15 joueurs dans le tournoi Human Wolf Intelligence, mais dans chaque cas, 5 agents / 15 joueurs seront corrigés et 100 batailles auront lieu tout en changeant de position, donc les journaux dans chaque répertoire sont la combinaison des agents participants. Correspond aux mêmes 100 batailles. Cette fois, nous allons essayer l'apprentissage automatique en utilisant une partie de 100 batailles avec la même combinaison d'agents participant à la bataille à 15 joueurs que les données d'entraînement et le reste comme données de test.
Cette fois, pour essayer le machine learning avec de petites données, créez un répertoire appelé cedec2017_small
, copiez le répertoire de 004
dans cedec2017
et utilisez-le.
ls cedec2017_small/004
// 0300.log ... 0399.100 fichiers sont affichés jusqu'à la journalisation
LogdataToVector
officiel de l'intelligence humaine du loup était difficile à utiliser tel quel, il a donc été légèrement modifié.data /
doit être mkdir
.
--Pour l'étiquetage, -1 est un loup humain et 1 est un loup non humain.java -jar /{path_to_jar}/AIbook.jar book.LogdataToVector /{path_to_log}/cedec2017_small/ data/
--Combinez les 100 fichiers créés ci-dessus en un seul (peut ne pas être nécessaire)
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)
――Le fichier libSVM terminé ressemble à ceci
LogdataToVector
.$ 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
--Installez 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)
――J'ai ce résultat ―― Étant donné que les cas positifs et négatifs sont biaisés, il est difficile de savoir si le résultat de la précision 0,82 peut être reçu à sa valeur nominale. De plus, je craignais que le rappel lorsque l'agent était un loup humain soit extrêmement mauvais.
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