Как научиться писать научные статьи с нуля


Как написать научную статью — Молодой ученый

Вы студент?! Тогда начните с этой статьи: Как студенту написать первую научную статью. Инструкция

Научные статьи пишут студенты, аспиранты и состоявшиеся ученые. Публикация научных статей — обязательная часть работы над диссертацией. Цель данной статьи — ответить на основные вопросы, возникающие у человека, который впервые столкнулся с необходимостью написания научной статьи. В статье будет рассмотрен процесс работы над такой статьей.

Что такое научная статья

Прежде всего, определимся, что такое научная статья. Научная статья рассматривает одну или несколько взаимосвязанных проблем той или иной тематики. Можно сказать, что научная статья — это полноценное мини-исследование по определенной узкой теме.

Выделяют следующие виды научных статей:

  1. Научно-теоретические — описывающие результаты исследований, выполненных на основе теоретического поиска и объяснения явлений и их закономерностей.
  2. Научно-практические (эмпирические) — построенные на основе экспериментов и реального опыта.
  3. Обзорные — посвященные анализу научных достижений в определенной области за последние несколько лет.

Научная статья предполагает изложение собственных выводов и промежуточных или окончательных результатов своего научного исследования, экспериментальной или аналитической деятельности. Такая статья должна содержать авторские разработки, выводы, рекомендации.

Это означает, что, прежде всего, научная статья должна обладать эффектом новизны: изложенные в ней результаты не должны быть ранее опубликованы. Публикуя научную статью, автор закрепляет за собой приоритет в выбранной области исследования.

С чего начать

Если вы готовите статью для определенного издания, журнала, сборника, следует, в первую очередь, изучить требования к принимаемым в него статьям: объем, оформление, круг тем. Например, требования к статьям, которые предъявляет журнал “Молодой ученый”, достаточно просты и понятны. Ознакомиться с ними можно здесь .

Затем можно поразмышлять над темой статьи. Для начала пересмотрите уже имеющийся у вас материал и подумайте, как его можно использовать для написания статьи. Чем более узко и специализированно представлена тема статьи, тем лучше. Не старайтесь объять необъятное. Тема должна быть актуальной для науки и интересной именно вам.

Определив тему, набросайте приблизительный план статьи, подумайте, как и в какой последовательности изложить материал. Теперь следует определиться, каких материалов вам не хватает для полноценных и аргументированных выводов.

Отправляйтесь в лабораторию, архивы, библиотеку, чтобы собрать недостающие сведения, провести дополнительные эксперименты. Обязательно обратите внимание на новые публикации по вашей теме, появившиеся за последние год-два. Перелистайте научные журналы, сборники конференций, журналы, газеты. Содержание статьи должно быть актуальным и основываться на позднейших наработках других исследователей.

Также рекомендуем: Как искать информацию для научной статьи

Собрав необходимый материал, сгруппируйте его, проанализируйте и обобщите. Для лучшего восприятия объема проведенной работы и результатов вашей деятельности представьте материал в наглядной форме: составьте схемы, диаграммы, графики, таблицы. Это поможет не только вам самим систематизировать полученную информацию, но и вашим читателям лучше понять вас и использовать ваш материал в своей деятельности.

Также рекомендуем: Как интеллект-карты помогут вам написать научную статью

Не знаете, с чего начать писать сам текст? Начните с середины. Сначала просто запишите все, что пришло вам в голову. Не старайтесь сразу подобрать нужные слова и правильные фразы, главное — сформировать скелет будущей статьи. Отложите написанный текст на несколько дней. Все это время ваш мозг будет продолжать трудиться, и когда вы снова откроете файл со своими записями, работа пойдет гораздо быстрее. Сначала напишите основную часть статьи, затем выводы и введение, а после этого приступайте к заголовку, аннотации и ключевым словам.

Также рекомендуем: Как усадить себя за научную статью? Секреты продуктивности

Структура научной статьи

Научная статья состоит из следующих основных частей: название статьи (заголовок), аннотация, ключевые слова, введение, основная часть, заключение (выводы, анализ, обобщение, критика), список литературы.

Рассмотрим особенности каждой из них.

Заголовок

Заголовок статьи должен выполнять две задачи: отражать содержание статьи и привлекать интерес читателей. Так же, как и сам текст статьи, заголовок пишется в научном стиле и максимально корректно отражает ее содержание.

Также рекомендуем: Как придумать хорошее название для научной статьи

Желательно включить в заголовок несколько ключевых слов, относящихся к сути вопроса. При публикации такой статьи в Интернете или в электронном каталоге библиотеки заголовок с использованием ключевых слов повышает шансы, что ваши статьи будут найдены интересующимися данной проблемой. Длина заголовка статьи не должна превышать 10–12 слов.

Примеры удачных заголовков, которые хорошо раскрывают суть научной статьи:

«Математическое моделирование отрывных течений на основе нестационарных уравнений Навье-Стокса»
«Исследование потерь при распространении радиосигнала сотовой связи на основе статистических моделей»
«Научная деятельность как необходимое условие продуктивности развития индивидуального стиля преподавателя вуза»

Ошибки при составлении заголовка:

1. Заголовок статьи слишком общий и охватывает гораздо более широкий круг вопросов, чем сам текст статьи. Заголовок должен быть как можно более конкретным. Например: «Работа педагога» ; «Коучинг» — примеры плохих заголовков.
«Коучинг как инструмент эффективного обучения и развития персонала» ; «Из опыта работы с детьми младшего дошкольного возраста» — примеры хороших заголовков

2. Заголовок не отражает сути рассматриваемого вопроса и вводит читателя в заблуждение.

3. Сенсационный заголовок. Такие заголовки хороши в рекламных и новостных текстах, но для научной статьи они не годятся. Пример: «Засорение окружающей среды — как мы за это расплачиваемся» — плохой заголовок.
«Методика расчета платы за экологический ущерб, нанесенный антропогенным воздействием» — хороший.

Если рассматриваемый вопрос не нов и не раз поднимался в научных работах, но вы вносите свой вклад в разработку темы или рассматриваете лишь некоторые аспекты проблемы, то можно начать заголовок со слов: «К вопросу о...», «К проблеме...», «К анализу...».

Аннотация

За заголовком следует аннотация — сжатая характеристика статьи. Наличие аннотации не обязательно, но желательно. Аннотация должна быть краткой, но при этом содержательной. Рекомендуемый размер аннотации — не более 500 символов, т.е. 4-5 предложений. В аннотации дается информация об авторе/авторах статьи, кратко освещается научная проблема, цели и основные авторские выводы в сокращенной форме. Также в аннотации отражается научная новизна статьи.

Также рекомендуем: Как написать идеальную аннотацию к научной статье

Аннотация не должна содержать заимствований (цитат), общеизвестных фактов, подробностей. Она должна быть написана простым, понятным языком, короткими предложениями, в безличной форме (рассмотрены, раскрыты, измерены, установлено и т. д.).

Аннотация выполняет две основные задачи:

  • она помогает читателю сориентироваться в огромном объеме информации, где далеко не все представляет для него интерес; на основе аннотации потенциальный читатель решает, стоит ли читать саму статью;
  • служит для поиска информации в автоматизированных поисковых системах.

Пример аннотации:

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

Ключевые слова

