Недавно я наткнулся на следующее изображение, описывающее консольное приложение, которое пытается угадать животное, о котором думает пользователь, задавая ряд вопросов и обновляя задаваемые вопросы, если оно угадывает неправильно:
![algo](https://i.stack.imgur.com/Ao7gU.png)
Несмотря на то, что ничего не знал о машинном обучении, я подумал, что это довольно простая программа для репликации с использованием деревьев решений, поэтому я собрал код ниже python:
import json
json_file = open("DecisionTree1.json", "r")
decision_tree = json.loads(json_file.read())
partial_decision_tree = decision_tree["start"]
def get_user_input(prompt, validation):
if validation == "yes_no":
print(prompt)
while True:
answer = input()
if answer.lower() not in ('yes', 'no'):
print("Please enter 'Yes' or 'No'")
else:
return answer.lower()
elif validation == "not_empty":
while True:
answer = input(prompt + "\n")
if answer != "":
return answer.lower()
def create_new_node(guess):
correct_answer = get_user_input("What animal were you thinking of?", "not_empty")
new_question = get_user_input("Enter a question for which the answer is 'Yes' for " + correct_answer + " and 'No' for " + guess, "not_empty")
new_node = json.loads('{"question": "' + new_question + '","children":{"yes": {"question": "Is it a ' + correct_answer + '?","children": null},"no": {"question": "Is it a rabbit?","children": null}}}')
return json.dumps(new_node)
answer_array = list()
while partial_decision_tree["children"]:
answer = get_user_input(partial_decision_tree["question"], "yes_no")
answer_array.append(answer)
partial_decision_tree = partial_decision_tree["children"][answer]
if get_user_input(partial_decision_tree["question"], "yes_no") == "no":
select_conditions = '["start"]'
for answer in answer_array:
select_conditions += '["children"]["' + answer + '"]'
query = "decision_tree" + select_conditions + " = '" + create_new_node(partial_decision_tree["question"].split(" ")[-1][0:len(partial_decision_tree["question"].split(" ")[-1])-1]) + "'"
exec(query)
Файл JSON DecisionTree1. json содержит следующие данные, которые должны представлять (очень маленькое) дерево решений:
{
"start":
{
"question": "Is it smaller than a bicycle?",
"children":
{
"yes": {
"question": "Is it a rabbit?",
"children": null
},
"no": {
"question": "Is it an elephant?",
"children": null
}
}
}
}
Идея должна состоять в том, что если пользователь угадывает неправильно, то конечный узел, на который программа смотрит, когда она делает свое предположение, должен быть заменен новым внутренним узлом, который обеспечивает дополнительный уровень фильтрации при угадывании программ.
В терминах JSON, это означает:
- Замена атрибута «question» узла, содержащего t текущее предположение с вопросом, который пользователь указал
- Обновление атрибута "children" узла, чтобы вместо того, чтобы быть нулевым, содержало два новых узла, каждый из которых составляет предположение (то есть листовой узел)
У меня вопрос как я могу таким образом обновить JSON в файле?
В настоящее время переменная query
в моем python обновляет JSON, так что значение атрибута "children" становится string , а не двумя подчиненными узлами.
EDIT: После комментария Мартино, вот пример как должен выглядеть JSON после обновления:
Предположим, что пользователь думает о черепахе. Как бы то ни было, программа будет неправильно угадывать их животное, чтобы быть кроликом. Когда их просят «напечатать вопрос, для которого ответ« да »для черепахи и« нет »для кролика», они могут задать вопрос «Есть ли у него раковина?». Существующий JSON (как показано выше) должен затем стать
{
"start":
{
"question": "Is it smaller than a bicycle?",
"children":
{
"yes": {
"question": "Does it have a shell?",
"children":
{
"yes": {
"question": "Is it a tortoise?",
"children": null
},
"no": {
"question": "Is it a rabbit?",
"children": null
}
}
},
"no": {
"question": "Is it an elephant?",
"children": null
}
}
}
}