Шаг 63.
Однострочники Python. Машинное обучение. Нейросетевой анализ в одной строке кода. Код и принцип работы

    На этом шаге мы закончим изучение этого вопроса.

Код

    Наша цель - создать нейронную сеть для предсказания уровня владения Python (рейтинга Finxter), исходя из пяти входных признаков (ответов на вопросы):

    Снова встанем на плечи гигантов и воспользуемся библиотекой scikit-learn (sklearn) для нейросетевой регрессии, как показано в примере 4.5.


Пример 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]

    Учтите, что фактические результаты ее выполнения могут немного отличаться вследствие недетерминистичной природы самой функции и различного характера сходимости.

    Говоря простым языком: если...

то нейронная сеть оценит ваш уровень владения Python 932 балла.

    Поменяем параметры: что будет, если вы потратили 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. Полученные результаты означают лишь то, что нейронная сеть демонстрирует настолько хорошие результаты, насколько хороши ее обучающие данные. А данных у нас было очень немного, и нейронная сеть явно не может обойти такое ограничение: в представленной горстке точек данных просто слишком мало информации.

    На следующем шаге мы займемся еще одним многообещающим представлением: деревьями принятия решений. В отличие от нейронных сетей, обучение которых порой требует немалых вычислительных ресурсов (зачастую множества компьютеров и многих часов, а иногда и недель), деревья принятия решений весьма "дешевы" в этом отношении. И притом представляют собой быстрый и эффективный способ выделения закономерностей в обучающих данных.

    На следующем шаге мы рассмотрим машинное обучение с помощью деревьев принятия решений в одной строке кода.




Предыдущий шаг Содержание Следующий шаг