Ключевые слова — своего рода поисковый ключ к статье. Библиографические базы данных обеспечивают поиск по ключевым словам. Ключевые слова могут отражать основные положения, результаты, термины. Они должны представлять определенную ценность для выражения содержания статьи и для ее поиска. Кроме понятий, отражающих главную тему статьи, используйте понятия, отражающие побочную тему. В качестве ключевых слов могут выступать как отдельные слова, так и словосочетания. Обычно достаточно подобрать 5–10 ключевых слов.

Например, для статьи с названием «Дискуссионные моменты интерпретации экспрессивности как категории лексикологии» будут уместны такие ключевые слова: лексическая семантика, семантические признаки, коннотация, экспрессивная единица .

Обязательно попробуйте экспериментальный сервис автоматического формирования ключевых слов!

Автоматическое формирование ключевых слов научной статьи

Введение

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

Основная часть

Основная часть — самый обширный и важный раздел научной статьи. В ней поэтапно раскрывается процесс исследования, излагаются рассуждения, которые позволили сделать выводы. Если статья написана по результатам экспериментов, опытов, необходимо эти эксперименты детально описать, отразить стадии и промежуточные результаты. Если какие-то эксперименты оказались неудачными, о них тоже следует рассказать, раскрыв условия, повлиявшие на неудачный исход и методы устранения недостатков.

Все исследования представляются по возможности в наглядной форме. Здесь уместны схемы, таблицы, графики, диаграммы, графические модели, формулы, фотографии. Таблицы должны быть снабжены заголовками, а графический материал — подрисуночными подписями. Каждый такой элемент должен быть непосредственно связан с текстом статьи, в тексте статьи должна содержаться ссылка на него.

Выводы

В этом разделе в тезисной форме публикуются основные достижения автора. Все выводы должны быть объективны, публиковаться как есть, без авторской интерпретации. Это позволяет читателям оценить качество полученных данных и делать на их основе собственные выводы.

Также вы можете предложить свой анализ полученных результатов, а также изложить субъективный взгляд на значение проведенной работы.

Список литературы

В этом разделе приведены ссылки на цитируемые или упоминаемые в тексте статьи работы.

Также рекомендуем: Как оформить список литературы

Научный стиль изложения

Для научного стиля изложения характерны целостность, связность, смысловая законченность. Логическим переходам и связности текста способствуют такие слова, как «с другой стороны», «таким образом», «на самом деле», «конечно», «действительно».

Для научной статьи характерно наличие большого количества фактов и доказательств и отсутствие неясностей и разночтений. Неуместно в тексте научной статьи выражать какие-либо эмоции.

Приступая к написанию научной статьи, представьте себе того, для кого вы ее пишете. Трудные и малопонятные для вашей аудитории места снабжайте комментариями, но здесь важно соблюсти баланс и не начать объяснять элементарные и известные истины.

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

Не используйте необоснованных заимствований, а те, которые требуются вам для подкрепления своих мыслей, оформляйте в виде цитат со ссылками на первоисточник. Не забывайте делить текст на абзацы. Если статья обширна, используйте подзаголовки. Такая статья легче воспринимается.

Также рекомендуем: Стиль научной статьи

Перед отправкой

Когда текст готов, перечитайте его еще раз, обратите внимание на логику изложения, грамотность, убедитесь, что вы нигде не отклонились от темы.

Если есть возможность, еще раз отложите статью на несколько дней, а потом снова перечитайте ее свежим взглядом.

Проверьте, соответствует ли статья следующим требованиям:

Теперь можно отправлять!

6 шагов для написания любого алгоритма машинного обучения с нуля: пример использования Perceptron | Джон Салливан

Написание алгоритма машинного обучения с нуля - чрезвычайно полезный опыт обучения.

Он дает вам это «ах-ха!» момент, когда он наконец щелкает, и вы понимаете, что на самом деле происходит под капотом.

Некоторые алгоритмы просто сложнее других, поэтому начните с чего-нибудь простого, например, однослойного персептрона.

Я проведу вас через следующий 6-этапный процесс написания алгоритмов с нуля, используя Perceptron в качестве примера:

  1. Получите общее представление об алгоритме
  2. Найдите несколько различных источников обучения
  3. Разбейте алгоритм на фрагменты
  4. Начните с простого примера
  5. Подтвердите с помощью надежной реализации
  6. Напишите свой процесс

Это восходит к тому, что я изначально сказал. Если вы не понимаете основ, не беритесь за алгоритм с нуля.

По крайней мере, вы должны быть в состоянии ответить на следующие вопросы:

  • Что это?
  • Для чего он обычно используется?
  • Когда я НЕ МОГУ этим пользоваться?

Что касается персептрона, давайте продолжим и ответим на следующие вопросы:

  • Однослойный персептрон - это самая простая нейронная сеть. Обычно он используется для задач двоичной классификации (1 или 0, «да» или «нет»).
  • Некоторыми простыми применениями могут быть анализ настроений (положительный или отрицательный ответ) или прогнозирование дефолта по ссуде («дефолт», «не дефолт»).В обоих случаях граница принятия решения должна быть линейной.
  • Если граница принятия решения нелинейна, вы действительно не можете использовать персептрон. Для этих задач вам нужно будет использовать что-то другое.

После того, как вы получите базовое представление о модели, пора приступить к исследованию.

Кто-то лучше учится по учебникам, кто-то - по видео.

Лично я люблю прыгать и использовать различные типы источников.

Что касается математических деталей, то учебники отлично справляются с задачей, но для более практических примеров я предпочитаю сообщения в блогах и видео на YouTube.

Вот несколько отличных источников персептрона:

Учебники

Блоги

Видео

Теперь, когда мы собрали наши источники, пора приступить к обучению.

Вместо того, чтобы полностью читать главу или сообщение в блоге, начните с беглого просмотра заголовков разделов и другой важной информации.

Запишите пункты списка и попытайтесь обрисовать алгоритм.

Пройдя по источникам, я разбил Персептрон на следующие 5 частей:

  1. Инициализирую веса
  2. Умножьте веса на входные и просуммируйте их
  3. Сравните результат с порогом для вычисления вывода (1 или 0)
  4. Обновить веса
  5. Повторить

Давайте подробно рассмотрим каждый.

1. Инициализируйте веса

Для начала мы инициализируем вектор весов.

Количество весов должно соответствовать количеству функций. Предполагая, что у нас есть три функции, вот как будет выглядеть вектор весов.

Вектор веса обычно инициализируется нулями, поэтому я буду придерживаться этого в примере.

Затем мы умножим веса на входные данные, а затем просуммируем их.

Чтобы упростить работу, я раскрасил веса и соответствующие им элементы в первой строке.

После того, как мы умножим веса на характеристики, мы суммируем их. Это также известно как скалярное произведение.

Окончательный результат - 0. Я буду обозначать этот временный результат как «f».

После вычисления скалярного произведения нам нужно сравнить его с пороговым значением.

Я решил использовать в качестве порога 0, но вы можете поэкспериментировать с этим и попробовать другие числа.

Поскольку скалярное произведение «f», которое мы вычислили (0), не превышает нашего порогового значения (0), наша оценка равна нулю.

Я обозначил оценку как y со шляпой (также известной как «y hat»), с нижним индексом 0, чтобы соответствовать первой строке. Вместо этого вы могли бы использовать 1 для первой строки, это не имеет значения. Я просто решил начать с 0.

Если мы сравним этот результат с фактическим значением, мы увидим, что наши текущие веса неверно предсказывают фактический результат.

