Нужно закодировать входные данные вектора.
Возраст можно нормализовать в промежутке лет 20..100 (ну или меньше). То есть 100 лет это число 1.0 , а 20 лет - это 0.0. Все что между - доля от максимума, учитывая нижний порог. Кстати, любой возраст выше максимума для простоты можно принимать за максимум. Аналогично и для минимума.
Пол кодируется просто: 0 (М) или 1 (Ж)
Язык кодируется исходя из набора языков. Если в самом простейшем случае из лишь 2, тогда аналогично кодированию пола. Если больше 2-х, то в целях расширения набора языков имеет смысл кодировать вектором.
Допустим, есть набор языков Rus, Eng, Jap, тогда язык Jap кодируется как вектор (0, 0, 1), где важен порядок языков.
Таким образом, для [50, Ж, ru]
Возраст: (50-20)/(100-20)=0.375
Пол: 1
Язык: (1, 0, 0)
Выстраиваем данные по порядку в итоговый входной вектор: (0.375, 1, 1, 0, 0).
Каждому словесному описанию результата по градации от плохо до отлично давать оценку от 0 до 1 (в процентах).
Таким образом, для каждого входного вектора получаем результат оценки градации.
Если данные не противоречивы, то обучая на множестве репрезентативных данных (80%), в конце можно проверить верность обученной модели на тестировании оставшихся 20% данных.
Помимо машинного обучения есть еще статистические модели, таблицы решений, деревья решений и много других интересных способов решения задачи. Полагаю, в банках при выдаче ссуды и подсчет рисков в страховых компаниях делается не только машинным обучением, поскольку оно может оказаться верным лишь для определенного набора данных.