Рубрики
Без рубрики

K-nearest сосед и Amazon Sagemaker

В этом уроке мы углубимся в алгоритм K-ближайшего соседа (K-NN). Один из самых простых … Tagged MachineLearning, AWS, Python, Tutorial.

В этом уроке мы в углублении в углублении K-nearest сосед (K-NN) алгоритм. Один из самых простых, но очень мощных алгоритмов, который можно использовать для решения очень сложных задач. Мы начнем с некоторых основных концепций, которые всегда играют неотъемлемая роль, независимо от того, какой алгоритм мы выбираем, и это поможет нам установить предпосылку, прежде чем мы погрузимся в глубокие в k -Nn. Затем мы приступим к решению некоторых проблем на Amazon Sagemaker с встроенными k -Nn, индексный алгоритм.

Но прежде чем мы пойдем дальше, я также хотел бы поблагодарить моего учителя, Срикант Варму, сэр, за то, что они направили меня и 100 тысяч студентов, таких как я по всему миру. Без него я бы не мечтал о том, чтобы попасть в этот замечательный мир машинного обучения. Эта запись полностью основана на классе, который я посещал из его курса по адресу Appliedai на k-nearest сосед.

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

Классификация являются проблемами, при которых этикетки класса/целевые имеют конечный набор результатов. Давайте возьмем пример Amazon Fine Food Набор данных, в котором у нас есть многочисленные Отзывы клиентов и каждый обзор имеет классной ярлык положительный или отрицательный Анкет Теперь проблема в нашей руке заключается в том, что нам нужно обучить модель, чтобы, учитывая новый Обзор Текст, наша модель должна быть в состоянии определить/предсказать, является ли обзор положительный или отрицательный Анкет

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

Тогда как в Регрессия Проблемы, этикетка класса/целевого цвета имеет бесконечный набор результатов, или, другими словами, это может быть любое реальное число. Например, представьте, что у нас есть набор данных студентов с функциями ввода как «возраст, пол и раса» и метка класса/целевого языка как Высота Анкет И теперь нам нужно обучить модель так, чтобы, как только модель обучена, она должна быть в состоянии предсказать Высота студента, данный ей/Его Возраст, пол и раса Анкет

Здесь, если мы увидим, Высота может быть любое реальное число (например, 170 см, 172,65 см и т. Д.), Который Невозможно быть Итак, мы можем назвать такие проблемы, как Регрессия проблема.

Математическая нотация

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

Давайте возьмем тот же пример набора данных Amazon Fine Review, где у нас есть n Номера отзывов пользователей с этикетками класса как положительный или отрицательный , что определяет, что конкретный обзор пользователя может быть либо положительный Обзор или отрицательный обзор. Итак, первое, что мы обычно делаем, это то, что мы преобразуем каждый обзор в вектор (Вы можете думать о векторе как массив чисел), и мы всегда можем представлять вектор как вектор столбцов или ряд вектор Анкет Ученые по данным и практикующий врач машинного обучения используют и то, и другое, но если кто -то просто ссылается на точку данных как вектор, можно с уверенностью предположить, он ссылается на Вектор столбцов Анкет Сказав это, большую часть времени у нас будет контекст, который поможет нам определить, что данное вектор - это вектор столбца или вектор строки.

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

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

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

Здесь мы представляли этикетки класса как Y и каждый Yi может быть 1 или 0 (положительный или отрицательный обзор). Итак, если мы посмотрим сейчас, мы математически преобразовали весь набор данных в форме вектор и Матрица Анкет

Вы можете задаться вопросом, как мы можем преобразовать каждый обзор в массив числа на первом месте, так как все обзоры будут в виде простого текста. Существуют разные методы участия в таких методах Лук , Tfidf и Word2VEC можно использовать. Например, в Bow и TFIDF длиной каждого обзора будет количество уникальных слов во всем корпусе. Принимая во внимание, что для Word2VEC каждый обзор будет вектором с фиксированным размером. Мы не будем вдаваться в подробности тех, кто в этом уроке, но я бы посоветовал вам исследовать несколько из этих методов, это довольно интересно.