Поскольку наш прогноз был неверным, нам нужно обновить веса, что приводит нас к следующему шагу.

Теперь мы обновим веса.Вот уравнение, которое мы собираемся использовать:

Основная идея состоит в том, что мы корректируем текущий вес на итерации «n», чтобы получить новый вес для использования в следующей итерации, «n + 1».

Чтобы настроить вес, нам нужно установить «скорость обучения». Обозначается это греческой буквой «эта».

Я выбрал 0,1 для скорости обучения, но вы можете поэкспериментировать с другими числами, как и с порогом.

Вот краткое изложение того, что у нас есть на данный момент:

А теперь давайте посчитаем новые веса для итерации n = 2.

Мы успешно завершили первую итерацию алгоритма персептрона.

Поскольку наш алгоритм не вычислил правильный результат, нам нужно продолжать работу.

Обычно нам требуется множество итераций. Просматривая каждую строку в наборе данных, мы будем обновлять веса каждый раз.

Один полный просмотр набора данных известен как «эпоха».

Поскольку наш набор данных состоит из 3 строк, нам потребуется три итерации, чтобы завершить 1 эпоху.

Мы можем установить общее количество итераций или эпох, чтобы продолжить выполнение алгоритма.Может быть, мы хотим указать 30 итераций (или 10 эпох).

Как и в случае с порогом и скоростью обучения, количество эпох - это параметр, с которым вы можете поиграть.

На следующей итерации мы переходим ко второй строке функций.

Я не буду повторять каждый шаг снова, но вот следующий расчет скалярного произведения:

Затем мы сравним скалярное произведение с порогом, чтобы рассчитать новую оценку, обновить веса и продолжить. Если наши данные линейно разделимы, персептрон сойдется.

Теперь, когда мы вручную разбили алгоритм на части, пора приступить к его реализации в коде.

Для простоты я всегда люблю начинать с очень небольшого «игрушечного набора данных».

Хорошим маленьким линейно разделяемым набором данных для этого типа проблем является вентиль NAND. Это обычный логический вентиль, используемый в цифровой электронике.

Поскольку это довольно небольшой набор данных, мы можем просто вручную ввести его в Python.

Я собираюсь добавить фиктивный объект «x0», который представляет собой столбец из единиц.Я сделал это для того, чтобы наша модель рассчитала член смещения.

Вы можете думать о смещении как о члене перехвата, который правильно позволяет нашей модели разделить два класса.

Вот код для ввода данных:

 # Импорт библиотек 
# NAND Gate
# Примечание: x0 - фиктивная переменная для члена смещения
# x0 x1 x2
x = [[1., 0., 0 .],
[1., 0., 1.],
[1., 1., 0.],
[1., 1., 1.]] Y = [1.,
1.,
1.,
0.]

Как и в предыдущем разделе, я буду проходить алгоритм по частям, писать код и тестировать его по мере продвижения.

Первым шагом является инициализация весов.

 # Инициализировать веса 
import numpy as np
w = np.zeros (len (x [0])) Out:
[0. 0. 0.]

Имейте в виду, что длина вектора весов должна чтобы соответствовать количеству функций. В этом примере логического элемента И-НЕ эта длина равна 3.

Далее мы умножим веса на входные данные, а затем просуммируем их.

Другое название для этого - «скалярное произведение».

Опять же, мы можем использовать Numpy, чтобы легко выполнить эту операцию.Мы будем использовать метод .dot () .

Давайте начнем с скалярного произведения весового вектора и первой строки функций.

 # Dot Product 
f = np.dot (w, x [0])
print fOut:
0,0

Как и ожидалось, результат равен 0.

Чтобы не противоречить нашим примечаниям в предыдущем разделе, я назначил скалярное произведение на переменную «f».

После того, как мы вычислили скалярное произведение, мы готовы сравнить результат с пороговым значением, чтобы сделать наш прогноз результата.

Опять же, я собираюсь придерживаться наших примечаний в предыдущем разделе.

Я собираюсь сделать порог «z» равным 0. Если скалярное произведение «f» больше 0, наш прогноз будет 1. В противном случае он будет равен нулю.

Имейте в виду, что прогноз обычно обозначается с отметкой в ​​каратах сверху, также известной как «шляпа». Переменная, которой я назначу прогноз, - yhat .

 # Функция активации 
z = 0,0
, если f> z:
yhat = 1.
else:
yhat = 0.

print yhat

Out:
0.0

Как и ожидалось, прогноз равен 0.

Вы заметите, что в примечании над кодом я назвал это «функцией активации». Это более формальное описание того, что мы делаем.

Взглянув на первую строку выходных данных NAND, мы увидим, что фактическое значение равно 1. Поскольку наш прогноз был неверным, нам нужно будет обновить веса.

Теперь, когда мы сделали прогноз, мы готовы обновить веса.

Нам нужно будет установить скорость обучения, прежде чем мы сможем это сделать. Чтобы соответствовать нашему предыдущему примеру, я присвою скорости обучения «eta» значение 0,1.

Я собираюсь жестко запрограммировать обновление для каждого веса, чтобы упростить чтение.

 # Обновить веса 
eta = 0,1
w [0] = w [0] + eta * (y [0] - yhat) * x [0] [0]
w [1] = w [1] + eta * (y [0] - yhat) * x [0] [1]
w [2] = w [2] + eta * (y [0] - yhat) * x [0] [2]

напечатать w

Out:
[0.1 0. 0.]

Мы видим, что наши веса обновлены, так что мы готовы продолжать работу.

Теперь, когда мы проработали каждый шаг, пришло время собрать все воедино.

Последняя часть, которую мы не обсуждали, - это наша функция потерь. Это функция, которую мы пытаемся минимизировать, в нашем случае это ошибка суммы квадратов (SSE).

Это то, что мы будем использовать, чтобы вычислить нашу ошибку и посмотреть, как работает модель.

Собирая все вместе, вот как выглядит полная функция:

 import numpy as np 

# Perceptron function
def perceptron (x, y, z, eta, t):
'' '
Input Parameters:
x : набор данных входных характеристик
y: фактические выходы
z: порог функции активации
eta: скорость обучения
t: количество итераций
'' '

# инициализация весов
w = np.zeros (len (x [0]))
n = 0

# инициализация дополнительных параметров для вычисления суммы квадратов ошибок
yhat_vec = np.ones (len (y)) # вектор для прогнозов
errors = np.ones (len (y)) # вектор ошибок (фактический - прогнозы)
J = [] # вектор для функции затрат SSE

while n = z:
yhat = 1.
else:
yhat = 0.
yhat_vec [i] = yhat

# обновление весов
для j в xrange (0, len (w)):
w [j] = w [j] + eta * (y [i] -yhat) * x [i] [j]

n + = 1
# вычисление суммы квадратов ошибок
для i в xrange (0, len (y)):
errors [i] = (y [i] -yhat_vec [i]) ** 2
J.append (0.5 * np.sum (errors))

return w, J

Теперь, когда мы закодировали полный Персептрон, давайте продолжим и запустите его:

 # x0 x1 x2 
x = [[1., 0., 0.],
[1., 0., 1.],
[1., 1., 0.],
[1., 1., 1.]]

y = [1. ,
1.,
1.,
0.]

z = 0,0
eta = 0,1
t = 50

print "Веса:"
print perceptron (x, y, z, eta, t) [ 0]

