Как представить повторяющиеся шаблоны в данных - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть домашнее задание, которое использует MCTS (http://mcts.ai/code/python.html), чтобы сыграть столько игр в крестики-нолики, сколько требуется, используя MCTS. Цель задания - обучить классификатор дерева решений, который может предсказать, чтоЛучшее действие - предпринять в зависимости от текущего состояния игры и игрока, играющего в игру. Данные отмечают как 1,0, 2,0 или 0, в зависимости от того, какой игрок отметил свою выбранную позицию в сетке крестики-нолики (0 для игроков нет).До сих пор мне удалось сохранить в CSV данные в следующем формате:

Безымянный: 0 игрок 0 1 2 ... 6 7 8 best_move выиграл

0 0 1.0 0.0 0.0 0.0... 0,0 0,0 0,0 4 0

Мой первый и главный вопрос: как я могу сделать классификатор дерева решений, используя scikit-learn, который включает все равные состояния, то есть корень должен иметь девять решений, доступных первому игроку,затем восемь для второго игрока и т. д., чередующиеся между игроками (1,0 для игрока 1, 2,0 для игрока 2). Второй и взаимосвязанный вопрос: как я могу повторитьотправляйте повторяющиеся данные с интервалом 0-8 (9) снова и снова, чтобы после считывания 9-го интервала он снова начинался с корня в следующей игре.Конечно, было бы предпочтительнее сгруппировать подсостояния, которые одинаковы для игрока 1 или игрока 2.

здесь - это представление в формате pdf дерева, сгенерированного моим кодом.Ниже приведен код, который я использую для обучения дерева решений.

def visualise_tree(trained_tree):
    dot_data = tree.export_graphviz(trained_tree,out_file=None)
    graph = graphviz.Source(dot_data)
    graph.render("oxo")

def trainTree(read_csv):
    clf = tree.DecisionTreeClassifier()
    slice_training_data = read_csv[["player","0", "1", "2", "3", "4", "5", "6", "7", "8"]]
    slice_prediction_data = read_csv[["best_move"]]
    clf.fit(slice_training_data,slice_prediction_data)
    visualise_tree(clf)
    print(read_csv)

if __name__ == "__main__":
    """ Play a single game to the end using UCT for both players. 
    """
    #df = pd.DataFrame(columns=["player", "0", "1", "2", "3", "4", "5", "6", "7", "8", "best_move","won"])
    #for i in range(1):
    #    df = UCTPlayGame(df)
    read_csv = pd.read_csv('10000games.csv')
    trainTree(read_csv)
    #df = df[["player", "0", "1", "2", "3", "4", "5", "6", "7", "8", "best_move","won"]]
    #print(df)
    #df.to_csv('10000games.csv')

Вот формат данных:

   ,player,0,1,2,3,4,5,6,7,8,best_move,won
0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,4,0
1,2.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0,0
2,1.0,2.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,0
3,2.0,2.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,7,0
4,1.0,2.0,1.0,0.0,0.0,1.0,0.0,0.0,2.0,0.0,3,0
5,2.0,2.0,1.0,0.0,1.0,1.0,0.0,0.0,2.0,0.0,5,0
6,1.0,2.0,1.0,0.0,1.0,1.0,2.0,0.0,2.0,0.0,2,0
7,2.0,2.0,1.0,1.0,1.0,1.0,2.0,0.0,2.0,0.0,6,0
8,1.0,2.0,1.0,1.0,1.0,1.0,2.0,2.0,2.0,0.0,8,0
0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0

, как вы видите, сделано 9 ходов, а затемнабор данных повторяется для новой игры (начиная с 0).Данные цикличны между 1,0 и 2,0 для каждого игрока, поскольку каждый игрок по очереди перемещается.Я дополнительно к требованиям добавил столбец выигрышей для набора ходов, которые выигрывают игру (но не знал, как это использовать, поэтому я не включил его в данные прогноза).В идеале дерево решений должно объединять все начальные состояния игры, как описано, и предсказывать, каким должен быть лучший ход.

...