Итак, наконец, мы можем представлять набор данных математически как:

Мы должны прочитать приведенное выше уравнение как, D это набор пар XI а также Yi где я уходит от 1 к n , так что XI принадлежит Rd , это XI это D Размерный вектор, где D Может быть любые реальные значения, а Yi принадлежит {0, 1} Анкет

К-ближайшие соседи

Теперь мы можем наконец погрузиться, K-nearest соседей (K-NN) Анкет Это также часто знает как Ленивое обучение Алгоритм, который может быть использован как для задач регрессии, так и для классификации. Но прежде чем мы перейдем к формальному определению, давайте постараемся понять алгоритм K-NN из геометрического проспекта, и мы сделаем это, взяв простой пример бинарной классификации. Предположим, что у нас есть набор данных, в котором каждая точка данных может принадлежать учебный класс A или Класс B Анкет

Вся цель машинного обучения – выучить функцию f (x) Из данного набора данных, так что позже, после окончания обучения, когда мы запросили новую точку данных и функцию f (x) должен иметь возможность предсказать, какой класс принадлежит точкам данных. Теперь, в этом примере, подумайте, что у нас есть новая точка запроса Q что мы даем модели, и нам нужно знать, какой класс этот новый вопрос запроса Q принадлежит класс A или Класс B

Теперь, если мы интуитивно думаем об этом, мы сможем увидеть это геометрически, этот вопрос запроса Q может принадлежать Класс B Как все точки, которые являются закрытыми соседями точки запроса Q принадлежит класс б

И мы можем заключить это интуицией близости или близости. И вот что k-nn Алгоритм – это все, где k обозначает нет. соседей, и существуют разные методы, чтобы узнать наилучшую возможную ценность k , что мы рассмотрим чуть позже.

Давайте возьмем новый пункт запроса S , и на этот раз скажем, мы выбираем k = 4 , Итак, теперь мы можем увидеть ниже, что из 4 соседей Query Point S , три из них принадлежат Класс B и один из них принадлежит учебный класс A , Итак, k-nn сделает вывод, что пункт запроса S принадлежит Класс B , поскольку большинство соседей принадлежат класс б

Итак, что k-nn делает на высоком уровне для любого классификация Проблема в следующем:

  • Находит k Ближайшие соседи запрос точка q
  • Примечания Классовые ярлыки Для всех этих соседей
  • Принимает Большинство голосов Из всех Классовые ярлыки и какой бы класс получил Максимум Голосуйте, он объявляет то же самое, что и этикетка класса для запрос точка Q.

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

Точно так же в случае k-nn для Регрессия Проблемы, мы делаем то же самое, но вместо Большинство голосов Это занимает любое среднее или медиана Из всех меток класса, как и в случае с этикетками класса регрессии, будут любые Реальное число Анкет И статистически медиана было бы немного менее склонно к выбросам/шуму.

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

Расстояние меры

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

Давайте возьмем пример. Предположим, что у нас есть 2 балла (A и B), и у нас есть две входные функции (F1 и F2).

Мы видим, что расстояние между этими двумя точками A и B можно рассчитать с помощью простого Теорема Пифагора что было бы кратчайшим расстоянием между этими двумя точками, и мы можем обозначить его как D Анкет И в машинном обучении или в геометрии (в целом) это расстояние называется Евклидово расстояние Анкет Таким образом, это в основном кратчайшее расстояние между двумя точками данных или векторами.

Теперь, если мы рассмотрим, что наш набор данных содержит более 2 функций, скажем, D Особенности, затем евклидовое расстояние между 2 точками данных (x1 и x2), каждая с D Особенности будут следующими:

Это указанное на расстоянии также называется L2 Норма вектора, в простых терминах, мы обычно называем их:

  • Евклидовое расстояние, когда мы рассмотрим 2 точки
  • L2 Норма, когда мы рассмотрим 2 векторы