print "Ошибки:"
print perceptron (x, y, z, eta, t) [0]

Out:
Веса:
[0,2 -0,2 -0,1]
Ошибки:
[0,5, 1,5, 1,5, 1,0, 0,5, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0.0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0]

Взглянув на ошибки, мы видим, что ошибка упала до 0 примерно на 6-й итерации. Для оставшейся части итераций оно оставалось равным 0.

Когда ошибка переходит в 0 и остается на этом уровне, мы знаем, что наша модель сходится. Это говорит нам о том, что наша модель правильно «выучила» соответствующие веса.

В следующем разделе мы будем использовать наши вычисленные веса на большом наборе данных
, чтобы делать прогнозы.

К этому моменту мы нашли различные учебные ресурсы, проработали алгоритм вручную и протестировали его в коде на простом примере.

Пришло время сравнить наши результаты с проверенной реализацией. Для сравнения воспользуемся перцептроном из scikit-learn.

Мы проведем это сравнение, выполнив следующие шаги:

  1. Импортировать данные
  2. Разделить данные на наборы для обучения / тестирования
  3. Обучить наш Персептрон
  4. Протестировать Персептрон
  5. Сравните с Scikit-learn Perceptron

Начнем с импорта данных.Вы можете получить копию набора данных здесь.

Это линейно разделяемый набор данных, который я создал, чтобы убедиться, что Perceptron будет работать. Просто для подтверждения, давайте продолжим и построим данные.

 import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv ("dataset.csv")
plt.scatter (df.values ​​[:, 1], df.values ​​[: , 2], c = df ['3'], alpha = 0.8)

Взглянув на график, довольно легко увидеть, что мы можем разделить эти данные прямой линией.

Прежде чем мы продолжим, я объясню свой код построения графика выше.

Я использовал Pandas для импорта csv, который автоматически помещает данные в фрейм данных.

Для построения графика данных мне пришлось вытащить значения из фрейма данных, поэтому я использовал метод .values ​​.

Характеристики находятся в столбцах 1 и 2, поэтому я использовал их в функции диаграммы рассеяния. Столбец 0 - это фиктивная функция единиц, которую я включил, чтобы вычислить точку пересечения. Это должно быть знакомо тому, что мы делали с вентилем NAND в предыдущем разделе.

Наконец, я раскрасил два класса, используя c = df ['3'], alpha = 0.8 в функции диаграммы рассеяния. Результатом являются данные в столбце 3 (0 или 1), поэтому я сказал функции раскрасить два класса, используя столбец «3».

Дополнительную информацию о функции диаграммы рассеяния Matplotlib можно найти здесь.

Теперь, когда мы подтвердили, что данные можно разделить линейно, пора разделить данные.

Всегда полезно обучать модель на отдельном наборе данных от того, на котором вы тестируете.Это помогает избежать переобучения.

Для этого существуют разные методы, но для простоты я просто воспользуюсь обучающим набором и тестовым набором.

Начну с перемешивания данных. Если вы посмотрите на исходный файл, то увидите, что данные сгруппированы по строкам с 0 в выходных данных (третий столбец), а затем следуют все единицы. Я хочу встряхнуть и добавить немного случайности, поэтому я собираюсь перемешать это.

 df = df.values ​​

np.random.seed (5)
np.random.shuffle (df)

Я начал с изменения данных из фрейма данных в массив numpy. Это упростит работу с множеством функций numpy, которые я собираюсь использовать, например .shuffle .

Чтобы результаты были воспроизводимы для вас, я установил случайное начальное число (5). После того, как мы закончим, попробуйте изменить случайное начальное число и посмотрите, как изменятся результаты.

Далее я разделю 70% моих данных на обучающий набор и 30% на тестовый набор.

 поезд = df [0: int (0.7 * len (df))] 
test = df [int (0.7 * len (df)): int (len (df))]

Последний шаг - разделить функции и выходные данные для обучения и тестирования. наборы.

 x_train = train [:, 0: 3] 
y_train = train [:, 3]

x_test = test [:, 0: 3]
y_test = test [:, 3]

Я выбрал 70% / 30 % для моих наборов поездов / тестов только для этого примера, но я рекомендую вам изучить другие методы, такие как перекрестная проверка в k-кратном размере.

Далее мы обучим нашего персептрона.

Это довольно просто, мы просто собираемся повторно использовать код, который мы создали в предыдущем разделе.

 def perceptron_train (x, y, z, eta, t): 
''
Входные параметры:
x: набор данных входных функций
y: фактические выходы
z: порог функции активации
eta: скорость обучения
t : количество итераций
'' '

# инициализация весов
w = np.zeros (len (x [0]))
n = 0

# инициализация дополнительных параметров для вычисления суммы квадратов ошибок
yhat_vec = np .ones (len (y)) # вектор для прогнозов
errors = np.ones (len (y)) # вектор для ошибок (фактическое - прогнозы)
J = [] # вектор для функции стоимости SSE

при n = z:
yhat = 1.
else:
yhat = 0.
yhat_vec [i] = yhat

# обновление весов
для j в xrange (0, len (w)):
w [j] = w [j] + eta * (y [i] -yhat) * x [i] [j]

n + = 1
# вычисление суммы квадратов ошибок
для i в xrange (0, len (y)):
errors [i] = (y [i] -yhat_vec [ i]) ** 2
J.append (0,5 * np.sum (errors))

return w, J

z = 0,0
eta = 0,1
t = 50

perceptron_train (x_train, y_train, z, eta , t)

Давайте продолжим и посмотрим на веса и ошибку суммы квадратов.

 w = perceptron_train (x_train, y_train, z, eta, t) [0] 
J = perceptron_train (x_train, y_train, z, eta, t) [1]

print w
print J

Out:
[-0.5 -0,29850122 0,35054929]
[4,5, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0]

Веса сейчас не имеют для нас большого значения, но мы будем использовать эти числа в следующем разделе для тестирования нашего Персептрона.Мы также будем использовать веса, чтобы сравнить нашу модель с моделью scikit-learn.

Взглянув на ошибку суммы квадратов, мы увидим, что наш персептрон сошелся, чего мы и ожидали, поскольку данные линейно разделимы.

Пришло время протестировать наш персептрон. Для этого мы создадим небольшую функцию perceptron_test .

Это очень похоже на то, что мы уже видели. Эта функция использует скалярное произведение весов, рассчитанных с помощью функции perceptron_train , и функций вместе с функцией активации, чтобы делать прогнозы.

Единственная деталь, которую мы не видели, - это precision_score . Это метрическая функция оценки от scikit-learn. Вы можете узнать об этом подробнее здесь.

Собирая все это вместе, вот как выглядит код:

 из sklearn.metrics import precision_score 

w = perceptron_train (x_train, y_train, z, eta, t) [0]

def perceptron_test (x, w, z, eta, t):
y_pred = []
для i в xrange (0, len (x-1)):
f = np.dot (x [i], w)

# функция активации
if f > z:
yhat = 1
else:
yhat = 0
y_pred.append (yhat)
return y_pred

y_pred = perceptron_test (x_test, w, z, eta, t)

print "Оценка точности:"
print precision_score (y_test, y_pred)

Out:
Оценка точности:
1,0

Оценка 1,0 означает, что наша модель правильно сделала прогнозы на всех тестовых данных. Этот набор данных четко разделяется, поэтому мы ожидаем такого результата.

