Главная страница
Навигация по странице:

  • Рис. 4.17.

  • Искусственные нейронные сети

  • Рис. 4.18.

  • Рис. 4.19.

  • Рис. 4.20.

  • однострочники пайтон. Однострочники Python лаконичный и содержательный код by Кристи. Однострочники


    Скачать 4.44 Mb.
    НазваниеОднострочники
    Анкороднострочники пайтон
    Дата22.04.2022
    Размер4.44 Mb.
    Формат файлаpdf
    Имя файлаОднострочники Python лаконичный и содержательный код by Кристи.pdf
    ТипКнига
    #490720
    страница14 из 21
    1   ...   10   11   12   13   14   15   16   17   ...   21
    150
    Глава 4. Машинное обучение
    Ответ на шестой вопрос приближенно описывает уровень владения Python программистом. Finxter (
    https://finxter.com/
    ) — наше приложение, обучающее с помощью маленьких задач на Python и присваивающее программистам на
    Python рейтинг в зависимости от успешности решения ими этих задач. Таким образом, оно помогает количественно выразить уровень владения Python.
    Начнем с визуализации степени влияния на выходной сигнал каждого из во- просов (рейтинг владения Python разработчиком), как показано на рис. 4.17.
    Рис. 4.17. Взаимосвязь между ответами на опросник и рейтингом владения
    Python на Finxter

    Нейросетевой анализ в одной строке кода
    151
    Обратите внимание, что эти графики демонстрируют лишь влияние отдель- ных признаков (ответов на вопросы) на итоговый рейтинг Finxter, но ничего не говорят о влиянии сочетаний двух или более признаков. Отметим также, что некоторые разработчики Python не ответили на всех шесть вопросов; в подобных случаях использовалось фиктивное значение
    -1
    Искусственные нейронные сети
    Идея создания теоретической модели человеческого мозга (естественной нейронной сети) всесторонне изучается в последние десятилетия. Но основы искусственных нейронных сетей были заложены еще в 1940-х и 1950-х! С тех пор идеи искусственных нейронных сетей непрерывно пересматривались и усовершенствовались.
    Основная идея состоит в разбиении обширной задачи обучения и вывода на множество микрозадач, не независимых друг от друга, а напротив, тесно вза- имосвязанных. Мозг содержит миллиарды нейронов, связанных с помощью триллионов синапсов. В упрощенной модели обучение представляет собой просто подстройку мощности синапсов (называемых также в искусственных нейронных сетях весами, или параметрами). Как же создать в такой модели новый синапс? Очень просто — всего лишь увеличить его вес с нуля до не- нулевого значения.
    На рис. 4.18 приведена простейшая нейронная сеть из трех слоев (входной, скрытый и выходной), каждый из которых состоит из нескольких нейронов, связанных между собой, начиная от входного слоя через скрытый и до вы- ходного.
    Рис. 4.18. Простая нейронная сеть для классификации животных

    152
    Глава 4. Машинное обучение
    В этом примере нейронная сеть обучается обнаруживать животных на изо- бражениях. На практике в качестве входного слоя используется по одному входному нейрону на каждый пиксел изображения. В результате получаются миллионы входных нейронов, связанных с миллионами скрытых нейронов.
    Обычно каждый выходной нейрон отвечает за один бит общего выходного сигнала. Например, для обнаружения двух различных животных (скажем, кошки и собаки) можно воспользоваться одним нейроном выходного слоя, моделирующим два различных состояния (
    0=кошка
    ,
    1=собака
    ).
    Идея заключается в активации (возбуждении) нейрона при попадании в него определенного входного импульса. При этом каждый нейрон воз- буждается (или не возбуждается) отдельно от других, в зависимости от мощности его входного сигнала. Таким образом моделируется человеческий мозг, в котором нейроны активируют друг друга через импульсы. Активация входных нейронов распространяется по сети, пока не достигнет выходных нейронов. Часть их будет активирована, а часть — нет. Конкретная картина возбуждения выходных нейронов и формирует итоговый выходной сигнал
    (предсказание) искусственной нейронной сети. Возбужденный выходной нейрон в модели, допустим, может кодировать 1, а невозбужденный — 0.
    Таким образом можно обучить нейронную сеть предсказывать все, что толь- ко можно кодировать с помощью последовательности 0 и 1 (то есть все, что может представить компьютер).
    Посмотрим на математическую картину работы нейронов (рис. 4.19).
    Рис. 4.19. Математическая модель отдельного нейрона: выходной сигнал представляет собой функцию трех входных сигналов

    Нейросетевой анализ в одной строке кода
    153
    Каждый нейрон соединен с другими, но не все соединения равноценны, у каждого — свой вес. Строго говоря, возбужденный нейрон распростра- няет импульс 1 на следующие нейроны, а невозбужденный распространяет импульс 0. Вес, образно говоря, задает долю импульса возбуждающегося входного нейрона, передаваемую в следующий нейрон через соединение.
    Математически входной сигнал следующего нейрона вычисляется путем умножения импульса на вес соединения.
    В нашем примере нейрон просто вычисляет свой выходной сигнал, суммируя все входные сигналы. Конкретная схема генерации нейроном выходного сигнала на основе входных называется его функцией активации (activation function). В нашем примере вероятность возбуждения нейрона выше, если соответствующие входные нейроны также возбуждаются. Именно так им- пульсы и распространяются по нейронной сети.
    Как работает алгоритм обучения? Обучающие данные используются для выбора весов w нейронной сети. При фиксированном входном значении x различные веса w приводят к различным выходным сигналам. Поэтому алгоритм обучения постепенно меняет веса w — за много итераций, — пока выходной слой не начинает выдавать результаты, аналогичные обучающим данным. Другими словами, алгоритм обучения постепенно сокращает по- грешность предсказания обучающих данных.
    Существует множество схем сетей, алгоритмов обучения и функций акти- вации. В этой главе показан практичный подход, позволяющий воспользо- ваться нейронной сетью прямо сейчас, с помощью одной строки кода. Если захотите, то можете изучить потом дополнительные подробности (например, можете начать с чтения статьи «Нейронная сеть» в «Википедии», https://
    ru.wikipedia.org/wiki/Нейронная_сеть
    ).
    Код
    Наша цель — создать нейронную сеть для предсказания уровня владения
    Python (рейтинга Finxter), исходя из пяти входных признаков (ответов на вопросы):
    WEEK
    — сколько часов за последние семь дней вы работали с кодом на
    Python?
    YEARS
    — сколько лет назад вы начали изучать компьютерные науки?

    154
    Глава 4. Машинное обучение
    BOOKS
    — сколько книг по написанию кода стоит на ваших полках?
    PROJECTS
    — какой процент вашего времени, посвященного Python, вы тратите на разработку реальных проектов?
    EARN
    — сколько вы зарабатываете в месяц (округленно до тысяч долла- ров) благодаря своим профессиональным навыкам (в самом широком смысле)?
    Снова встанем на плечи гигантов и воспользуемся библиотекой 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]])
    print(res)
    Вычислить результаты этого кода человеку поистине невозможно, но не хотите ли попытаться?

    Нейросетевой анализ в одной строке кода
    155
    Принцип работы
    В первых нескольких строках кода мы создаем набор данных. Входной формат алгоритмов машинного обучения в библиотеке scikit-learn одинаков. Строки соответствуют отдельным наблюдениям, состоящим из нескольких признаков.
    Чем больше строк, тем больше обучающих данных; чем больше столбцов, тем больше признаков в каждом наблюдении. В данном случае у нас пять входных и один выходной признак для каждого элемента обучающих данных.
    Наш однострочник создает нейронную сеть с помощью конструктора класса
    MLPRegressor
    , в который я передаю max_iter=10000
    в качестве аргумента, поскольку обучение не сходится при использовании количества итераций по умолчанию (
    max_iter=200
    ).
    После этого мы вызываем функцию fit()
    для определения параметров нейронной сети. После вызова fit()
    начальные значения нейронной сети успешно заданы. Функция fit()
    принимает в качестве параметров много- мерный входной массив (по одному наблюдению в строке) и одномерный выходной массив (размер которого равен количеству наблюдений).
    Осталось только вызвать функцию predict с какими-нибудь входными значениями:
    ## Результат res = neural_net.predict([[0, 0, 0, 0, 0]])
    print(res)
    # [94.94925927]
    Учтите, что фактические результаты ее выполнения могут немного отличать- ся вследствие недетерминистичной природы самой функции и различного характера сходимости.
    Говоря простым языком: если...
    ... за последние семь дней вы работали с кодом на Python 0 часов;
    ... начали изучать компьютерные науки 0 лет назад;
    ... на ваших полках стоит 0 книг по написанию кода;
    ... вы тратите на работу над реальными проектами 0 % вашего времени, посвященного Python;
    ... вы зарабатываете благодаря своим профессиональным навыкам в месяц 0 долларов;

    156
    Глава 4. Машинное обучение то нейронная сеть оценит ваш уровень владения Python как очень низкий
    (рейтинг Finxter в 94 балла означает, что вы с трудом понимаете даже про- грамму print("hello,
    world")
    на Python)
    1
    Поменяем параметры: что будет, если вы потратили 20 часов на изучение
    Python и вернулись к программе через неделю:
    ## Результат res = neural_net.predict([[20, 0, 0, 0, 0]])
    print(res)
    # [440.40167562]
    Совсем неплохо — ваш уровень владения Python существенно вырос! Но такой рейтинг вас все еще не вполне удовлетворяет, правда? (У более или менее приличного программиста на Python рейтинг на Finxter, по крайней мере, составляет 1500–1700.)
    Никаких проблем. Купите десять книг по Python (с учетом этой только девять). Посмотрим, что произойдет с вашим рейтингом:
    ## Результат res = neural_net.predict([[20, 0, 10, 0, 0]])
    print(res)
    # [953.6317602]
    И снова заметен существенный прогресс, ваш рейтинг удвоился! Но одна только покупка книг по Python не слишком помогает, нужно еще и изучить их! Потратим на это год:
    ## Результат res = neural_net.predict([[20, 1, 10, 0, 0]])
    1
    При запуске программа дает не те результаты, что описывает здесь автор. В частности, выходной признак не увеличивается, а уменьшается при WEEK=20 по сравнению с WEEK=0:
    neural_net = MLPRegressor(max_iter=10000).fit(X[:,:–1], X[:,–1])
    res = neural_net.predict([[0, 0, 0, 0, 0]])
    print(res)
    [1320.6305953]
    res = neural_net.predict([[20, 0, 0, 0, 0]])
    print(res)
    [816.44206182]
    Это видно даже в репозитории автора на GitHub: https://github.com/finxter/
    PythonOneLiners/blob/master/book/machine_learning/sklearn_one_liner_05.py.

    Нейросетевой анализ в одной строке кода
    157
    print(res)
    # [999.94308353]
    Рейтинг практически не изменился. Вот теперь я не слишком верю в резуль- таты нашей нейронной сети. Мне кажется, что рейтинг должен был вырасти хотя бы до 1500. Но это означает лишь то, что нейронная сеть демонстрирует настолько хорошие результаты, насколько хороши ее обучающие данные.
    А данных у нас было очень немного, и нейронная сеть явно не может обойти такое ограничение: в представленной горстке точек данных просто слишком мало информации.
    Но мы не сдадимся, правда? Далее вы попробуете потратить 50 % своего времени, посвященного Python, на работу в качестве Python-фрилансера
    1
    :
    ## Результат res = neural_net.predict([[20, 1, 10, 50, 1000]])
    print(res)
    # [1960.7595547]
    Ух ты! Внезапно нейронная сеть стала считать вас экспертом по Python.
    Несомненно, мудрое предсказание нейронной сети! Изучайте Python хотя бы год и решайте реальные задачи — и станете прекрасным программистом!
    Резюмируя: вы изучили основы нейронных сетей и научились использовать их с помощью всего одной строки кода на Python. Любопытно, что наш опросник демонстрирует, что работа с реальными проектами — возможно, даже выполнение с самого начала каких-либо проектов в качестве фрилан- сера — вносит немалый вклад в успешность вашей учебы. Наша нейронная сеть явно об этом знает. Если хотите узнать о моей личной стратегии того, как стать фрилансером, то можете присоединиться к бесплатному вебинару о последних достижениях в сфере фриланса на Python: https://blog.finxter.com/ webinar-freelancer/
    В следующем разделе мы займемся еще одним многообещающим пред- ставлением: деревьями принятия решений. В отличие от нейронных сетей, обучение которых порой требует немалых вычислительных ресурсов (за- частую множества компьютеров и многих часов, а иногда и недель), деревья принятия решений весьма «дешевы» в этом отношении. И притом представ- ляют собой быстрый и эффективный способ выделения закономерностей в обучающих данных.
    1
    С зарплатой 1000 долларов.

    158
    Глава 4. Машинное обучение
    Машинное обучение с помощью деревьев
    принятия решений в одной строке кода
    Деревья принятия решений (decision trees) — интуитивный инструмент для вашего набора инструментов машинного обучения. Он обладает большими возможностями. Важное преимущество деревьев принятия решений в том, что, в отличие от многих других методик машинного обучения, деревья удоб- ны для непосредственного восприятия человеком. Вы можете легко обучить дерево принятия решений и показать его своему начальству, которому не нужно знать ничего о машинном обучении, чтобы понять, что делает модель.
    Особенно это удобно для исследователей данных, которым часто приходит- ся демонстрировать свои результаты перед руководством и защищать их.
    В этом разделе я покажу вам, как использовать деревья принятия решений с помощью одной строки кода Python.
    Общее описание
    В отличие от многих алгоритмов машинного обучения, идеи деревьев при- нятия решений, вероятно, знакомы вам из жизненного опыта. Это просто структурированный способ принятия решений. Каждое решение приводит к дальнейшему ветвлению. Ответив на серию вопросов, вы в конечном итоге приходите к желаемой рекомендации. На рис. 4.20 приведен пример.
    Рис. 4.20. Упрощенное дерево принятия решений для рекомендаций изучаемых предметов

    Машинное обучение с помощью деревьев принятия решений в одной строке кода
    159
    Деревья принятия решений используются для задач классификации на- подобие «Какой предмет мне изучать в зависимости от моих интересов?».
    Начинается принятие решения сверху, после чего последовательно даются ответы на вопросы и выбираются варианты, лучше всего описывающие име- ющиеся признаки. Наконец, достигается лист дерева — вершина, у которой отсутствуют потомки. Она и будет классом, рекомендуемым в соответствии с выбранными признаками.
    У обучения на основе деревьев принятия решений есть множество нюансов.
    В предыдущем примере вес первого вопроса существенно превышает вес последнего. Если вам нравится математика, то дерево принятия решений никогда не порекомендует вам изучать искусства или лингвистику. Это удобно, ведь некоторые признаки могут быть важнее для классификации, чем другие. Например, система классификации, предсказывающая текущее состояние здоровья, может использовать пол (признак) для исключения многих болезней (классов).
    Следовательно, порядок вершин дерева можно использовать для оптими- зации работы системы: признаки, сильнее всего влияющие на итоговую классификацию, нужно помещать сверху. При обучении на основе деревьев принятия решений это позволяет затем агрегировать вопросы, слабо влия- ющие на итоговую классификацию, как показано на рис. 4.21.
    Лингвистика
    История
    Лингвистика
    История
    Рис. 4.21. Усечение ветвей повышает эффективность обучения на основе деревьев принятия решений
    Пусть полное дерево принятия решений выглядит так, как показано сле- ва на рис. 4.21. Для любого сочетания признаков есть отдельный итог

    160
    Глава 4. Машинное обучение классификации (лист дерева). Однако некоторые признаки могут не давать никакой дополнительной информации относительно задачи классификации
    (например, первая вершина «Язык» в нашем примере). Обучение на основе деревьев принятия решений позволяет избавиться от этих вершин из сообра- жений эффективности — процесс так называемого усечения ветвей (pruning).
    Код
    Создать собственное дерево принятия решений можно с помощью одной строки кода на языке Python. Листинг 4.6 демонстрирует, как именно.
    Листинг 4.6. Дерево принятия решений с помощью одной строки кода Python
    ## Зависимости from sklearn import tree import numpy as np
    ## Данные: оценки студентов по (математика, языки, творческие
    ## способности) --> предмет для изучения
    X = np.array([[9, 5, 6, "computer science"],
    [1, 8, 1, "linguistics"],
    [5, 7, 9, "art"]])
    ## Однострочник
    Tree = tree.DecisionTreeClassifier().fit(X[:,:-1], X[:,-1])
    ## Результат student_0 = Tree.predict([[8, 6, 5]])
    print(student_0)
    student_1 = Tree.predict([[3, 7, 9]])
    print(student_1)
    Догадайтесь, какими будут результаты выполнения этого фрагмента кода!
    Принцип работы
    Данные в коде описывают трех студентов с оценками их успехов (от 1 до 10) в трех областях: математика, языки и творческие способности. Кроме того, нам известны предметы изучения этих студентов. Например, первый студент демонстрирует способности к математике и изучает computer science. Второй студент демонстрирует большие способности к языкам, чем к двум другим областям, и изучает лингвистику. Третий студент демонстрирует хорошие творческие способности и изучает искусство.

    Получение строки с минимальной дисперсией в одной строке кода
    161
    Наш однострочник создает новый объект дерева принятия решений и обу- чает модель на маркированных обучающих данных (последний столбец — метки) с помощью функции fit()
    . «Под капотом» при этом создаются три вершины, по одной для каждого признака: математика, языки, творческие способности. При предсказании класса для student_0
    (математика=8, язы- ки=6, творческие способности=5) дерево принятия решений возвращает computer science
    . Оно усвоило, что такая закономерность признаков (вы- сокий, средний, средний) указывает на первый класс. С другой стороны, при наборе признаков (3, 7, 9) дерево принятия решений предсказывает art
    , поскольку усвоило, что оценки (низкая, средняя, высокая) указывают на третий класс.
    Обратите внимание, что алгоритм — недетерминистичный. Другими слова- ми, при выполнении одного и того же кода дважды могут быть возвращены различные результаты. Подобное поведение часто встречается в алгоритмах машинного обучения, имеющих дело с генераторами случайных чисел.
    В данном случае порядок признаков случаен, так что порядок признаков в итоговом дереве принятия решений может различаться.
    Резюмируя: деревья принятия решений — интуитивный способ создания моделей машинного обучения, удобных для восприятия человеком. Каждая ветвь отражает выбор, основанный на отдельном признаке нового примера данных. Листья дерева отражают итоговое предсказание (классификацию или регрессию). Далее мы ненадолго оставим конкретные алгоритмы машин- ного обучения и рассмотрим важнейшее для машинного обучения понятие: дисперсию.
    1   ...   10   11   12   13   14   15   16   17   ...   21


    написать администратору сайта