Вскоре мы увидим, почему это называется L2, но важно помнить, это то, что если кто -то ссылается на евклидовое расстояние или норму L2, мы можем предположить, что они ссылаются на одно и то же расстояние, но в другом контексте (точки и векторы соответственно )

Существует еще одна мера расстояния, называемое Манхэттенским расстоянием, которое геометрически представлено следующим образом:

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

И это расстояние часто называют L1 Норма вектора.

До сих пор мы видели два разных типа мер на расстоянии, Euclidian (L2 Norm) и Манхэттен (Норма L1) . У нас также есть обобщение этих двух L1 и L2 Нормы, которые называются LP Норма, также знаю как Минковский Расстояние, где P может быть любой номер.

Итак, если мы посмотрим на это, мы бы поняли это:

  • Когда p = 1 , Минковский Расстояние становится Манхэттен расстояние
  • Когда p = 2 , Минковский Расстояние становится Евклидовый расстояние

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

Итак, чтобы подвести итог, мы должны помнить:

  • Мы ссылаемся на Расстояние , когда мы думаем о 2 точки
  • Мы ссылаемся на Норма , когда мы думаем о 2 векторы
  • Манхэттенское расстояние между 2 точки такой же, как L1 Норма 2 векторы
  • Евклидово расстояние между 2 точки такой же, как L2 Норма 2 векторы
  • Минковский расстояние между 2 точки такой же, как LP Norm 2 векторы

Позже мы увидим, когда вступим в практику, встроенный встроенный алгоритм K-NN Amazon SageMaker использует норму L2 (евклидовое расстояние) в качестве меры расстояния по умолчанию.

K-NN и его эффективность

Теперь, когда мы узнали немного о различных показателях расстояния, давайте теперь попробуем сопоставить ее с нашей основной темой k-nn и поместите некоторые числовые значения, чтобы измерить, и понять, насколько хорошо и эффективно наши k-nn Алгоритм есть. Давайте вернемся к нашей проблеме Amazon Fine Food Review, и, чтобы быстро повторить проблему, была проблема: Учитывая новый обзор продуктов питания ( rq ), мы должны предсказать ее полярность, где полярность означает, является ли обзор положительный или отрицательный Анкет

Мы узнали, как работает K-NN, это требует k Ближайшие соседние точки, проверяют их лейбл класса и принимают Большинство голосов Анкет Но как мы узнаем, насколько хорош наше алгоритм?

Давайте сделаем стратегию:

  1. Давайте возьмем набор данных D , который имеет все ” n ” нет. отзывы.
  2. Теперь давайте разберем набор данных D , в две подгруппы, D_train и D_test , так что любой отдельный обзор будет частью любого D_test или D_train , но не для обоих. Где D_train Набор данных будет использоваться во время Обучение и D_test будет использоваться во время тестирование
  3. И после того, как мы тренируем K-NN с D_train , мы можем выбрать каждую точку из D_test и используйте этот набор данных D_train а также k-nn Чтобы получить соответствующий Классовая метка (прогноз).
  4. Как только мы получим предсказанный класс метку, мы можем сравнить прогноз с фактической меткой класса, чтобы понять точность модели.

Но вот самое смешное, k-nn Говорят, что это ленивый ученик. Например, нет такой фазы обучения в реальном среднем, в отличие от алгоритма машинного обучения. На этапе обучения он просто загружает все данные поезда в оперативную память. Кроме того, нет обучения. Фактическая задача прогнозирования начинается на фазе испытаний. Следовательно, мы напрямую взяли точку запроса и измеряем k Ближайшие точки в учебных данных, а затем сделайте Большинство голосования классовых ярлыков для всех этих k точки. Следовательно, нет учебной фазы алгоритма. Поскольку этап обучения состоит только из хранения точек данных, мы говорим, что в KNN нет обучения.