Последний шаг - сравнить наши результаты с Perceptron из scikit-learn. Вот код этой модели:

 от sklearn.linear_model import Perceptron 

# обучение sklearn Perceptron
clf = Perceptron (random_state = None, eta0 = 0.1, shuffle = False, fit_intercept = False)
clf.fit (x_train, y_train)
y_predict = clf_179000 (x_predict = clf_test.predict) 9

Теперь, когда мы обучили модель, давайте сравним веса с весами, которые рассчитала наша модель.

 Out: 
Вес склеарна:
[-0,5 -0,29850122 0,35054929]
Вес моего персептрона:
[-0,5 -0,29850122 0,35054929]

Веса из модели scikit-learn идентичны нашим весам.Это означает, что наша модель работает правильно, и это отличная новость.

Прежде чем мы подведем итоги, нужно остановиться на нескольких незначительных моментах. В модели scikit-learn нам нужно было установить случайное состояние на «None» и выключить перемешивание. Мы уже установили случайное начальное число и перетасовали данные, поэтому нам не нужно было делать это снова.

Нам также пришлось установить скорость обучения «eta0» на 0,1, чтобы она была идентична нашей модели.

Последняя точка - перехват. Так как мы уже включили столбец фиктивных функций с единицами, мы автоматически настраивали перехват, поэтому нам не нужно было включать его в scikit-learn Perceptron.

Все это кажется незначительными деталями, но если бы мы не установили их, мы не смогли бы воспроизвести те же результаты, что и наша модель.

Это важный момент. Прежде чем использовать модель, очень важно прочитать документацию и понять, что делают все различные настройки.

Этот последний шаг в процессе, вероятно, самый важный.

Вы только что прошли всю работу по обучению, ведению заметок, написанию алгоритма с нуля и сравнению его с проверенной реализацией.Не позволяйте всей этой хорошей работе пропасть зря!

Описание процесса важно по двум причинам:

  • Вы получите еще более глубокое понимание, потому что вы учите других тому, что только что узнали.
  • Вы можете продемонстрировать это потенциальным работодателям.
.

Обучение с подкреплением с нуля: проектирование и решение задачи в записной книжке Python | Стерлинг Осборн, доктор философии

Задача

Очень просто: я хочу знать, как лучше всего выбросить лист бумаги в корзину (мусорное ведро) из любого места в комнате. Я могу бросать бумагу в любом направлении или двигаться по одному шагу за раз.

Хотя это просто для человека, который может судить о местонахождении бункера по зрению и имеет огромное количество предварительных знаний о расстоянии, на котором робот должен учиться из ничего.

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

Например, на изображении ниже у нас есть три человека, обозначенные A, B и C. Оба игрока A и B бросают в правильном направлении, но человек A находится ближе, чем B, и поэтому у него более высокая вероятность попадания.

Человек C ближе, чем человек B, но бросает в совершенно неправильном направлении, поэтому вероятность попадания в мусорный бак очень мала.Это может показаться нелогичным, что человек C бросит в этом направлении, но, как мы покажем позже, алгоритм должен сначала попробовать ряд направлений, чтобы выяснить, где находятся успехи, и не будет иметь визуального руководства относительно того, где находится корзина. .

Пример среды задачи

Чтобы создать среду на Python, мы преобразуем диаграмму в двумерные измерения значений x и y и используем математику пеленга для вычисления брошенных углов. Мы использовали нормализованные целочисленные значения x и y, поэтому они должны быть ограничены -10 и 10.

Окружающая среда, сопоставленная с 2-мерным пространством

Среда вероятности

Вероятность успешного броска зависит от расстояния и направления, в котором он был брошен. Следовательно, нам нужно вычислить две меры:

  • Расстояние, на котором текущее положение находится от корзины
  • Разница между углом, под которым была брошена бумага, и истинным направлением к корзине

Измерение расстояния
Как Как показано на графике выше, позиция человека A в наборе равна (-5, -5).Это их текущее состояние, и их расстояние от корзины может быть рассчитано с использованием меры евклидова расстояния:

Для окончательных расчетов мы нормализуем это и меняем значение, чтобы высокий балл указывал, что человек находится ближе к целевой корзине:

Поскольку мы зафиксировали наши двумерные измерения между (-10, 10), максимально возможное расстояние, на котором может находиться человек, равно sqrt {(100) + (100)} = sqrt {200} от корзины. Следовательно, наша оценка расстояния для человека A:

Измерение направления

Человек A затем должен принять решение, двигаться ли он или бросать в выбранном направлении.А пока представьте, что они решили бросить бумагу, их первый бросок находится под углом 50 градусов, а второй - под углом 60 градусов относительно северного направления . Направление корзины от человека А можно вычислить с помощью простой тригонометрии:

Следовательно, первый бросок отклоняется от истинного направления на 5 градусов, а второй - на 15 градусов.

Если учесть, что хорошие броски ограничены 45 градусами по обе стороны от фактического направления (т.е. не в неправильном направлении), то мы можем использовать следующее, чтобы вычислить, насколько хорошо это выбранное направление.Любое направление, выходящее за пределы 45 градусов, даст отрицательное значение и будет сопоставлено с вероятностью 0:

Оба они довольно близки, но их первый бросок с большей вероятностью попадет в корзину.

Расчет вероятности

Таким образом, мы рассчитываем нашу вероятность успешного броска относительно обоих этих показателей:

Создание обобщенной функции вероятности

Хотя предыдущие вычисления были довольно простыми, необходимо принять во внимание некоторые соображения. когда мы обобщаем их и начинаем считать, что корзина или текущее положение не фиксированы.

В нашем предыдущем примере человек A находится на юго-западе от контейнера, поэтому угол был простым вычислением, но если бы мы применили то же самое, чтобы сказать, что человек находится на северо-востоке, это было бы неверно. Кроме того, поскольку контейнер можно разместить в любом месте, нам нужно сначала найти, где находится человек относительно него, а не только в начале координат, а затем использовать это для определения требуемого угла.

Это кратко показано на диаграмме ниже, где мы обобщили каждый из тригонометрических вычислений, основанных на относительном положении человека относительно корзины:

Правила вычисления угла

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

Затем мы вычисляем азимут от человека до мусорного ведра, как показано на предыдущем рисунке, и вычисляем оценку в пределах диапазона +/- 45 градусов. Броски, которые наиболее близки к истинному пеленгу, получают больше очков, тогда как дальние броски получают меньше очков, все, что больше 45 градусов (или меньше -45 градусов), является отрицательным, а затем устанавливается нулевое значение вероятности.

Наконец, общая вероятность связана как с расстоянием, так и с направлением с учетом текущего положения, как показано ранее.

Примечание: я выбрал 45 градусов в качестве границы, но вы можете изменить это окно или вручную масштабировать расчет вероятности, чтобы по-другому взвесить расстояние измерения направления.

Мы пересчитали предыдущие примеры и получили те же результаты, что и ожидалось.

Построение вероятностей для каждого состояния

Теперь, когда у нас есть это как функция, мы можем легко вычислить и построить график вероятностей всех точек в нашей двумерной сетке для фиксированного направления броска.

Вероятности определяются углом, который мы установили в предыдущей функции, в настоящее время это 45 градусов, но при желании его можно уменьшить или увеличить, и результаты будут соответственно меняться.Мы также можем захотеть по-другому масштабировать вероятность для расстояний.

