На этом шаге мы закончим изучение этого вопроса.
Наша цель - создать нейронную сеть для предсказания уровня владения Python (рейтинга Finxter), исходя из пяти входных признаков (ответов на вопросы):
Снова встанем на плечи гигантов и воспользуемся библиотекой scikit-learn (sklearn) для нейросетевой регрессии, как показано в примере 4.5.
## Зависимости from sklearn.neural_network import MLPRegressor import numpy as np ## Данные опросника (WEEK, YEARS, BOOKS, PROJECTS, EARN, RATING) X = np.array( [[20, 11, 20, 30, 4000, 3000], [12, 4, 0, 0, 1000, 1500], [2, 0, 1, 10, 0, 1400], [35, 5, 10, 70, 6000, 3800], [30, 1, 4, 65, 0, 3900], [35, 1, 0, 0, 0, 100], [15, 1, 2, 25, 0, 3700], [40, 3, -1, 60, 1000, 2000], [40, 1, 2, 95, 0, 1000], [10, 0, 0, 0, 0, 1400], [30, 1, 0, 50, 0, 1700], [1, 0, 0, 45, 0, 1762], [10, 32, 10, 5, 0, 2400], [5, 35, 4, 0, 13000, 3900], [8, 9, 40, 30, 1000, 2625], [1, 0, 1, 0, 0, 1900], [1, 30, 10, 0, 1000, 1900], [7, 16, 5, 0, 0, 3000]]) ## Однострочник neural_net = MLPRegressor(max_iter=10000).fit(X[:, :-1], X[:, -1]) ## Результат res = neural_net.predict([[0, 0, 0, 0, 0]])
Вычислить результаты этого кода человеку поистине невозможно, но не хотите ли попытаться?
В первых нескольких строках кода мы создаем набор данных. Входной формат алгоритмов машинного обучения в библиотеке scikit-learn одинаков. Строки соответствуют отдельным наблюдениям, состоящим из нескольких признаков. Чем больше строк, тем больше обучающих данных; чем больше столбцов, тем больше признаков в каждом наблюдении. В данном случае у нас пять входных и один выходной признак для каждого элемента обучающих данных.
Наш однострочник создает нейронную сеть с помощью конструктора класса MLPRegressor, в который передается max_iter=10000 в качестве аргумента, поскольку обучение не сходится при использовании количества итераций по умолчанию (max_iter=200).
После этого мы вызываем функцию fit() для определения параметров нейронной сети. После вызова fit() начальные значения нейронной сети успешно заданы. Функция fit() принимает в качестве параметров многомерный входной массив (по одному наблюдению в строке) и одномерный выходной массив (размер которого равен количеству наблюдений).
Осталось только вызвать функцию predict() с какими-нибудь входными значениями:
## Результат res = neural_net.predict([[0, 0, 0, 0, 0]]) print(res) # [932.19323177]
Учтите, что фактические результаты ее выполнения могут немного отличаться вследствие недетерминистичной природы самой функции и различного характера сходимости.
Говоря простым языком: если...
Поменяем параметры: что будет, если вы потратили 20 часов на изучение Python и вернулись к программе через неделю:
## Результат res = neural_net.predict([[20, 0, 0, 0, 0]]) print(res) # [796.17911087]
Как ни странно - ваш уровень владения Python снизился! Надо что-то делать! Никаких проблем. Купите десять книг по Python. Посмотрим, что произойдет с вашим рейтингом:
## Результат res = neural_net.predict([[20, 0, 10, 0, 0]]) print(res) # [2398.84948379]
Заметен существенный прогресс, ваш рейтинг увеличился! Но одна только покупка книг по Python не слишком помогает, нужно еще и изучить их! Потратим на это год:
## Результат res = neural_net.predict([[20, 1, 10, 0, 0]]) print(res) # [3079.90395806]
Рейтинг снова увеличился. Попробуете потратить 50% своего времени, посвященного Python, на работу в качестве Python-фрилансера с зарплатой 1000 долларов:
## Результат res = neural_net.predict([[20, 1, 10, 50, 1000]]) print(res) # [1931.33331447]
Ух ты! Внезапно нейронная сеть перестала считать вас экспертом по Python. Но, тем не менее, изучайте Python хотя бы год и решайте реальные задачи - и станете прекрасным программистом!
Резюмируя: вы изучили основы нейронных сетей и научились использовать их с помощью всего одной строки кода на Python. Полученные результаты означают лишь то, что нейронная сеть демонстрирует настолько хорошие результаты, насколько хороши ее обучающие данные. А данных у нас было очень немного, и нейронная сеть явно не может обойти такое ограничение: в представленной горстке точек данных просто слишком мало информации.
На следующем шаге мы займемся еще одним многообещающим представлением: деревьями принятия решений. В отличие от нейронных сетей, обучение которых порой требует немалых вычислительных ресурсов (зачастую множества компьютеров и многих часов, а иногда и недель), деревья принятия решений весьма "дешевы" в этом отношении. И притом представляют собой быстрый и эффективный способ выделения закономерностей в обучающих данных.
На следующем шаге мы рассмотрим машинное обучение с помощью деревьев принятия решений в одной строке кода.