Таким образом, мы можем представить, что K-NN имеет большую сложность пространства, если набор данных большой, для обработки потребуется много памяти. Также с точки зрения сложности времени, это довольно высока, поскольку он должен измерить расстояние точки запроса от всех точек, присутствующих в D_train . Например, допустим, у нас есть n точек данных в D_train и каждая точка – D измерение. В этом случае это займет приказ O (nd) Время вычислить ближней соседа K-ближайшего из точки запроса. Это опасно, если вы думаете интуитивно. Представьте себе, вы находитесь на Amazon.com и публикуете обзор продукта, который вы купили. Теперь, допустим, я запускаю K-NN на бэкэнд на Amazon.com, задача которой состоит в том, чтобы классифицировать каждый новый обзор на положительный или отрицательный, и если система принимает O (nd) Время, чтобы придумать прогноз, может потребоваться несколько минут, чтобы классифицировать обзор, и это совсем не полезно.

Это ограничение, которое мы имеем с K-NN, в его простейшей форме он имеет большую сложность пространства и времени, когда набор данных большой. Сказав это, есть много методов, которые помогают оптимизировать этот алгоритм, такой как KD-Tree , LSH (чувствительное к местности хеширование) , так далее. Хотя они не идеальны, но эти методы могут значительно уменьшить сложность пространства/времени K-NN.

Как выбрать правильный k?

До сих пор мы предполагали значение k как 3, 5, 7 и т. Д. И мы узнали, что всегда полезно иметь какое -то странное число, чтобы избежать какого -либо ничьей, при этом проведя большинство голосов. Но что должно быть правильным значением k Что даст нам лучшую точность для нашей соответствующей проблемы, которую мы пытаемся решить, используя K-NN?

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

  • Когда k = 1 : Это означает, для данной точки запроса, класс Метка для этой точки запроса будет такой же, как и класс ярлык своего ближайшего соседа. Итак, здесь класс метка для точки запроса q будет +ve
  • Когда k = 5 : Для этого следующего пункта запроса этикетка класса будет +ve Как из 5 самых близких соседей, у 4 из них есть классная метка +ve
  • Когда k = n : Это означает, что, допустим, у нас есть 1000 точек данных, и, независимо от того, где находится точка запроса, K-NN всегда будет предсказать этикетку класса, в которой большинство классов имеют большую часть класса, например Если из 1000 точек данных, если 400 принадлежит +ve и 600 принадлежит -ve Независимо от того, какой фактический класс точки запроса, прогноз был бы всегда -ve Анкет

Теперь мы можем геометрически построить поверхность решения , и мы увидим что -то вроде этого:

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

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

В машинном обучении мы часто сталкиваемся с этими терминами, Переоценка и BONDFIT Анкет Если вы рассмотрите вышеупомянутый сюжет, когда k = 1 , другими словами, мы могли бы классифицировать точку запроса из -за некоторого шума, если поверхность моего решения очень грубое, что фактически указывает на то, что поверхность захватывает большую часть шумной/выброса точки данных. И в этих случаях мы называем модель как Переоценка Анкет

Напротив этого, если у нас есть тупая модель, где модель не очень заботится о данных, и она классифицирует любую новую точку запроса на основе большинства класса всего набора данных, как то, что мы видели, когда k = n , такие модели называются BONDFIT Анкет

И относительно плавная поверхность решения может рассматриваться как Хорошо подходит модель, как то, что мы видели, когда k = 5 Хотя это также делает неправильный прогноз, но в целом это хорошая и предпочтительная модель, чтобы иметь завышенную модель. Это как бы проходит средний путь между Переоценка и BONDFIT Анкет

Потребность в перекрестной проверке

Наконец, его стоит пройти Перекрестная проверка Кратко, прежде чем перейти к рукам, как мы обсуждали о k-nn Анкет

Первоначально ученые использовали для разделения набора данных на поезд и тест Наборы данных, которые мы видели выше. Они просто привыкли поместиться модель на поезд Данные с различным набором значений ‘k’ и используются для проверки производительности на тест Данные против всех моделей, а затем какое -либо значение «K» использовалось, чтобы дать наилучшие результаты на тест Данные, это было бы считалось оптимальным значением k. Но с помощью этого процесса мы сможем вписать модель в данных поезда и вычислить гиперпараметр (который является не чем иным, как значением k ) с использованием тестовых данных, но не в состоянии создать модель, которая может хорошо обобщать на полностью невидимый Данные (т.е. , данные, которые не использовались на фазе обучения и перекрестной проверки). До сих пор модель строила работает лучше на поезде и тестовых данных, поскольку она уже видел их обоих в вычислении ближайших соседей и значении «K».