Например, вероятность того, что бумага будет брошена под углом 180 градусов (на юг) для каждого положения x / y, показана ниже.

Анимированный график для всех направлений броска

Чтобы продемонстрировать это дальше, мы можем перебрать несколько направлений броска и создать интерактивную анимацию. Код становится немного сложным, и вы всегда можете просто использовать предыдущий фрагмент кода и вручную изменить параметр «throw_direction», чтобы исследовать различные позиции.Однако это помогает исследовать вероятности, и его можно найти в записной книжке Kaggle.

.

11 шагов к структурированию научной статьи редакторы отнесутся серьезно

перейти к содержанию
  • О Эльзевире
    • О нас
    • Elsevier Connect
    • Карьера
  • Продукты и решения
    • Решения НИОКР
    • Клинические решения
    • Исследовательские платформы
    • Исследовательский интеллект
    • Образование
    • Все решения
  • Сервисы
    • Авторы
    • Редакторы
    • Рецензенты
    • Библиотекарей
  • Магазин и Откройте для себя
    • Книги и журналы
    • Автор Интернет-магазин (Открывается в новом окне)
  • Поиск Поиск
  • Просмотр корзины

    0

.

Как разработать модель машинного обучения с нуля | Виктор Роман

В этой статье мы собираемся подробно изучить, как выполняется процесс разработки модели машинного обучения. Будет объяснено множество концепций, а другие, более конкретные, мы оставим для будущих статей.

Конкретно в статье будет рассмотрено, как:

  • Определить адекватно нашу проблему (цель, желаемые результаты…).
  • Соберите данные.
  • Выберите меру успеха.
  • Установите протокол оценки и различные доступные протоколы.
  • Подготовьте данные (имея дело с пропущенными значениями, с категориальными значениями…).
  • Спилите правильно данные.
  • Проведите различие между переоборудованием и недостаточным соответствием, определив, что это такое, и объяснив, как их избежать.
  • Обзор того, как модель учится.
  • Что такое регуляризация и когда целесообразно ее использовать.
  • Разработайте эталонную модель.
  • Выберите подходящую модель и настройте ее на максимальную производительность.

Первое и самое важное, что нужно сделать, - это выяснить, каковы входные и ожидаемые результаты. Необходимо ответить на следующие вопросы:

  • Какова основная цель? Что мы пытаемся предсказать?
  • Каковы целевые функции?
  • Какие входные данные? Это доступно?
  • С какими проблемами мы сталкиваемся? Бинарная классификация? Кластеризация?
  • Какое улучшение ожидается?
  • Каков текущий статус целевой функции?
  • Как будет измеряться целевой объект?

Не каждую проблему можно решить, пока у нас не будет работающей модели, мы просто сможем сформулировать определенную гипотезу:

  • Наши результаты можно предсказать с учетом входных данных.
  • Наши доступные данные достаточно информативны, чтобы изучить взаимосвязь между входами и выходами

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

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

Существует несколько методов сбора данных, например парсинг веб-страниц, но они выходят за рамки данной статьи.

Обычно наши данные будут иметь следующую форму:

Примечание. Предыдущая таблица соответствует знаменитому набору данных о жилищном строительстве в Бостоне, классическому набору данных, часто используемому для разработки симпл-моделей машинного обучения.Каждая строка представляет отдельный район Бостона, а каждый столбец указывает некоторые характеристики этого района (уровень преступности, средний возраст и т. Д.). Последний столбец представляет собой среднюю стоимость дома в районе, и это целевая цена, которая будет спрогнозирована с учетом другой.

Питер Друкер, преподаватель Гарвардского университета и автор книг «Эффективный руководитель и управление собой», высказал известную поговорку:

«Если вы не можете измерить это, вы не сможете улучшить его».

Если вы хотите контролировать что-то, это должно быть наблюдаемым, и для достижения успеха важно определить, что считается успехом: Может быть, точность? точность? Уровень удержания клиентов?

Эта мера должна быть напрямую согласована с целями более высокого уровня бизнеса. И это также напрямую связано с проблемой, с которой мы сталкиваемся:

  • Задачи регрессии используют определенные метрики оценки, такие как среднеквадратичная ошибка (MSE).
  • В задачах классификации используются такие показатели оценки, как точность, точность и отзывчивость.

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

После того, как цель ясна, следует решить, как будет измеряться прогресс в достижении цели. Наиболее распространенными протоколами оценки являются:

4.1 Поддержание набора проверки удержания

Этот метод состоит в выделении некоторой части данных в качестве набора для тестирования.

Процесс будет заключаться в обучении модели на оставшейся части данных, настройке ее параметров с помощью набора проверки и, наконец, оценке ее производительности на наборе тестирования.

Причина разделения данных на три части - избежать утечки информации. Основное неудобство этого метода состоит в том, что при наличии небольшого количества данных наборы для проверки и тестирования будут содержать настолько мало образцов, что процессы настройки и оценки модели не будут эффективными.

4.2 Проверка K-Fold

K-Fold состоит в разбиении данных на K разделов равного размера. Для каждого раздела i модель обучается с оставшимися разделами K-1 и оценивается на разделе i.

Итоговая оценка - это среднее значение из полученных К. Этот метод особенно полезен, когда производительность модели значительно отличается от разделения поезд-тест.

4.3 Итерационная проверка K-Fold с перетасовкой

Этот метод особенно актуален при наличии небольшого количества доступных данных и необходимости оценки модели как можно точнее (это стандартный подход на соревнованиях Kaggle).

Он заключается в применении проверки K-Fold несколько раз и перетасовке данных каждый раз перед их разделением на разделы K.Итоговый балл - это среднее значение баллов, полученных в конце каждого цикла проверки K-Fold.

Этот метод может быть очень дорогостоящим с точки зрения вычислений, так как количество обученных и оценивающих моделей будет I x K раз. Это I количество итераций и K количество разделов.

Примечание. При выборе протокола оценки важно учитывать следующие моменты:

  • В задачах классификации данные обучения и тестирования должны быть репрезентативными для данных, поэтому перед разделением мы должны перемешать наши данные это, чтобы убедиться, что охватывается весь спектр набора данных.
  • При попытке предсказать будущее с учетом прошлого (прогноз погоды, прогноз курса акций…) данные не следует перемешивать, поскольку последовательность данных является важной особенностью, и это может привести к временной утечке.
  • Мы всегда должны проверять, есть ли в наших данных дубликаты, чтобы удалить их. В противном случае избыточные данные могут появиться как в обучающем, так и в тестовом наборе и вызвать неточное обучение нашей модели.

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

5.1 Работа с недостающими данными

В реальных проблемах довольно часто пропустить некоторые значения наших выборок данных. Это может быть связано с ошибками при сборе данных, пробелами в опросах, измерениями, которые не применимы… и т. Д.

Отсутствующие значения обычно представлены индикаторами «NaN» или «Null». Проблема в том, что большинство алгоритмов не могут обработать эти пропущенные значения, поэтому нам необходимо позаботиться о них, прежде чем передавать данные в наши модели.После того, как они идентифицированы, есть несколько способов справиться с ними:

  1. Удаление образцов или объектов с пропущенными значениями. (мы рискуем удалить релевантную информацию или слишком много выборок)
  2. Ввод недостающих значений с помощью некоторых предварительно построенных оценок, таких как класс Imputer из scikit learn. Мы сопоставим наши данные, а затем преобразуем их, чтобы оценить их. Один из распространенных подходов - установить пропущенные значения как среднее значение для остальных образцов.

5.2 Работа с категориальными данными

При работе с категориальными данными мы работаем с порядковыми и номинальными признаками. Порядковые признаки - это категориальные признаки, которые можно сортировать (размер ткани : L ). А по номиналу не подразумевается какой-либо заказ ( цвет ткани: желтый, зеленый, красный ).

Методы работы с порядковыми и номинальными признаками:

  • Отображение порядковых признаков : чтобы убедиться, что алгоритм правильно интерпретирует порядковые признаки, нам необходимо преобразовать категориальные строковые значения в целые числа.Часто мы делаем это сопоставление вручную. Пример: L: 2, M: 1, S: 0.
  • Кодирование меток номинального класса : Наиболее распространенным подходом является выполнение однократного кодирования, которое заключается в создании нового фиктивного объекта для каждого уникального значения в столбце номинального признака. Пример: в столбце цвета, если у нас есть три класса: желтый, красный, зеленый и выполняется одноразовое кодирование, мы получим три новых столбца, по одному для каждого уникального класса. Тогда, если у нас есть желтая рубашка, она будет выбрана как: желтый = 1, зеленый = 0, красный = 0.Это сделано для обеспечения хорошей производительности алгоритма, поскольку они намного более эффективны при работе с разреженной матрицей (матрицы с низкой плотностью, с большим количеством значений 0).

5.3 Масштабирование функций

Это важный шаг на этапе предварительной обработки, так как большинство алгоритмов машинного обучения работают намного лучше при работе с функциями того же масштаба. Наиболее распространены следующие методы:

  • Нормализация: это изменение масштаба функций в диапазоне [0,1], что является частным случаем масштабирования min-max.Чтобы нормализовать наши данные, нам просто нужно применить метод масштабирования min-max к каждому столбцу функций.
  • Стандартизация: она заключается в центрировании столбцов признаков по среднему значению 0 со стандартным отклонением 1, чтобы столбцы признаков имели те же параметры, что и стандартное нормальное распределение (нулевое среднее и единичное отклонение). Это значительно упрощает алгоритмам обучения определение весов параметров. Кроме того, он сохраняет полезную информацию о выбросах и делает алгоритмы менее чувствительными к ним.

5.4 Выбор значимых функций

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

Одним из наиболее распространенных способов избежать переобучения является уменьшение размерности данных. Это часто делается за счет уменьшения количества функций в нашем наборе данных с помощью анализа основных компонентов (PCA), который является разновидностью алгоритма неконтролируемого машинного обучения.

PCA выявляет закономерности в наших данных на основе корреляций между признаками. Эта корреляция означает, что в наших данных есть избыточность, другими словами, что есть некоторая часть данных, которую можно объяснить с помощью других ее частей.

Эти коррелированные данные не являются существенными для модели, чтобы правильно узнать свои веса, и поэтому их можно удалить. Его можно удалить, напрямую удалив определенные столбцы (признаки) или объединив их несколько и получив новые, которые содержат большую часть информации.Мы углубимся в эту технику в будущих статьях.

5.5 Разделение данных на подмножества

В общем, мы разделим наши данные на три части: наборы для обучения, тестирования и проверки. Мы обучаем нашу модель на обучающих данных, оцениваем ее на данных проверки и, наконец, когда она будет готова к использованию, тестируем ее в последний раз на тестовых данных.

Теперь уместно задать следующий вопрос: почему не использовать только два подхода, тренировку и тестирование? Таким образом, процесс будет намного проще: просто обучите модель на данных обучения и протестируйте ее на данных тестирования.

Ответ заключается в том, что разработка модели включает настройку ее конфигурации, другими словами, выбор определенных значений для их гиперпараметров (которые отличаются от параметров модели - весов сети). Эта настройка выполняется на основе обратной связи, полученной от проверочного набора, и, по сути, является формой обучения.

Конечная цель состоит в том, чтобы модель могла хорошо обобщать невидимые данные, другими словами, предсказывать точные результаты на основе новых данных на основе ее внутренних параметров, скорректированных во время обучения и проверки.

a) Процесс обучения

Мы можем более подробно рассмотреть, как происходит процесс обучения, изучив один из простейших алгоритмов: линейную регрессию.

В линейной регрессии нам дается ряд переменных-предикторов (объясняющих) и переменная непрерывного отклика (результат), и мы пытаемся найти взаимосвязь между этими переменными, которая позволяет нам прогнозировать непрерывный результат.

Пример линейной регрессии: для заданных X и Y мы подбираем прямую линию, которая минимизирует расстояние, используя некоторые методы оценки коэффициентов (например, обычных наименьших квадратов и градиентного спуска) между точками выборки и подобранной линией.Затем мы будем использовать полученные данные о пересечении и наклоне, которые образуют подобранную линию, чтобы предсказать результат для новых данных.

Формула прямой: y = B0 + B1x + u . Где x - входные данные, B1 - наклон, B0 - точка пересечения по оси Y, u - остаток и y - значение линии в позиции x .

Доступные для обучения значения: B0 и B1 , которые влияют на положение строки, поскольку единственными другими переменными являются x (вход и y, выход (остаток не учитывается). ).Эти значения ( B0 и B1 ) являются «весами» функции прогнозирования.

Эти веса и другие, называемые смещениями, представляют собой параметры, которые будут организованы вместе в виде матриц ( W, для весов и b для смещений).

Процесс обучения включает в себя инициализацию некоторых случайных значений для каждой из обучающих матриц и попытку предсказать вывод входных данных с использованием начальных случайных значений. Вначале ошибка будет большой, но, сравнивая прогноз модели с правильными выходными данными, модель может корректировать значения весов и смещений, пока не будет получена хорошая модель прогнозирования.

Процесс повторяется, по одной итерации (или шагу) за раз. На каждой итерации исходная случайная линия приближается к идеальной и более точной.

b) Переоснащение и недостаточное оснащение

Одной из наиболее важных проблем при рассмотрении обучения моделей является противоречие между оптимизацией и обобщением.

  • Оптимизация - это процесс настройки модели для получения максимальной производительности на обучающих данных (процесс обучения).
  • Обобщение - насколько хорошо модель работает с невидимыми данными.Цель состоит в том, чтобы получить наилучшую способность к обобщению.

В начале обучения эти две проблемы коррелируют: чем меньше потери данных обучения, тем меньше потери тестовых данных. Это происходит, когда модель еще недостаточно приспособлена: еще предстоит научиться, еще не смоделированы все соответствующие параметры модели.

Но после нескольких итераций обучающих данных обобщение перестает улучшаться, и показатели проверки сначала замораживаются, а затем начинают ухудшаться.Модель начинает переоснащаться: она настолько хорошо усвоила обучающие данные, что усвоила шаблоны, которые слишком специфичны для обучающих данных и не имеют отношения к новым данным.

Есть два способа избежать этого переобучения: получение дополнительных данных и регуляризация.

  • Получение большего количества данных обычно является лучшим решением, модель, обученная на большем количестве данных, естественно, будет лучше обобщать.
  • Регуляризация выполняется, когда последнее невозможно, это процесс изменения количества информации, которую может хранить модель, или добавления ограничений на то, какую информацию ей разрешено хранить.Если модель может запомнить только небольшое количество шаблонов, оптимизация заставит ее сосредоточиться на наиболее релевантных из них, повышая вероятность хорошего обобщения.