Итак, пришел новый процесс под названием Перекрестная проверка (CV) где данный набор данных разделен на 3 имена частей поезд , CV и тест где они привыкли подходит Модель на данных поезда, вычислить Гиперпараметры (Правильное значение k ) на основе данных CV, а затем сделайте модель обобщать к тестовым данным (т.е., проверяя, насколько хорошо модель работает на невидимых данных). Таким образом, хотя модель уже видела данные поезда и резюме во время вычисления ближайших соседей (NN) и значения ‘K’, но это не Видно из данных тестирования и, таким образом, обобщение модели с использованием тестовых данных достигли цели построения модели машинного обучения. Но здесь снова есть недостаток. Поскольку мы разделяем данные на 3 части сейчас, тренируются, резюме и тест, скажем, в соотношении 60%, 20% и 20% соответственно, так что мы в конечном итоге делаем, мы используем только 60% данных для Вычислите наш NN (используя учебные данные) и 20% данных для вычисления k (Используя данные CV) и REST 20% для тестирования (используя тестовые данные, мы используем только 60% Data Compute NN, что довольно меньше, и мы знаем в целом в машинном обучении больше данных обучения, лучше – алгоритм Анкет

Таким образом, идея состоит в том, чтобы найти какой -то путь, в котором мы можем использовать более 60% данных для обучения. И вот идет K-Crold Cross Validation для нашего спасения. Не путайтесь с K-FOLD и K-NN, оба из этих k разные. Мы можем просто подумать о k как переменная, которая может быть любому числу. Давайте возьмем быстрый пример и поймем это K-Crold Cross Validation Анкет

Чтобы выполнить перекрестную проверку, обычно данные разделены на D (поезд) , D (CV) и D (тест) с 60%, 20% и 20% данных соответственно (как мы упоминали ранее). Но для достижения хорошей функции алгоритма K-NN следует использовать больше данных для обучения вместо 60%. И так как мы ничего не можем с D (тест) Данные, так как мы не должны трогать это и сохранять их так, как невидимый Данные, чтобы мы могли использовать то же самое, чтобы проверить точность нашей модели. Поэтому мы смешиваем оставшиеся 80% данных, которые состоит из D (поезд) и D (CV) Анкет

Предположим, что значение k = 4 Для перекрестной проверки k-clord мы можем назвать это как 4-кратный перекрестная проверка.

Итак, эти 80% данных мы разделили его на 4 равных частях (D1, D2, D3, D4), и это делается случайным образом. И теперь из этих частей мы стараемся найти лучшие NN и K, взяв три части в качестве обучения данных и 1 часть в качестве данных CV, и это делается для каждой комбинации 4 частей, а также для каждого значения k. Например, D1, D2 и D3 будут выступать в качестве обучающих данных, а D4 используются, чтобы найти точность из учебных данных (D1, D2, D3), принимая ценность, и, скажем, мы получаем точность от каждой итерации как A1, A2 , A3 и A4. Теперь, чтобы найти окончательную точность для значения, мы принимаем среднее значение всей точности. И этот же процесс выполняется для всех значений k, например, 2,3,4 ….. n. Из этого график построен, а лучший K можно наблюдать.

Проблема

Набор данных Мы используем информацию, собранную Геологической службой США и Лесной службой США о районах дикой природы в Северном Колорадо. Особенности представляют собой измерения, такие как тип почвы, высота и расстояние до воды, и этикетки кодируют тип деревьев – тип лесного покрова – для каждого места. Задача машинного обучения состоит в том, чтобы предсказать тип крышки в данном месте, используя функции. В целом есть семь типов обложки.

Amazon Sagemaker Notebook

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

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

Загрузка необходимых модулей

Давайте загрузим набор данных и сохраните его в папке

%%bash
wget 'https://archive.ics.uci.edu/ml/machine-learning-databases/covtype/covtype.data.gz'
mkdir -p /tmp/covtype/raw
mv covtype.data.gz /tmp/covtype/raw/covtype.data.gz 

Предварительная обработка данных

Теперь, когда у нас есть необработанные данные, давайте обработаем их. Сначала мы загрузим данные в массивы Numpy и случайным образом разделим их на поезд и тестируем с разделением 90/10.

import numpy as np
import os

data_dir = "/tmp/covtype/"
processed_subdir = "standardized"
raw_data_file = os.path.join(data_dir, "raw", "covtype.data.gz")
train_features_file = os.path.join(data_dir, processed_subdir, "train/csv/features.csv")
train_labels_file = os.path.join(data_dir, processed_subdir, "train/csv/labels.csv")
test_features_file = os.path.join(data_dir, processed_subdir, "test/csv/features.csv")
test_labels_file = os.path.join(data_dir, processed_subdir, "test/csv/labels.csv")

# read raw data
print("Reading raw data from {}".format(raw_data_file))
raw = np.loadtxt(raw_data_file, delimiter=',')

# split into train/test with a 90/10 split
np.random.seed(0)
np.random.shuffle(raw)
train_size = int(0.9 * raw.shape[0])
train_features = raw[:train_size, :-1]
train_labels = raw[:train_size, -1]
test_features = raw[train_size:, :-1]
test_labels = raw[train_size:, -1]

Загрузите на Amazon S3

Теперь, поскольку обычно набор данных будет большим и расположен в Amazon S3, давайте напишем данные на Amazon S3 в recordio-protobuf формат. Сначала мы создаем буфер iO, обертывая данные, затем мы загружаем их в Amazon S3.

import io
import boto3
import os
import sagemaker
import sagemaker.amazon.common as smac

bucket = "my-ai-bucket-suman"
prefix = "knn"
key = "recordio-pb-data"

print('train_features shape = ', train_features.shape)
print('train_labels shape = ', train_labels.shape)

buf = io.BytesIO()
smac.write_numpy_to_dense_tensor(buf, train_features, train_labels)
buf.seek(0)

boto3.resource('s3').Bucket(bucket).Object(os.path.join(prefix, 'train', key)).upload_fileobj(buf)
s3_train_data = 's3://{}/{}/train/{}'.format(bucket, prefix, key)
print('uploaded training data location: {}'.format(s3_train_data))

print('test_features shape = ', test_features.shape)
print('test_labels shape = ', test_labels.shape)

buf = io.BytesIO()
smac.write_numpy_to_dense_tensor(buf, test_features, test_labels)
buf.seek(0)

boto3.resource('s3').Bucket(bucket).Object(os.path.join(prefix, 'test', key)).upload_fileobj(buf)
s3_test_data = 's3://{}/{}/test/{}'.format(bucket, prefix, key)
print('uploaded test data location: {}'.format(s3_test_data))

Выход:

train_features shape =  (522910, 54)
train_labels shape =  (522910,)
uploaded training data location: s3://my-ai-bucket-suman/knn/train/recordio-pb-data
test_features shape =  (58102, 54)
test_labels shape =  (58102,)
uploaded test data location: s3://my-ai-bucket-suman/knn/test/recordio-pb-data

Подготовка

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

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

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

import matplotlib.pyplot as plt

import sagemaker
from sagemaker import get_execution_role
from sagemaker.predictor import csv_serializer, json_deserializer
from sagemaker.amazon.amazon_estimator import get_image_uri


def trained_estimator_from_hyperparams(s3_train_data, hyperparams, output_path, s3_test_data=None):
    """
    Create an Estimator from the given hyperparams, fit to training data, 
    and return a deployed predictor

    """
    # set up the estimator
    knn = sagemaker.estimator.Estimator(get_image_uri(boto3.Session().region_name, "knn"),
        get_execution_role(),
        train_instance_count=1,
        train_instance_type='ml.m5.2xlarge',
        output_path=output_path,
        sagemaker_session=sagemaker.Session())
    knn.set_hyperparameters(**hyperparams)

    # train a model. fit_input contains the locations of the train and test data
    fit_input = {'train': s3_train_data}
    if s3_test_data is not None:
        fit_input['test'] = s3_test_data
    knn.fit(fit_input)
    return knn

Начало обучения

hyperparams = {
    'feature_dim': 54,
    'k': 10,
    'sample_size': 200000,
    'predictor_type': 'classifier' 
}
output_path = 's3://' + bucket + '/' + prefix + '/output'
knn_estimator = trained_estimator_from_hyperparams(s3_train_data, hyperparams, output_path, 
                                                   s3_test_data=s3_test_data)

Выход

2020-05-19 10:23:35 Uploading - Uploading generated training model
2020-05-19 10:23:35 Completed - Training job completed
Training seconds: 64
Billable seconds: 64

Настройка конечной точки

Теперь, когда у нас есть обученная модель, мы готовы к выводу (прогноз). KNN_ESTIMATOR Объект выше содержит всю необходимую информацию для размещения модели. Ниже приведена простая вспомогательная функция, которая дает оценку, устанавливает конечную точку, которая размещает модель. Кроме объекта оценки, мы предоставляем ему имя (строка) для оценки и exance_type Анкет exance_type это тип машины, который будет размещать модель. Он никоим образом не ограничивается настройками параметров обучающей работы.

def predictor_from_estimator(knn_estimator, estimator_name, instance_type, endpoint_name=None): 
    knn_predictor = knn_estimator.deploy(initial_instance_count=1, instance_type=instance_type,
                                        endpoint_name=endpoint_name)
    knn_predictor.content_type = 'text/csv'
    knn_predictor.serializer = csv_serializer
    knn_predictor.deserializer = json_deserializer
    return knn_predictor

Создание конечная точка

instance_type = 'ml.m4.xlarge'
model_name = 'knn_%s'% instance_type
endpoint_name = 'knn-ml-m4-xlarge-%s'% (str(time.time()).replace('.','-'))
print('setting up the endpoint..')
predictor = predictor_from_estimator(knn_estimator, model_name, instance_type, endpoint_name=endpoint_name)

Выход:

setting up the endpoint..
---------------!

Как только это будет сделано, мы также увидим консоль Endpoint Vis AWS, в соответствии с Amazon SageMaker> конечными точками.

Вывод (прогноз)

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

batches = np.array_split(test_features, 100)
print('data split into 100 batches, of size %d.' % batches[0].shape[0])

# obtain an np array with the predictions for the entire test set
start_time = time.time()
predictions = []
for batch in batches:
    result = predictor.predict(batch)
    cur_predictions = np.array([result['predictions'][i]['predicted_label'] for i in range(len(result['predictions']))])
    predictions.append(cur_predictions)
predictions = np.concatenate(predictions)
run_time = time.time() - start_time

test_size = test_labels.shape[0]
num_correct = sum(predictions == test_labels)
accuracy = num_correct / float(test_size)
print('time required for predicting %d data point: %.2f seconds' % (test_size, run_time))
print('accuracy of model: %.1f%%' % (accuracy * 100) )

Выход:

data split into 100 batches, of size 582.
time required for predicting 58102 data point: 42.34 seconds
accuracy of model: 92.2%

Удаление конечной точки

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

def delete_endpoint(predictor):
    try:
        boto3.client('sagemaker').delete_endpoint(EndpointName=predictor.endpoint)
        print('Deleted {}'.format(predictor.endpoint))
    except:
        print('Already deleted: {}'.format(predictor.endpoint))

delete_endpoint(predictor)

Ссылка

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

Курс

Amazon SageMaker:

Книги:

Блоги:

Оригинал: “https://dev.to/aws/k-nearest-neighbour-and-amazon-sagemaker-475j”