Регуляризация выполняется в основном следующими методами:

  1. Уменьшение размера модели: уменьшение количества обучаемых параметров в модели, а вместе с ними и ее способности к обучению. Цель состоит в том, чтобы найти золотую середину между слишком большой и недостаточной способностью к обучению. К сожалению, нет никаких волшебных формул для определения этого баланса, его нужно проверять и оценивать, задав различное количество параметров и наблюдая за его работой.
  2. Добавление регуляризации веса: В целом, чем проще модель, тем лучше. Пока она может хорошо учиться, более простая модель вряд ли переобучится. Обычный способ добиться этого - ограничить сложность сети, заставив ее веса принимать только небольшие значения, упорядочивая распределение значений весов. Это делается путем добавления к функции потерь сети стоимости, связанной с большими весами. Стоимость возникает двумя способами:
  • Регуляризация L1: Стоимость пропорциональна абсолютному значению весовых коэффициентов (норма весов L1).
  • Регуляризация L2: Стоимость пропорциональна квадрату значения весовых коэффициентов (норма весов l2)

Чтобы решить, какие из них применить к нашей модели, рекомендуется иметь в виду следующую информацию: примите во внимание природу нашей проблемы:

Цель на этом этапе процесса - разработать эталонную модель, которая будет служить нам в качестве базовой линии, после того как мы измерим производительность более совершенного и настроенного алгоритма.

Бенчмаркинг требует, чтобы эксперименты были сопоставимыми, измеримыми и воспроизводимыми.Важно подчеркнуть воспроизводимую часть последнего утверждения. В настоящее время библиотеки науки о данных выполняют случайное разбиение данных, причем эта случайность должна быть согласованной во всех прогонах. Большинство генераторов случайных чисел поддерживают установку начального числа для этой заливки. В Python мы будем использовать метод random.seed из пакета random.

Как показано на «https://blog.dominodatalab.com/benchmarking-predictive-models/»

«Часто бывает полезно сравнить улучшение модели с упрощенной базовой моделью, такой как kNN или Naive Bayes для категориальных данных. или EWMA значения в данных временного ряда.Эти базовые показатели дают представление о возможной прогнозирующей способности набора данных.

Модели часто требуют гораздо меньше времени и вычислительной мощности для обучения и прогнозирования, что делает их полезными для перекрестной проверки жизнеспособности ответа. Ни kNN, ни наивные байесовские модели вряд ли улавливают сложные взаимодействия. Тем не менее, они предоставят разумную оценку минимальной границы прогностических возможностей тестируемой модели.

Кроме того, это упражнение дает возможность протестировать конвейер тестирования.Важно, чтобы тестовые конвейеры обеспечивали стабильные результаты для модели с понятными характеристиками производительности. KNN или наивный байесовский метод для необработанного набора данных, или минимально управляемый с помощью центрирования или масштабирования столбцов, часто дает слабого, но адекватного обучаемого с характеристиками, которые полезны для целей сравнения. Характеристики более сложных моделей могут быть менее понятны и могут оказаться сложными ».

7.1 Поиск хорошей модели

Одним из наиболее распространенных методов поиска хорошей модели является перекрестная проверка.При перекрестной проверке мы установим:

  • Количество складок, по которым мы разделим наши данные.
  • Метод подсчета баллов (зависит от природы проблемы - регрессия, классификация…).
  • Некоторые подходящие алгоритмы, которые мы хотим проверить.

Мы передадим наш набор данных в функцию оценки перекрестной проверки и получим модель, которая дала лучший результат. Это будет тот, который мы будем оптимизировать, соответствующим образом настроив его гиперпараметры.

  # Параметры тестирования и метрики оценки  
num_folds = 10
scoring = "neg_mean_squared_error" # Алгоритмы выборочной проверки
models = []
models.append (('LR', LinearRegression ()))
models.append (('LASSO', Lasso ()))
models.append (('EN', ElasticNet ()))
models.append (('KNN ', KNeighborsRegressor ()))
models.append ((' CART ', DecisionTreeRegressor ()))
models.append ((' SVR ', SVR ()))

results = []
names = []
для имени , модель в моделях:
kfold = KFold (n_splits = num_folds, random_state = seed)
cv_results = cross_val_score (model, X_train, y_train, cv = kfold, scoring = scoring)
results.append (cv_results)
name.append (name)
msg = "% s:% f (% f)"% (name, cv_results.mean (), cv_results.std ())
print (msg)

   # Сравнить алгоритмы   
fig = pyplot.figure ()
fig.suptitle ('Сравнение алгоритмов')
ax = fig.add_subplot (111)
pyplot.boxplot (результаты)
ax.set_xticklabels (имена)
pyplot.show ()

7.2 Настройка Гиперпараметры модели

Алгоритм машинного обучения имеет два типа параметров. Первый тип - это параметры, которые изучаются на этапе обучения, а второй тип - это гиперпараметры, которые мы передаем модели машинного обучения.

После определения модели, которую мы будем использовать, следующим шагом будет настройка ее гиперпараметров для получения максимально возможной предсказательной силы. Самый распространенный способ найти лучшую комбинацию гиперпараметров - это перекрестная проверка поиска по сетке.

Процесс будет следующим:

  • Установите сетку параметров, которую мы будем оценивать. Мы сделаем это, создав словарь всех параметров и соответствующих им наборов значений, которые вы хотите протестировать на лучшую производительность.
  • Задайте количество складок, случайное состояние и метод оценки.
  • Постройте объект K-Fold с выбранным количеством складок.
  • Создайте объект поиска по сетке с выбранной моделью и подогнайте его.
  # Построить масштабировщик  
scaler = StandardScaler (). Fit (X_train)
rescaled X = scaler.transform (X_train) # Построить сетку параметров
c_values ​​= [0.1, 0.3, 0.5, 0.7, 0.9, 1.0 , 1.3, 1.5, 1.7, 2.0]
kernel_values ​​= ['linear', 'poly', 'rbf', 'sigmoid']
param_grid = dict (C = c_values, kernel = kernel_values) # Построить модель
model = SVC ()
kfold = KFold (n_splits = num_folds, random_state = seed)
grid = GridSearchCV (оценка = модель, param_grid = param_grid, scoring = scoring, cv = kfold)
grid_result = grid.fit (rescaledX, y_train) # Показать результаты
print ("Лучшее:% f с использованием% s"% (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results _ ['mean_test_score']
stds = grid .cv_results _ ['std_test_score']
params = grid_result.cv_results _ ['params']
для среднего, stdev, param в zip (означает, stds, params):
print ("% f (% f) with:% r" % (mean, stdev, param))

Этот метод возвращает набор гиперпараметров, который лучше всего подходит для решения данной проблемы.Как только они определены, наша модель готова к использованию. Итак, мы сделаем соответствующие прогнозы на основе набора данных проверки и сохраним модель для дальнейшего использования.

В этой статье мы рассмотрели множество важных концепций. Несмотря на то, что мы предоставили их общий обзор, это необходимо, чтобы получить хорошее представление о том, как и когда применять объясненные методы.

Мы рассмотрим эти методы более глубоко, поскольку они будут появляться в следующих статьях, а также его реализации на Python.

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

Спасибо за чтение и следите за обновлениями!

.

Смотрите также