Что нужно знать, чтобы отменить штраф за СЗВ-М?
Судебные инстанции начали отменять назначенные Пенсионным фондом штрафы за нарушения при сдаче СЗВ-М. В чем, по мнению судей, оказались неправы инспектора ПФР? Какие советы можно дать работодателям, которым штраф грозит или уже назначен? Ответы — в нашем материале.
Самостоятельное исправление ошибки в СЗВ-М — не повод для штрафа
Компания ошиблась в периоде, указанном в СЗВ-М, самостоятельно обнаружила ошибку и подала уточненный отчет, но позже срока подачи СЗВ-М за корректируемый период (подробно мы рассказывали об этом здесь). В ПФР компанию оштрафовали на кругленькую сумму, суды первых инстанций подержали ПФР.
ВС РФ вынес иное решение. Судьи высокой инстанции отметили тот факт, что инспектора ПФР ошибку сами не заметили и исправить ее сами не требовали. Компания проявила добросовестность, когда самостоятельно обнаружила ошибку и подала верный отчет.
В законодательстве не предусмотрено срока, в течение которого допускается подавать уточнения к отчету СЗВ-М без штрафа. Следовательно, сочли в ВС РФ, в отношении подачи уточненок могут работать общие правила для подачи обязательных отчетов по налогам и взносам (ст. 81 НК РФ). Если сдающий отчет обнаруживает и исправляет ошибку до того, как это сделает контролирующий орган – то такое исправление штрафоваться не должно.
Совет сдающим СЗВ-М: при исправлении ошибок в отчете фиксируйте факт того, что вы выявили и исправили все самостоятельно, без участия инспекторов ПФР. Тогда, в случае судебного оспаривания штрафа, вы сможете ссылаться на мнение ВС РФ по аналогичной ситуации (Определение Судебной коллегии по экономическим спорам ВС от 22.07.2019 № 305-ЭС19-2960).
ПФР должен строго соблюдать порядок наложения штрафа за СЗВ-М
Фирма сдала форму СЗВ-М с опозданием на целый месяц. В ПФР составили соответствующий акт и назначили компании штраф на его основании. Фирма с этим не согласилась и обратилась в суд, требуя признать это решение незаконным.
Судьи двух инстанций поддержали фирму, поскольку ПФР, оформляя штраф, допустил ряд нарушений. Так, акт о пропуске срока сдачи СЗВ-М фирмой должен был рассматриваться 9 августа, но решение о штрафе было вынесено уже 1-го числа, то есть раньше указанной даты на 8 дней.
Фирма, таким образом, не могла присутствовать при вынесении решения и каким-то образом защищаться. Права фирмы оказались нарушенными, и суды отменили штраф ПФР (Постановление АС Северо-Западного округа от 16.07.2019 № А81-9121/2018).
Совет сдающим СЗВ-М: если решение о наложении штрафа уже вынесено — затребуйте остальные документы, которые относятся к данному решению. Возможно, что порядок вынесения решения о штрафе был нарушен ПФР, а это дает хороший повод оспорить санкцию.
Штраф за СЗВ-М можно оспорить даже после уведомления от ПФР об ошибке
ПФР выявил несоответствие между сданными компанией СЗВ-М и ЕРСВ. Компании было направлено уведомление, по итогам которого компания подала уточненную форму СЗВ-М (в СЗВ-М оказались не учтены несколько новых сотрудников).
В ПФР составили акт о неполном предоставлении сведений и назначили компании штраф, который компания оплачивать не стала. Интересно, что в суд в данном случае обратились инспектора ПФР, чтобы все-таки взыскать штраф.
Однако судьи первых инстанций решили, что компания выявила и исправила ошибку самостоятельно, т. к. в уведомлении от инспекторов ПФР было только указано на нестыковку данных двух отчетов. Поэтому, сочли судьи, компания имела право исправить такую ошибку без штрафа.
В кассационном суде решения предыдущих судов отменили и снова присудили штраф компании на основании того, что сведения на новых сотрудников не были исправлением ошибки, а были именно новыми данными, поданными с опозданием.
Верховный суд РФ (дело, в итоге, дошло до него) указал кассации, что в данном случае недопустим формальный подход к вопросу. Поскольку никаких конкретных сроков для внесения в отчетность для ПФР уточнений, в том числе дополнений, законодательство не содержит. При этом обязанность отчитывающегося работодателя уточнять поданные сведения в интересах застрахованных лиц четко прописана в приказе Минтруда и соцзащиты от 21.12.2016 № 766н.
Таким образом, рассудили в ВС РФ, подавая уточненку по СЗВ-М, компания действовала в интересах застрахованных лиц и в интересах государства, которое поощряет страхование и добросовестность страхователей. Значит, штрафовать за подачу уточненного СЗВ-М с данными на новых сотрудников нельзя (Определение ВС РФ от 05.07.2019 № 308-ЭС19-975).
Совет сдающим СЗВ-М: если подаете уточненную форму СЗВ-М со сведениями, дополняющими сданную прежде, а вас пытаются за это оштрафовать, укажите инспекторам, со ссылкой на определение ВС РФ, на недопустимость формального подхода. Разъясните, что уточнения вы подаете в интересах застрахованных лиц в полном соответствии с законодательством РФ. И штрафовать вас за это нельзя.
Подводим итоги
Нарушение порядка сдачи СЗВ-М грозит штрафом. Однако есть возможности его избежать, и суды это подтверждают.
Уведомление о перемещении прослеживаемого товара
Электронный формат уведомления о перемещении прослеживаемых товаров и порядок заполнения отчета записаны в приложениях к письму ФНС РФ от 14.04.2021 № ЕА-4-15/5042 (приложения 5 и 9).
Порядок заполнения отчета следующий.
Сначала проставляют номер документа, дату его заполнения, а также номер корректировки. В первичном отчете пишут номер ноль.
Затем указывают реквизиты продавца, который передает прослеживаемые товары – название организации или предпринимателя, а также ИНН и КПП.
Далее записывают реквизиты покупателя – наименование иностранной стороны, ее юридический адрес, идентификационный код и код государства – участника ЕАЭС.
После этого проставляют вид и реквизиты сопроводительного документа на передачу товаров – дату и номер счета-фактуры, УПД или другого документа, а также адрес назначения, доставки, разгрузки товаров на территории иностранного государства.
В самом конце заполняют таблицу, в которой записывают данные о наименовании, количестве, стоимости товара без НДС, а также о регистрационном номере партии товара (РНПТ).
Наши специалисты составили образец уведомления о перемещении прослеживаемого товара. Скачайте его по ссылке: пример уведомления о перемещении прослеживаемого товара.
Обратите внимание: если покупатель полностью или частично вернет товар, необходимо будет подать корректировочное уведомление. Кроме того, «уточненку» придется подать в случае, если в исходном отчете будут найдены ошибки или какие-либо недочеты.
Крайний срок отправки корректировочного уведомления — следующий рабочий день после возврата товаров или выявления ошибок и недочетов (п. 24 положения, утвержденного Постановлением Правительства РФ от 01.07.2021 № 1108).
В законодательстве не установлены точные правила заполнения корректировочного уведомления. Поэтому для того, чтобы составить «уточненку», запишите в строке 3 отчета номер корректировки. Например, 1, 2 и так далее. В строках и графах проставьте правильные показатели.
Уведомление о ввозе прослеживаемых товаров
Формат и порядок заполнения уведомления о ввозе товаров, которые подлежат прослеживанию, предусмотрены в приложениях к письму ФНС РФ от 14.04.2021 № ЕА-4-15/5042 (приложения 6 и 10).
Порядок заполнения уведомления следующий.
Сначала заполняют номер документа, дату его заполнения, а также номер корректировки. В первичном отчете проставляют номер ноль.
Затем указывают реквизиты покупателя, который импортирует прослеживаемые товары – название организации или предпринимателя, а также ИНН и КПП.
Далее записывают реквизиты продавца – наименование иностранной стороны, ее юридический адрес, идентификационный код и код государства – участника ЕАЭС.
После этого проставляют вид и реквизиты сопроводительного документа на передачу товаров – дату и номер счета-фактуры, УПД или другого документа.
В самом конце заполняют информацию о товаре – код по ТН ВЭД, его количество и стоимость без НДС.
При этом регномер партии товара (РНПТ) проставлять не требуется. Налоговики присвоят соответствующий номер самостоятельно и в срок не позднее следующего дня с даты получения уведомления известят о номере по ТКС (п. 26 положения, утвержденного Постановлением Правительства РФ от 01.07.2021 № 1108, письмо Минфина РФ от 30.03.2021 № 27-01-24/23047).
Наши специалисты составили образец заполненного уведомления о ввозе товаров, которые подлежат прослеживанию. Скачайте его по ссылке: пример уведомления о ввозе импортных товаров.
Обратите внимание: если импортер полностью или частично вернет товар, необходимо будет подать корректировочное уведомление. Кроме того, «уточненку» придется подать в случае, если в исходном отчете будут найдены ошибки или какие-либо недочеты.
Крайний срок отправки корректировочного уведомления — следующий рабочий день после возврата товаров или выявления ошибок и недочетов (п. 27 положения, утвержденного Постановлением Правительства РФ от 01.07.2021 № 1108).
В законодательстве не установлены точные правила заполнения уточненного уведомления. Поэтому для того, чтобы составить «уточненку», запишите в сроке 3 отчета номер уточнения. Например, 1, 2 и так далее. В строках и графах проставьте правильные показатели.
Требуется пояснение для аргумента «штраф» в svm.LinearSVC
Я хочу импортировать этот файл CSV
tweets = pd.read_csv ('/ Users / yoshithKotla / Desktop / canal / Music / wmsrry / wmsrry_only')
печать (твиты)
Но он показывает такую ошибку, файл находится в том же месте, что и упоминалось, и я не могу импортировать файл CSV. Я пробовал это с некоторыми другими файлами CSV на рабочем столе, ошибка все еще отображается. Здесь нет ни дубликатов файлов, ни каких-либо других файлов с тем же именем в разных форматах.Я не могу понять это
FileNotFoundError Traceback (последний вызов последним)
в
----> 1 твит = pd.read_csv ('/ Users / yoshithKotla / Desktop / canal / Music / wmsrry / wmsrry_only')
2
3 печати (твиты)
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/io/parsers.py в read_csv (filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix , mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_date_formates, chip_date_date_formates, chip_datetime_formates , десятичное число, указатель строки, quotechar, цитирование, двойные кавычки, escapechar, комментарий, кодировка, диалект, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options)
608 кВт.обновление (kwds_defaults)
609
-> 610 return _read (filepath_or_buffer, kwds)
611
612
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/io/parsers.py в _read (filepath_or_buffer, kwds)
460
461 # Создайте парсер.
-> 462 parser = TextFileReader (filepath_or_buffer, ** kwds)
463
464, если размер блока или итератор:
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/io/parsers.py в __init __ (self, f, engine, ** kwds)
817 сам.параметры ["has_index_names"] = kwds ["has_index_names"]
818
-> 819 self._engine = self._make_engine (самодвигатель)
820
821 def close (self):
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/io/parsers.py в _make_engine (сам, движок)
1048)
1049 # error: слишком много аргументов для "ParserBase"
-> 1050 return mapping [engine] (self.f, ** self.options) # тип: игнорировать [call-arg]
1051
1052 def _failover_to_python (сам):
/ Библиотека / Frameworks / Python.framework / Versions / 3.9 / lib / python3.9 / site-packages / pandas / io / parsers.py в __init __ (self, src, ** kwds)
1865 г.
1866 # открытые ручки
-> 1867 self._open_handles (src, kwds)
1868 г. assert self.handles is not None
1869 для ввода ("параметры_хранилища", "кодирование", "карта_памяти", "сжатие"):
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/io/parsers.py в _open_handles (self, src, kwds)
1360 Позвольте читателям открывать IOH-анлы после того, как они сделают свои потенциальные рейзы.1361 "" "
-> 1362 self.handles = get_handle (
1363 SRC,
1364 "р",
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/io/common.py в get_handle (path_or_buf, режим, кодирование, сжатие, memory_map, is_text, errors, storage_options)
640 ошибок = "заменить"
641 # Кодировка
-> 642 ручка = открытая (
643 ручка,
644 ioargs.mode,
FileNotFoundError: [Errno 2] Нет такого файла или каталога: '/ Users / yoshithKotla / Desktop / canal / Music / wmsrry / wmsrry_only'
машин опорных векторов — мягкая формулировка маржи и трюк с ядром | от Ришаба Мисры
Изучите некоторые из передовых концепций, которые делают машину опорных векторов мощным линейным классификатором. Методика формулировки мягких полей
SVM в действии.Машина опорных векторов (SVM) — одна из самых популярных методик классификации, которая направлена на минимизацию количества ошибочная классификация ошибок напрямую.Существует множество доступных ресурсов для понимания основ работы машин поддерживающих векторов (SVM), однако почти во всех реальных приложениях (где данные линейно неразделимы, ) SVM используют некоторые продвинутые концепции.
Цель этого поста — объяснить концепции Soft Margin Formulation и Kernel Trick, которые SVM используют для классификации линейно неразделимых данных.
Если вы хотите сначала освежить в памяти основы SVM, я бы порекомендовал прочитать следующий пост.
Прежде чем мы перейдем к концепциям трюка Soft Margin и Kernel, давайте установим необходимость в них. Предположим, у нас есть некоторые данные, и их можно изобразить следующим образом в 2D-пространстве:
Рисунок 1: Представление данных, в котором два класса не могут быть разделены линейноИз рисунка очевидно, что нет конкретной границы линейного решения, которая могла бы идеально разделить данные, т.е. данные линейно неразделимы . У нас может быть аналогичная ситуация и в многомерных представлениях.Это можно объяснить тем фактом, что обычно функции, которые мы получаем из данных, не содержат достаточной информации , чтобы мы могли четко разделить два класса. Обычно это имеет место во многих реальных приложениях. К счастью, исследователи уже разработали методы, позволяющие справляться с подобными ситуациями. Посмотрим, что они из себя представляют и как работают.
Эта идея основана на простой посылке: позволяет SVM делать определенное количество ошибок и сохранять максимально широкий запас, чтобы другие точки можно было классифицировать правильно .Это можно сделать, просто изменив цель SVM.
Мотивация
Давайте кратко рассмотрим мотивацию наличия такой формулировки.
- Как упоминалось ранее, почти все реальные приложения имеют данные, которые линейно неразделимы.
- В редких случаях, когда данные являются линейно разделяемыми, мы можем не захотеть выбирать границу решения, которая идеально разделяет данные, чтобы избежать переобучения. Например, рассмотрим следующую диаграмму:
Здесь красная граница решения
отлично разделяет все тренировочные точки.Однако действительно ли это хорошая идея иметь границу принятия решений с такой меньшей маржой? Как вы думаете, такая граница принятия решений будет хорошо обобщаться на невидимых данных? Ответ: Нет. Граница принятия решения , зеленая,
имеет более широкий запас, что позволило бы ей хорошо обобщать невидимые данные. В этом смысле формулировка мягкой маржи также поможет избежать проблемы переобучения.
Как это работает (математически)?
Давайте посмотрим, как мы можем изменить нашу цель для достижения желаемого поведения.В этой новой обстановке мы стремимся минимизировать следующую цель:
уравнение 1 Это отличается от первоначальной цели во втором члене. Здесь C
— гиперпараметр, который определяет компромисс между максимизацией маржи и минимизацией ошибок. Когда C
является небольшим, ошибкам классификации придается меньшее значение, и основное внимание уделяется максимальному увеличению маржи, тогда как когда C
является большим, основное внимание уделяется предотвращению ошибочной классификации за счет сохранения небольшой маржи.
Здесь, однако, следует отметить, что не все ошибки одинаковы. Точки данных, которые находятся далеко на неправильной стороне границы принятия решения, должны подвергаться большему штрафу по сравнению с теми, которые находятся ближе. Давайте посмотрим, как это можно сделать, с помощью следующей диаграммы.
Рис. 3. Штраф, понесенный точками данных за то, что они находятся на неправильной стороне границы принятия решения Идея такова: для каждой точки данных x_i
мы вводим переменную резерва ξ_i
.Значение ξ_i
— это расстояние x_i
от поля соответствующего класса , если x_i
находится на неправильной стороне поля, в противном случае — ноль. Таким образом, точки, которые находятся далеко от границы на неправильной стороне, будут подвергаться большему штрафу.
С этой идеей каждая точка данных x_i
должна удовлетворять следующему ограничению:
Здесь левую часть неравенства можно рассматривать как достоверность классификации.Оценка достоверности ≥ 1 предполагает, что классификатор правильно классифицировал точку. Однако, если показатель достоверности ≤ 1, это означает, что классификатор неправильно классифицировал точку и понес линейный штраф в размере ξ_i
.
С учетом этих ограничений наша цель — минимизировать следующую функцию:
уравнение 3, где мы использовали концепции множителя Лагранжа для оптимизации функции потерь при ограничениях. Давайте сравним это с целью SVM, которая обрабатывает линейно разделимые случаи (как указано ниже).
уравнение 4 Мы видим, что только ξ_i
являются дополнительными в модифицированной цели, а все остальное остается таким же.
На заметку: в окончательном решении
λ_i
с, соответствующие точкам, которые находятся ближе всего к марже и на изнаночной стороне поля (т.е. имеющие ненулевое значениеξ_i
), не будут -нулю, поскольку они играют ключевую роль в позиционировании границы принятия решений, по сути делая их опорными векторами.
Теперь давайте исследуем второе решение использования «трюка с ядром» для решения проблемы линейной неотделимости. Но сначала мы должны узнать, что такое функции ядра.
Функции ядра
Функции ядра — это обобщенные функции, которые принимают два вектора (любой размерности) в качестве входных и выводят оценку, которая указывает, насколько похожи входные векторы. Простая функция ядра, которую вы уже знаете, — это функция скалярного произведения: если скалярное произведение мало, мы заключаем, что векторы разные, а если скалярное произведение большое, мы заключаем, что векторы более похожи.Если вам интересно узнать о других типах функций ядра, это будет хорошим источником.
«Уловка»
Давайте посмотрим на целевую функцию для линейно разделимого случая:
уравнение 5Это модифицированная форма цели в
уравнении 4
. Здесь мы подставили оптимальное значениеw
иb
. Эти оптимальные значения могут быть вычислены путем дифференцированияуравнения 4
по этим параметрам и приравнивания его к 0.
Из уравнения
видно, что цель зависит от скалярного произведения пар входных векторов ( x_i. X_j
), которое является не чем иным, как функцией ядра. А теперь хороший момент: нам не нужно ограничиваться простой функцией ядра, такой как скалярное произведение . Мы можем использовать любую причудливую функцию ядра вместо скалярного произведения, которая может измерять сходство в более высоких измерениях (где это может быть более точно; подробнее об этом позже), без значительного увеличения вычислительных затрат.Это, по сути, известно как трюк с ядром .
Как это работает (математически)?
Математически функцию ядра можно записать следующим образом:
уравнение 6 Здесь x
и y
— входные векторы, ϕ
— функция преобразования, а <,>
обозначает операция скалярного произведения. В случае функции скалярного произведения ϕ
просто отображает входной вектор на себя.
Функции ядра по существу берут скалярное произведение преобразованных входных векторов.
Теперь давайте рассмотрим случай, изображенный на рис. 4
ниже. Мы видим, что в 2-м пространстве нет линейной границы решения, которая могла бы идеально разделить точки данных. Круговая (или квадратичная) граница принятия решения может сработать, однако линейные классификаторы не могут предложить эти типы границ решения.
P_1
и P_2
. уравнение 7Если мы рассмотрим окончательную форму функции ядра, то это не что иное, как круг! Это означает, что мы изменили наше представление о подобии: вместо того, чтобы измерять сходство по тому, насколько близко расположены точки (с помощью скалярного произведения), мы измеряем сходство на основе того, находятся ли точки внутри круга.В этом смысле определение такого преобразования позволило нам иметь нелинейную границу решения в 2D-пространстве (она по-прежнему линейна в исходном 3D-пространстве) . Это может быть очень много, поэтому ниже приводится краткое изложение решений, которые мы приняли:
1 - Каждая точка P представлена координатами ( x , y ) в 2D-пространстве. 2 , √2xy ) 3 - Точки с высоким значением x . y будут двигаться вверх по оси z (в данном случае в основном красные кружки). Это видео дает хорошую визуализацию того же самого. 4 - Мы находим гиперплоскость в трехмерном пространстве, которая идеально разделяет классы. 5 - Форма функции ядра указывает, что эта гиперплоскость будет формировать круг в двумерном пространстве, таким образом давая нам нелинейную границу принятия решения.
И главный вывод:
Встраивая данные в многомерное пространство признаков, мы можем продолжать использовать линейный классификатор!
Предостережение: эти преобразования могут резко увеличить пространство функций, а это увеличивает вычислительные затраты.Есть ли способ получить вышеупомянутые преимущества, не увеличивая при этом значительно вычислительные затраты? Оказывается, есть!
Давайте попробуем переписать функцию ядра в уравнении 7
: уравнение
Ух ты! Таким образом, значение функции ядра (таким образом, сходство между точками в трехмерном пространстве) — это просто квадрат скалярного произведения между точками в двухмерном пространстве. Довольно здорово, правда ?! Но как это случилось?
Причина этого в том, что мы мудро выбрали нашу функцию преобразования ϕ
.И пока мы продолжаем это делать, мы можем обойти этап преобразования и вычислить значение функции ядра непосредственно из сходства между точками в 2D-пространстве. Это, в свою очередь, также снизит вычислительные затраты. У нас есть много популярных функций ядра, которые обладают этим замечательным свойством и могут использоваться сразу после установки (нам не нужно искать идеальный ϕ
).
На этом мы подошли к концу этого поста. Надеюсь, подробности, представленные в этой статье, дали вам хорошее представление о том, что делает SVM мощным линейным классификатором.Если у вас есть вопросы или предложения, дайте мне знать в комментариях. Ваше здоровье! 🥂
Экономичный SVM для несбалансированной классификации
Последнее обновление 21 августа 2020 г.
Алгоритм машины опорных векторов эффективен для сбалансированной классификации, но не работает с несбалансированными наборами данных.
Алгоритм SVM находит границу решения гиперплоскости, которая лучше всего разделяет примеры на два класса. Разделение становится мягким за счет использования поля, которое позволяет ошибочно классифицировать некоторые точки.По умолчанию этот запас благоприятствует большинству классов в несбалансированных наборах данных, хотя его можно обновить, чтобы учесть важность каждого класса и значительно улучшить производительность алгоритма в наборах данных с асимметричным распределением классов.
Эту модификацию SVM, которая взвешивает запас, пропорциональный важности класса, часто называют взвешенной SVM или чувствительной к стоимости SVM.
В этом руководстве вы познакомитесь с машинами взвешенных опорных векторов для несбалансированной классификации.
После прохождения этого руководства вы будете знать:
- Как стандартный алгоритм машины опорных векторов ограничен для несбалансированной классификации.
- Как можно модифицировать алгоритм машины опорных векторов для взвешивания штрафа на марже, пропорционального важности класса во время обучения.
- Как настроить вес класса для SVM и как выполнить поиск по сетке для различных конфигураций веса класса.
Начните свой проект с моей новой книги «Несбалансированная классификация с Python», включая пошаговые руководства и файлы исходного кода Python для всех примеров.
Приступим.
Как реализовать машины взвешенных опорных векторов для несбалансированной классификации
Фотография Баса Лендерса, некоторые права защищены.
Обзор учебного пособия
Это руководство разделено на четыре части; их:
- Несбалансированный набор данных классификации
- SVM для несбалансированной классификации
- Взвешенная SVM с Scikit-Learn
- Взвешенный поиск по сетке SVM
Несбалансированный набор данных классификации
Прежде чем мы углубимся в модификацию SVM для несбалансированной классификации, давайте сначала определим несбалансированный набор данных классификации.
Мы можем использовать функцию make_classification () для определения синтетического несбалансированного двухклассового набора данных классификации. Мы сгенерируем 10 000 примеров с приблизительным соотношением меньшинства к большинству 1: 100.
… # определить набор данных X, y = make_classification (n_samples = 10000, n_features = 2, n_redundant = 0, n_clusters_per_class = 1, веса = [0.99], flip_y = 0, random_state = 4)
… # определить набор данных X, y = make_classification (n_samples = 10000, n_features = 2, n_redundant = 0, n_clusters_per_class = 1, weights = [0.99], flip_y = 0, random_state = 4) |
После создания мы можем суммировать распределение классов, чтобы подтвердить, что набор данных был создан, как мы и ожидали.
… # суммировать распределение классов counter = Counter (y) печать (счетчик)
… # обобщить распределение классов counter = Counter (y) print (counter) |
Наконец, мы можем создать диаграмму разброса примеров и раскрасить их по метке класса, чтобы помочь понять проблему классификации примеров из этого набора данных.
… # точечная диаграмма примеров по метке класса для метки _ в counter.items (): row_ix = where (y == label) [0] pyplot.scatter (X [row_ix, 0], X [row_ix, 1], label = str (label)) пиплот.легенда () pyplot.show ()
… # точечная диаграмма примеров по метке класса для метки, _ в counter.items (): row_ix = where (y == label) [0] pyplot.scatter (X [ row_ix, 0], X [row_ix, 1], label = str (label)) pyplot.legend () pyplot.show () |
Полный пример создания синтетического набора данных и построения графиков приведен ниже.
# Создание и построение набора данных синтетической несбалансированной классификации из коллекций счетчик импорта из sklearn.datasets импортировать make_classification из matplotlib import pyplot из импорта numpy, где # определить набор данных X, y = make_classification (n_samples = 10000, n_features = 2, n_redundant = 0, n_clusters_per_class = 1, веса = [0.99], flip_y = 0, random_state = 4) # суммировать распределение классов counter = Counter (y) печать (счетчик) # точечная диаграмма примеров по метке класса для ярлыка _ в счетчике.Предметы(): row_ix = where (y == label) [0] pyplot.scatter (X [row_ix, 0], X [row_ix, 1], label = str (label)) pyplot.legend () pyplot.show ()
1 2 3 4 5 6 7 8 9 10 11 12 13 140002 | # Сгенерировать и построить набор данных синтетической несбалансированной классификации из коллекции импорта Counter из sklearn.наборы данных импортировать make_classification из matplotlib import pyplot from numpy import, где # определить набор данных X, y = make_classification (n_samples = 10000, n_features = 2, n_redundant = 0, _classification = 0,_performance = 0,_кластер =, nights_classs = 0, _perclass =], flip_y = 0, random_state = 4) # суммировать распределение классов counter = Counter (y) print (counter) # точечная диаграмма примеров по метке класса для label, _ in counter.items (): row_ix = where (y == label) [0] pyplot.scatter (X [row_ix, 0], X [row_ix, 1], label = str (label)) pyplot.legend () pyplot.show () |
При выполнении примера сначала создается набор данных и резюмируется распределение классов.
Мы видим, что набор данных имеет приблизительное распределение классов 1: 100 с немногим менее 10 000 примеров в классе большинства и 100 в классе меньшинства.
Счетчик ({0: 9900, 1: 100})
Счетчик ({0: 9900, 1: 100}) |
Затем создается диаграмма разброса набора данных, показывающая большое количество примеров для класса большинства (синий) и небольшое количество примеров для класса меньшинства (оранжевый) с некоторым небольшим перекрытием классов.
Точечная диаграмма набора данных двоичной классификации с дисбалансом классов от 1 до 100
Затем мы можем разместить стандартную модель SVM в наборе данных.
SVM можно определить с помощью класса SVC в библиотеке scikit-learn.
… # определить модель модель = SVC (гамма = ‘масштаб’)
… # определить модель модель = SVC (гамма = ‘масштаб’) |
Мы будем использовать повторную перекрестную проверку для оценки модели с тремя повторениями 10-кратной перекрестной проверки.Характеристики режима будут представлены с использованием средней ROC-площади под кривой (ROC AUC), усредненной по повторам и всем складкам.
… # определить процедуру оценки cv = RepeatedStratifiedKFold (n_splits = 10, n_repeats = 3, random_state = 1) # оценить модель scores = cross_val_score (модель, X, y, scoring = ‘roc_auc’, cv = cv, n_jobs = -1) # подвести итоги print (‘Среднее ROC AUC:% .3f’% среднее (баллы))
… # определить процедуру оценки cv = RepeatedStratifiedKFold (n_splits = 10, n_repeats = 3, random_state = 1) # оценить модель scores = cross_val_score (model, X, y, scoring = ‘roc_auc’, cv = cv, n_jobs = -1) # подвести итоги производительности print (‘Среднее ROC AUC:% .3f’% среднее (баллы)) |
Собирая все вместе, ниже приведен полный пример определения и оценки стандартной модели SVM для проблемы несбалансированной классификации.
SVMявляются эффективными моделями для задач двоичной классификации, хотя по умолчанию они не эффективны при несбалансированной классификации.
# поместите svm на несбалансированный набор данных классификации из среднего значения импорта из sklearn.datasets импортировать make_classification из sklearn.model_selection импорт cross_val_score из sklearn.model_selection import RepeatedStratifiedKFold из sklearn.svm импортировать SVC # создать набор данных X, y = make_classification (n_samples = 10000, n_features = 2, n_redundant = 0, n_clusters_per_class = 1, веса = [0.99], flip_y = 0, random_state = 4) # определить модель модель = SVC (гамма = ‘масштаб’) # определить процедуру оценки cv = RepeatedStratifiedKFold (n_splits = 10, n_repeats = 3, random_state = 1) # оценить модель scores = cross_val_score (модель, X, y, scoring = ‘roc_auc’, cv = cv, n_jobs = -1) # подвести итоги print (‘Среднее ROC AUC:% .3f’% среднее (баллы))
1 2 3 4 5 6 7 8 9 10 11 12 13 140002 | # поместите svm в несбалансированный набор данных классификации из numpy import mean из sklearn.наборы данных импортировать make_classification из sklearn.model_selection импорт cross_val_score из sklearn.model_selection import RepeatedStratifiedKFold из sklearn.svm import SVC # сгенерировать набор данных XDUsdatures, n_classFendant = 0, n_clusters_per_class = 1, weights = [0.99], flip_y = 0, random_state = 4) # определить модель model = SVC (gamma = ‘scale’) # определить процедуру оценки cv = RepeatedStratifiedKF (n_splits = 10, n_repeats = 3, random_state = 1) # оценить модель scores = cross_val_score (model, X, y, scoring = ‘roc_auc’, cv = cv, n_jobs = -1) # summarize performance отпечаток (‘Среднее значение ROC AUC:%.3f ‘% среднее (баллы)) |
При выполнении примера оценивается стандартная модель SVM на несбалансированном наборе данных и отображается среднее значение ROC AUC.
Примечание : Ваши результаты могут отличаться из-за стохастической природы алгоритма или процедуры оценки или различий в числовой точности. Попробуйте запустить пример несколько раз и сравните средний результат.
Мы видим, что модель обладает навыком, достигающим ROC AUC выше 0,5, в этом случае средний балл равен 0.804.
Это дает основу для сравнения любых модификаций, выполненных в стандартном алгоритме SVM.
Хотите начать работу с классификацией дисбаланса?
Пройдите бесплатный 7-дневный ускоренный курс по электронной почте (с образцом кода).
Нажмите, чтобы зарегистрироваться, а также получите бесплатную электронную версию курса в формате PDF.
Загрузите БЕСПЛАТНЫЙ мини-курс
SVM для несбалансированной классификации
Машины опорных векторов, или сокращенно SVM, представляют собой эффективный алгоритм нелинейного машинного обучения.
Алгоритм обучения SVM ищет линию или гиперплоскость, которая лучше всего разделяет классы. Гиперплоскость определяется полем, которое максимизирует расстояние между границей решения и ближайшими примерами из каждого из двух классов.
Грубо говоря, запас — это расстояние между границей классификации и ближайшей заданной точкой обучения.
— страницы 343-344, Прикладное прогнозное моделирование, 2013.
Данные могут быть преобразованы с использованием ядра, чтобы позволить определять линейные гиперплоскости для разделения классов в преобразованном пространстве признаков, которое соответствует границе нелинейных классов в исходном пространстве признаков.Общие преобразования ядра включают преобразование линейной, полиномиальной и радиальной базисной функции. Это преобразование данных называется «уловкой ядра ».
Обычно классы не разделяются даже при преобразовании данных. Таким образом, запас смягчается, чтобы позволить некоторым точкам появляться не на той стороне границы решения. Это смягчение маржи контролируется гиперпараметром регуляризации, называемым параметром soft-margin, , лямбда, или заглавная буква C (« C »).
… где C обозначает параметр регуляризации, который управляет компромиссом между максимальным запасом разделения между классами и минимизацией количества ошибочно классифицированных экземпляров.
— стр. 125, Обучение на несбалансированных наборах данных, 2018.
Значение C указывает на жесткую границу и отсутствие допуска для нарушений поля. Небольшие положительные значения допускают некоторое нарушение, тогда как большие целые значения, такие как 1, 10 и 100, допускают гораздо более мягкий запас.
… [C] определяет количество и серьезность нарушений допустимого предела (и гиперплоскости). Мы можем думать о C как о бюджете суммы, на которую маржа может быть нарушена n наблюдениями.
— страница 347, Введение в статистическое обучение: с приложениями в R, 2013.
Несмотря на свою эффективность, SVM плохо работают при сильном перекосе в распределении классов. Таким образом, есть много расширений алгоритма, чтобы сделать их более эффективными для несбалансированных наборов данных.
Хотя SVM часто дают эффективные решения для сбалансированных наборов данных, они чувствительны к дисбалансу в наборах данных и создают неоптимальные модели.
— стр. 86, Несбалансированное обучение: основы, алгоритмы и приложения, 2013.
Параметр C используется в качестве штрафа при подборе модели, в частности, при нахождении границы принятия решения. По умолчанию каждый класс имеет одинаковый вес, что означает, что мягкость поля симметрична.
Учитывая, что в классе большинства имеется значительно больше примеров, чем в классе меньшинства, это означает, что мягкая маржа и, в свою очередь, граница принятия решения будет благоприятствовать классу большинства.
… [] алгоритм обучения будет отдавать предпочтение классу большинства, поскольку концентрация на нем приведет к лучшему компромиссу между ошибкой классификации и максимизацией маржи. Это произойдет за счет класса меньшинства, особенно при высоком коэффициенте дисбаланса, поскольку тогда игнорирование класса меньшинства приведет к лучшим результатам оптимизации.
— стр. 126, Уроки несбалансированных наборов данных, 2018.
Возможно, самым простым и наиболее распространенным расширением SVM для несбалансированной классификации является взвешивание значения C пропорционально важности каждого класса.
Чтобы учесть эти факторы в SVM, была предложена взвешенная модификация на уровне экземпляра. […] Значения весов могут быть заданы в зависимости от соотношения дисбаланса между классами или факторов сложности отдельных экземпляров.
— стр. 130, Обучение на несбалансированных наборах данных, 2018.
В частности, каждый пример в наборе обучающих данных имеет свой собственный штрафной член (значение C ), используемый в вычислении запаса при подборе модели SVM. Значение C в примере может быть вычислено как взвешивание глобального значения C-, где вес определяется пропорционально распределению классов.
Для класса меньшинства можно использовать больший вес, позволяющий сделать маржу более мягкой, тогда как меньший вес можно использовать для класса большинства, заставляя маржу быть более жесткой и предотвращая неправильную классификацию примеров.
- Малый вес : Меньшее значение C , больший штраф за неправильно классифицированные примеры.
- Большой вес : большее значение C , меньший штраф за неправильно классифицированные примеры.
Это дает эффект поощрения маржи для содержания класса большинства с меньшей гибкостью, но позволяет классу меньшинства быть гибким с ошибочной классификацией примеров класса большинства на сторону класса меньшинства, если это необходимо.
То есть, модифицированный алгоритм SVM не будет склонять разделяющую гиперплоскость к примерам классов меньшинства, чтобы уменьшить общее количество ошибок классификации, поскольку примеры классов меньшинства теперь назначаются с более высокой стоимостью ошибочной классификации.
— стр. 89, Несбалансированное обучение: основы, алгоритмы и приложения, 2013.
Эта модификация SVM может называться Weighted Support Vector Machine (SVM) или, в более общем смысле, SVM со взвешенным классом, SVM со взвешенными экземплярами или SVM с учетом затрат.
Основная идея состоит в том, чтобы присвоить разные веса разным точкам данных, чтобы алгоритм обучения WSVM изучал поверхность принятия решений в соответствии с относительной важностью точек данных в наборе обучающих данных.
— Машина с взвешенными опорными векторами для классификации данных, 2007.
Взвешенная SVM с Scikit-Learn
Библиотека машинного обучения Python scikit-learn предоставляет реализацию алгоритма SVM, который поддерживает взвешивание классов.
Классы LinearSVC и SVC предоставляют аргумент class_weight , который можно указать как гиперпараметр модели. class_weight — это словарь, который определяет каждую метку класса (например, 0 и 1) и вес, применяемый к значению C при вычислении мягкого запаса.
Например, весовой коэффициент 1 к 1 для каждого класса 0 и 1 можно определить следующим образом:
… # определить модель веса = {0: 1.0, 1: 1.0} model = SVC (гамма = ‘масштаб’, class_weight = вес)
… # определить модель weights = {0: 1.0, 1: 1.0} model = SVC (gamma = ‘scale’, class_weight = weights) |
Классовое взвешивание может быть определено несколькими способами; например:
- Экспертиза в предметной области , определяется путем разговора с экспертами в предметной области.
- Настройка , определяется поиском гиперпараметров, например поиском по сетке.
- Эвристика , определенная в соответствии с общими рекомендациями.
Лучшим способом использования взвешивания классов является использование обратного распределения классов, присутствующего в наборе обучающих данных.
Например, распределение классов в тестовом наборе данных — это соотношение 1: 100 для класса меньшинства к классу большинства. Инверсия этого отношения может использоваться с 1 для класса большинства и 100 для класса меньшинства; например:
… # определить модель веса = {0: 1.0, 1: 100.0} model = SVC (гамма = ‘масштаб’, class_weight = вес)
… # определить модель weights = {0: 1.0, 1: 100.0} model = SVC (gamma = ‘scale’, class_weight = weights) |
Мы могли бы также определить такое же соотношение, используя дроби, и получить тот же результат; например:
… # определить модель веса = {0: 0.01, 1: 1.0} model = SVC (гамма = ‘масштаб’, class_weight = вес)
… # определить модель weights = {0: 0,01, 1: 1.0} model = SVC (gamma = ‘scale’, class_weight = weights) |
Эта эвристика доступна напрямую при установке class_weight на « сбалансированный ». Например:
… # определить модель model = SVC (гамма = ‘масштаб’, class_weight = ‘сбалансированный’)
… # определить модель модель = SVC (гамма = ‘масштаб’, class_weight = ‘сбалансированный’) |
Мы можем оценить алгоритм SVM с помощью взвешивания классов, используя ту же процедуру оценки, которая была определена в предыдущем разделе.
Мы ожидаем, что взвешенная по классам версия SVM будет работать лучше, чем стандартная версия SVM без какого-либо взвешивания классов.
Полный пример приведен ниже.
# svm с весом класса в несбалансированном наборе данных классификации из среднего значения импорта из склеарна.наборы данных импорт make_classification из sklearn.model_selection импорт cross_val_score из sklearn.model_selection import RepeatedStratifiedKFold из sklearn.svm импортировать SVC # создать набор данных X, y = make_classification (n_samples = 10000, n_features = 2, n_redundant = 0, n_clusters_per_class = 1, веса = [0.99], flip_y = 0, random_state = 4) # определить модель модель = SVC (гамма = ‘масштаб’, class_weight = ‘сбалансированный’) # определить процедуру оценки cv = RepeatedStratifiedKFold (n_splits = 10, n_repeats = 3, random_state = 1) # оценить модель scores = cross_val_score (модель, X, y, scoring = ‘roc_auc’, cv = cv, n_jobs = -1) # подвести итоги print (‘Среднее значение ROC AUC:%.3f ‘% среднее (баллы))
1 2 3 4 5 6 7 8 9 10 11 12 13 140002 | # svm с весом класса в несбалансированном наборе данных классификации из numpy import mean from sklearn.datasets import make_classification from sklearn.model_selection import cross_val_score из sklearn.model_selection import RepeatedStratifiedKFold из sklearn.svm import SVC # сгенерировать набор данных X, y = make_classification (n_samples = 10000, n_per_features = 2, n_features = 2 weights = [0.99], flip_y = 0, random_state = 4) # определить модель model = SVC (gamma = ‘scale’, class_weight =’balanced ‘) # определить процедуру оценки cv = RepeatedStratifiedKFold (n_splits = 10, n_repeats = 3, random_state = 1) # оценить модель scores = cross_val_score (model, X, y, scoring = ‘roc_auc’, cv = cv, n_jobs = -1) # подвести итоги print (‘Среднее значение ROC AUC:%.3f ‘% среднее (баллы)) |
При выполнении примера подготавливается набор данных синтетической несбалансированной классификации, затем оценивается версия алгоритма SVM, взвешенная по классам, с использованием повторной перекрестной проверки.
Примечание : Ваши результаты могут отличаться из-за стохастической природы алгоритма или процедуры оценки или различий в числовой точности. Попробуйте запустить пример несколько раз и сравните средний результат.
Сообщается средний показатель ROC AUC, в этом случае он показывает лучший результат, чем невзвешенная версия алгоритма SVM, 0.964 по сравнению с 0,804.
Взвешенный поиск по сетке SVM
Использование взвешивания класса, которое является обратным соотношением обучающих данных, является всего лишь эвристикой.
Возможно, что лучшая производительность может быть достигнута с другим весом класса, и это также будет зависеть от выбора метрики производительности, используемой для оценки модели.
В этом разделе мы проведем поиск по сетке по диапазону различных весов классов для взвешенной SVM и выясним, какие результаты дают лучший результат ROC AUC.
Мы попробуем следующие веса для классов 0 и 1:
- Класс 0: 100, Класс 1: 1
- Класс 0: 10, Класс 1: 1
- Класс 0: 1, Класс 1: 1
- Класс 0: 1, Класс 1: 10
- Класс 0: 1, Класс 1: 100
Их можно определить как параметры поиска по сетке для класса GridSearchCV следующим образом:
… # определить сетку баланс = [{0: 100,1: 1}, {0: 10,1: 1}, {0: 1,1: 1}, {0: 1,1: 10}, {0: 1,1: 100}] param_grid = dict (class_weight = баланс)
… # define grid balance = [{0: 100,1: 1}, {0: 10,1: 1}, {0: 1,1: 1}, {0: 1,1: 10 }, {0: 1,1: 100}] param_grid = dict (class_weight = balance) |
Мы можем выполнить поиск по сетке по этим параметрам, используя повторную перекрестную проверку, и оценить производительность модели, используя ROC AUC:
… # определить процедуру оценки cv = RepeatedStratifiedKFold (n_splits = 10, n_repeats = 3, random_state = 1) # определить поиск по сетке grid = GridSearchCV (оценка = модель, param_grid = param_grid, n_jobs = -1, cv = cv, scoring = ‘roc_auc’)
… # определить процедуру оценки cv = RepeatedStratifiedKFold (n_splits = 10, n_repeats = 3, random_state = 1) # определить поиск по сетке grid = GridSearchCV (оценка = модель, param_grid = param_grid, n_grid = param_grid, n , cv = cv, scoring = ‘roc_auc’) |
После выполнения мы можем суммировать лучшую конфигурацию, а также все результаты следующим образом:
… # сообщить о лучшей конфигурации print («Лучшее:% f с использованием% s»% (grid_result.best_score_, grid_result.best_params_)) # сообщить обо всех конфигурациях означает = grid_result.cv_results _ [‘mean_test_score’] stds = grid_result.cv_results _ [‘std_test_score’] params = grid_result.cv_results _ [‘параметры’] для mean, stdev, param в zip (means, stds, params): print («% f (% f) with:% r»% (mean, stdev, param))
… # сообщить о лучшей конфигурации print («Лучшее:% f с использованием% s»% (grid_result.best_score_, grid_result.best_params_)) # сообщать обо всех конфигурациях means = grid_result.cv_results _ [‘mean_test_score’] stds = grid_result.cv_results _ [‘std_test_score’] 9result_score.для среднего, стандартного отклонения, параметра в ZIP-архиве (означает, стандартное отклонение, параметры): print («% f (% f) с:% r»% (среднее, стандартное отклонение, параметр)) |
Связывая это вместе, в приведенном ниже примере сетки выполняется поиск пяти различных весов классов для алгоритма SVM в несбалансированном наборе данных.
Можно ожидать, что эвристическое взвешивание классов является наиболее производительной конфигурацией.
# поиск по сетке весов классов с помощью svm для классификации дисбаланса из среднего значения импорта из sklearn.datasets импортировать make_classification из sklearn.model_selection import GridSearchCV из sklearn.model_selection import RepeatedStratifiedKFold из sklearn.svm импортировать SVC # создать набор данных X, y = make_classification (n_samples = 10000, n_features = 2, n_redundant = 0, n_clusters_per_class = 1, веса = [0.99], flip_y = 0, random_state = 4) # определить модель модель = SVC (гамма = ‘масштаб’) # определить сетку баланс = [{0: 100,1: 1}, {0: 10,1: 1}, {0: 1,1: 1}, {0: 1,1: 10}, {0: 1,1: 100}] param_grid = dict (class_weight = баланс) # определить процедуру оценки cv = RepeatedStratifiedKFold (n_splits = 10, n_repeats = 3, random_state = 1) # определить поиск по сетке grid = GridSearchCV (оценка = модель, param_grid = param_grid, n_jobs = -1, cv = cv, scoring = ‘roc_auc’) # выполнить поиск по сетке grid_result = сетка.подходят (X, y) # сообщить о лучшей конфигурации print («Лучшее:% f с использованием% s»% (grid_result.best_score_, grid_result.best_params_)) # сообщить обо всех конфигурациях означает = grid_result.cv_results _ [‘mean_test_score’] stds = grid_result.cv_results _ [‘std_test_score’] params = grid_result.cv_results _ [‘параметры’] для mean, stdev, param в zip (means, stds, params): print («% f (% f) with:% r»% (mean, stdev, param))
1 2 3 4 5 6 7 8 9 10 11 12 13 140002 14 18 19 20 21 22 23 24 25 26 27 28 | # вес классов поиска сетки с svm для классификации дисбаланса из numpy import mean из sklearn.наборы данных импортировать make_classification из sklearn.model_selection import GridSearchCV из sklearn.model_selection import RepeatedStratifiedKFold из sklearn.svm import SVC # generate dataset 10000_classification 0,n_clusters_per_class = 1, weights = [0.99], flip_y = 0, random_state = 4) # определить модель model = SVC (gamma = ‘scale’) # define grid balance = [{ 0: 100,1: 1}, {0: 10,1: 1}, {0: 1,1: 1}, {0: 1,1: 10}, {0: 1,1: 100}] param_grid = dict (class_weight = balance) # определить процедуру оценки cv = RepeatedStratifiedKFold (n_splits = 10, n_repeats = 3, random_state = 1) # определить поиск по сетке grid = GridSearchridCV (param = param_grid, n_jobs = -1, cv = cv, scoring = ‘roc_auc’) # выполнить поиск по сетке grid_result = grid.fit (X, y) # сообщить о лучшей конфигурации print («Best:% f using% s»% (grid_result.best_score_, grid_result.best_params_)) # сообщить обо всех конфигурациях means = grid_result.cv_results_ [‘mean_test_score’] stds = grid_result.cv_results _ [‘std_test_score’] params = grid_result.cv_results _ [‘params’] для среднего, stdev, param в zip (means, stds, params):: print («% f (% f) с:% r»% (среднее, стандартное отклонение, параметр)) |
При выполнении примера оценивается вес каждого класса с использованием повторной k-кратной перекрестной проверки и отображается лучшая конфигурация и соответствующий средний показатель ROC AUC.
Примечание : Ваши результаты могут отличаться из-за стохастической природы алгоритма или процедуры оценки или различий в числовой точности. Попробуйте запустить пример несколько раз и сравните средний результат.
В этом случае мы видим, что соотношение 1: 100 от большинства к классу меньшинства дает лучший средний балл ROC. Это соответствует конфигурации для общей эвристики.
Было бы интересно изучить еще более строгие веса классов, чтобы увидеть их влияние на средний показатель ROC AUC.
Лучшее: 0,966189 при использовании {‘class_weight’: {0: 1, 1: 100}} 0,745249 (0,129002) с: {‘class_weight’: {0: 100, 1: 1}} 0,748407 (0,128049) с: {‘class_weight’: {0: 10, 1: 1}} 0.803727 (0.103536) с: {‘class_weight’: {0: 1, 1: 1}} 0,932620 (0,059869) с: {‘class_weight’: {0: 1, 1: 10}} 0,966189 (0,036310) с: {‘class_weight’: {0: 1, 1: 100}}
Best: 0,966189 с использованием {‘class_weight’: {0: 1, 1: 100}} 0.745249 (0.129002) с: {‘class_weight’: {0: 100, 1: 1}} 0,748407 (0.128049) с: {‘class_weight’: {0: 10, 1: 1}} 0.803727 (0.103536) с: {‘class_weight’: {0: 1, 1: 1}} 0,932620 (0,059869) с: {‘class_weight’: {0: 1, 1: 10}} 0,966189 (0,036310) с: {‘ class_weight ‘: {0: 1, 1: 100}} |
Дополнительная литература
Этот раздел предоставляет дополнительные ресурсы по теме, если вы хотите углубиться.
Документы
Книги
API
Статьи
Сводка
В этом руководстве вы обнаружили машины с взвешенными опорными векторами для несбалансированной классификации.
В частности, вы выучили:
- Как стандартный алгоритм машины опорных векторов ограничен для несбалансированной классификации.
- Как можно модифицировать алгоритм машины опорных векторов для взвешивания штрафа на марже, пропорционального важности класса во время обучения.
- Как настроить вес класса для SVM и как выполнить поиск по сетке для различных конфигураций веса класса.
Есть вопросы?
Задайте свои вопросы в комментариях ниже, и я постараюсь ответить.
Разберитесь с несбалансированной классификацией!
Разработка несбалансированных моделей обучения за считанные минуты
… всего несколькими строками кода Python
Узнайте, как в моей новой электронной книге:
Несбалансированная классификация с Python
Он предоставляет руководств для самообучения и сквозных проектов по:
Метрики производительности , Методы пониженной дискретизации , SMOTE , Смещение порога , Калибровка вероятности , Экономически чувствительные алгоритмы
и многое другое…
Привнесите несбалансированные методы классификации в свои проекты машинного обучения
Посмотрите, что внутри Классификация— как работает машина опорных векторов (SVM)?
Метод основан на проведении линии границы принятия решений, оставляющей как можно более широкий запас для первых положительных и отрицательных примеров:
Как на иллюстрации выше, если мы выберем ортогональный вектор так, что $ \ lVert w \ rVert = 1 $, мы сможем установить критерий решения для любого неизвестного примера $ \ mathbf u $, который будет каталогизирован как положительный в форме:
$$ \ color {синий} {\ mathbf w} \ cdot {\ mathbf u} \ geq C $$
, что соответствует значению, при котором проекция помещается за линией принятия решения в середине улицы.Обратите внимание, что $ \ color {blue} {\ mathbf w} \ cdot {\ mathbf u} = {\ mathbf u} \ cdot \ color {blue} {\ mathbf w} $.
Эквивалентным условием для положительной пробы будет:
$$ \ color {синий} {\ mathbf w} \ cdot \ mathbf u + b \ geq 0 \ tag 1 $$
с $ C = — b.
$Нам нужны $ b $ и $ \ color {blue} {\ mathbf w} $, чтобы иметь решающее правило, и чтобы добраться туда, нам нужно ограничений .
Первое ограничение , которое мы собираемся наложить, состоит в том, что для любой положительной выборки $ \ mathbf x _ +, $, $ \ color {blue} {\ mathbf w} \ cdot \ mathbf x_ + + b \ geq 1 $; а для отрицательных образцов — $ \ color {blue} {\ mathbf w} \ cdot \ mathbf x_- + b \ leq -1 $.На границе раздела или гиперплоскости ( медиана ) значение будет 0 $, а значения на желобах будут 1 $ и -1 $:
.Вектор $ \ bf w $ — это вектор весов , тогда как $ b $ — это смещение .
Чтобы свести эти два неравенства вместе, мы можем ввести переменную $ y_i $ так, чтобы $ y_i = + 1 $ для положительных примеров и $ y_i = -1 $, если примеры отрицательные, и заключить
$$ y_i (x_i \ cdot \ color {blue} {\ mathbf w} + b) -1 \ geq 0.
$Итак, мы устанавливаем, что это должно быть больше нуля, , но , если пример находится на гиперплоскостях («желобах»), которые максимизируют запас разделения между гиперплоскостью принятия решения и концами опорных векторов, в данном случае строк), затем:
$$ y_i \, (x_i \ cdot \ color {blue} {\ mathbf w} + b) -1 = 0 \ tag 2 $$
Обратите внимание, что это эквивалентно требованию $ y_i \, (x_i \ cdot \ color {blue} {\ mathbf w} + b) = 1. $
Второе ограничение : расстояние от гиперплоскости принятия решения до концов опорных векторов будет максимальным.Другими словами, предел разделения («улица») будет максимальным:
Предполагая единичный вектор, перпендикулярный границе принятия решения, $ \ mathbf w $, скалярное произведение с разницей между двумя «граничными» плюсами и минусами составляет ширину «улицы». :
$$ \ text {width} = (x_ + \, {\ bf -} \, x_-) \ cdot \ frac {w} {\ lVert w \ rVert} $$
В приведенном выше уравнении $ x _ + $ и $ x _- $ — это в желобе (на гиперплоскостях с максимальным разделением).Следовательно, для положительного примера: $ ({\ mathbf x_i} \ cdot \ color {blue} {\ mathbf w} + b) -1 = 0 $ или $ {\ mathbf x _ +} \ cdot \ color {blue} {\ mathbf w} = 1 — b $; и для отрицательного примера: $ {\ mathbf x _-} \ cdot \ color {blue} {\ mathbf w} = -1 — b $. Итак, переформулируем ширину улицы:
$$ \ begin {align} \ text {width} & = (x_ + \, {\ bf -} \, x_-) \ cdot \ frac {w} {\ lVert w \ rVert} \\ [1.5ex] & = \ frac {x _ + \ cdot w \, {\ bf -} \, x _- \ cdot w} {\ lVert w \ rVert} \\ [1.5ex] & = \ frac {1-b — (- 1-b)} {\ lVert w \ rVert} \\ [1.2 — \ sum \ lambda_i \ Big [y_i \, \ left (\ mathbf x_i \ cdot \ color {blue} {\ mathbf w} + b \ right) -1 \ Big] \ tag 5 $$
Дифференцирующая,
$$ \ frac {\ partial \ mathscr {L}} {\ partial \ color {синий} {\ mathbf w}} = \ color {синий} {\ mathbf w} — \ sum \ lambda_i \; y_i \; \ mathbf x_i = 0 $$.
Следовательно,
$$ \ color {синий} {\ mathbf w} = \ sum \ lambda_i \; y_i \; \ mathbf x_i \ tag 6 $$
И дифференциация по $ b:
$$$ \ frac {\ partial \ mathscr {L}} {\ partial b} = — \ sum \ lambda_i y_i = 0, $$
, что означает, что у нас есть произведение множителей и меток с нулевой суммой:
$$ \ сумма \ lambda_i \, y_i = 0 \ tag 7 $$
Подставляя уравнение (6) обратно в уравнение (5),
$$ \ mathscr {L} = \ frac {1} {2} \ color {purple} {\ left (\ sum \ lambda_i y_i \ mathbf x_i \ right) \, \ left (\ sum \ lambda_j y_j \ mathbf x_j \ right)} — \ color {green} {\ left (\ sum \ lambda_i y_i \ mathbf x_i \ right) \ cdot \ left (\ sum \ lambda_j y_j \ mathbf x_j \ right)} — \ sum \ lambda_i y_i b + \ sum \ lambda_i $$
Предпоследний член равен нулю согласно уравнению (7).
Следовательно,
$$ \ mathscr {L} = \ sum \ lambda_i — \ frac {1} {2} \ displaystyle \ sum_i \ sum_j \ lambda_i \ lambda_j \, \, y_i y_j \, \, \ mathbf x_i \ cdot \ mathbf x_j \ tag 8 $$
Уравнение (8) является окончательным лагранжианом.
Следовательно, оптимизация зависит от скалярного произведения пар примеров.
Возвращаясь к «решающему правилу» в уравнении (1) выше и используя уравнение (6):
$$ \ сумма \; \ lambda_i \; y_i \; \ mathbf x_i \ cdot \ mathbf u + b \ geq 0 \ tag 9 $$
будет окончательным правилом решения для нового вектора $ \ mathbf u.$
машин опорных векторов для двоичной классификации — MATLAB и Simulink
Разделимые данные
Вы можете использовать машину опорных векторов (SVM), когда ваши данные имеют ровно два класса. SVM классифицирует данные, находя лучшую гиперплоскость, которая отделяет все точки данных одного класса от точек другого класса. Лучшая гиперплоскость для SVM означает гиперплоскость с наибольшим запасом между двумя классами. Маржа означает максимальную ширину плиты, параллельную гиперплоскости, не имеющую внутренних точек данных.
Опорные векторы — это точки данных, которые находятся ближе всего к разделяющей гиперплоскости; эти точки находятся на границе плиты. На следующем рисунке показаны эти определения, где + указывает точки данных типа 1, а — указывает точки данных типа –1.
Математическая формулировка: Primal. Это обсуждение следует за Хасти, Тибширани и Фридманом [1] и Кристианини и Шоу-Тейлор [2].
Данные для обучения представляют собой набор точек (векторов) x j вместе с их категориями y j .Для некоторого размера d , x j ∊ R d и y j = ± 1. Уравнение гиперплоскости
, где β ∊ R d и b — действительное число.
Следующая задача определяет наилучшую разделяющую гиперплоскость (т. Е. Границу решения). Найдите β и b , которые минимизируют || β || так, что для всех точек данных ( x j , y j ),
Опорными векторами являются x j на границе, для которых yjf (xj) = 1.(z) — это классификационная оценка и представляет собой расстояние z от границы принятия решения.
Математическая формулировка: двойственная. Решить двойную задачу квадратичного программирования в вычислительном отношении проще. Чтобы получить двойственное, возьмите положительные множители Лагранжа α j , умноженные на каждое ограничение, и вычтите из целевой функции:
, где вы ищите стационарную точку L P над β и b. .Установив градиент L P на 0, вы получите
β = ∑jαjyjxj0 = ∑jαjyj. | (1) |
Подставив в L P , вы получите двойной L D :
, который вы максимизируете более чем α j ≥ 0. В общем, многие α j — максимум 0. Ненулевое значение α j в решении двойной задачи определяет гиперплоскость, как показано в уравнении 1, которое дает β как сумму α j y j x j .Точки данных x j , соответствующие отличному от нуля α j , являются опорными векторами .
Производная L D относительно ненулевого значения α j равна 0 в оптимуме. Это дает
В частности, это дает значение b в решении, если взять любое j с ненулевым α j .
Дуал — это стандартная задача квадратичного программирования.Например, Optimization Toolbox ™ quadprog
(Optimization Toolbox) решатель решает этот тип проблем.
Несепарабельные данные
Ваши данные могут не допускать разделяющую гиперплоскость. В этом случае SVM может использовать мягкое поле , что означает гиперплоскость, разделяющую многие, но не все точки данных.
Есть два стандартных состава мягких полей. Оба включают добавление переменных резервов ξ j и параметра штрафа C .
Норма L 1 :
, так что
Норма L 1 относится к использованию ξ j в качестве переменных запаса вместо их квадратов. Три варианта решателя:
SMO
,ISDA
иL1QP
изfitcsvm
минимизируют проблему L 1 -norm.Нормальная проблема L 2 :
с теми же ограничениями.
В этих формулировках вы можете видеть, что увеличение C придает больший вес переменным резервов ξ j , что означает, что оптимизация пытается более строго разделить классы. Точно так же уменьшение C до 0 делает неправильную классификацию менее важной.
Математическая формулировка: двойственная. Для упрощения вычислений рассмотрим двойную задачу L 1 для этой формулировки с мягким краем.Используя множители Лагранжа μ j , функция для минимизации нормальной задачи L 1 :
, где вы ищите стационарную точку L P над β , b , а положительный ξ j . Устанавливая градиент L P на 0, вы получаете
Эти уравнения приводят непосредственно к двойной формулировке:
с учетом ограничений
Окончательный набор неравенств, 0 ≤ α j ≤ C показывает, почему C иногда называют ограничением блока . C сохраняет допустимые значения множителей Лагранжа α j в «прямоугольнике», ограниченной области.
Уравнение градиента для b дает решение b в терминах набора ненулевых α j , которые соответствуют опорным векторам.
Аналогичным образом можно написать и решить двойную задачу L 2 -norm. Подробнее см. Кристианини и Шоу-Тейлор [2], глава 6.
fitcsvm
Внедрение. Обе двойные задачи с мягким краем являются задачами квадратичного программирования. Внутри fitcsvm
есть несколько различных алгоритмов решения проблем.
Для одноклассной или двоичной классификации, если вы не устанавливаете долю ожидаемых выбросов в данных (см.
OutlierFraction
), то решателем по умолчанию является последовательная минимальная оптимизация (SMO). SMO минимизирует проблему с одной нормой с помощью серии минимизаций по двум точкам.Во время оптимизации SMO учитывает линейное ограничение ∑iαiyi = 0 и явно включает член смещения в модель. SMO относительно быстро. Подробнее о SMO см. [3].Для двоичной классификации, если вы устанавливаете долю ожидаемых выбросов в данных, то решателем по умолчанию будет Итеративный алгоритм отдельных данных. Как и SMO, ISDA решает проблему одной нормы. В отличие от SMO, ISDA минимизирует серию по одноточечной минимизации, не соблюдает линейное ограничение и не включает явным образом член смещения в модель.Подробнее об ISDA см. [4].
Для одноклассной или двоичной классификации и если у вас есть лицензия Optimization Toolbox, вы можете использовать
quadprog
(Optimization Toolbox) для решения проблемы с одной нормой.quadprog
использует много памяти, но решает квадратичные программы с высокой степенью точности. Для получения дополнительных сведений см. Определение квадратичного программирования (Инструменты оптимизации).
Нелинейное преобразование с ядрами
Некоторые задачи двоичной классификации не имеют простой гиперплоскости в качестве полезного критерия разделения.Для этих задач существует вариант математического подхода, который сохраняет почти всю простоту разделяющей гиперплоскости SVM.
В этом подходе используются следующие результаты теории воспроизведения ядер:
Существует класс функций G ( x 1 , x 2 ) со следующим свойством. Существует линейное пространство S и функция φ , отображающая x в S , так что
G ( x 1 , x 2 ) = < φ ( x 1 ), φ ( x 2 )>.
Скалярное произведение имеет место в пространстве S .
Этот класс функций включает:
Полиномы: для некоторого положительного целого числа p ,
G ( x 1 , x 2 ) = (1 + x 1 ′ x 2 ) p .
Радиальная базисная функция (по Гауссу):
G ( x 1 , x 2 ) = exp (–∥ x 1 — x 2 ) ∥ 2 ).
Многослойный персептрон или сигмоид (нейронная сеть): для положительного числа p 1 и отрицательного числа p 2 ,
G ( x 1 , x 2 ) = tanh ( p 1 x 1 ′ x 2 + p 2 ).
Математический подход с использованием ядер основан на вычислительном методе гиперплоскостей.Все вычисления для классификации гиперплоскостей используют не что иное, как скалярные произведения. Следовательно, нелинейные ядра могут использовать идентичные вычисления и алгоритмы решения, а также получать нелинейные классификаторы. Результирующие классификаторы представляют собой гиперповерхности в некотором пространстве S , но пространство S не нужно идентифицировать или исследовать.
(Учебное пособие) Машины опорных векторов (SVM) в Scikit-learn
SVM предлагает очень высокую точность по сравнению с другими классификаторами, такими как логистическая регрессия и деревья решений.Он известен своей уловкой ядра для обработки нелинейных входных пространств. Он используется в различных приложениях, таких как обнаружение лиц, обнаружение вторжений, классификация электронных писем, новостных статей и веб-страниц, классификация генов и распознавание почерка.
В этом руководстве вы будете использовать scikit-learn на Python. Если вы хотите узнать больше об этом пакете Python, я рекомендую вам взглянуть на наш курс контролируемого обучения с помощью scikit-learn.
SVM — захватывающий алгоритм, и концепция относительно проста.Классификатор разделяет точки данных с помощью гиперплоскости с наибольшим размером поля. Вот почему классификатор SVM также известен как дискриминантный классификатор. SVM находит оптимальную гиперплоскость, которая помогает в классификации новых точек данных.
Машины опорных векторов
Обычно машины опорных векторов считаются подходом к классификации, но его можно использовать как в задачах классификации, так и в задачах регрессии. Он может легко обрабатывать несколько непрерывных и категориальных переменных.SVM строит гиперплоскость в многомерном пространстве для разделения разных классов. SVM итеративно генерирует оптимальную гиперплоскость, которая используется для минимизации ошибки. Основная идея SVM — найти максимальную маргинальную гиперплоскость (MMH), которая наилучшим образом разделяет набор данных на классы.
Опорные векторы
Опорные векторы — это точки данных, которые находятся ближе всего к гиперплоскости. Эти точки будут лучше определять разделительную линию при расчете полей. Эти моменты больше подходят для построения классификатора.
Гиперплоскость
Гиперплоскость — это плоскость принятия решений, которая разделяет набор объектов, имеющих различную принадлежность к классам.
Маржа
Маржа — это промежуток между двумя линиями на ближайших классных точках. Это рассчитывается как перпендикулярное расстояние от линии до опорных векторов или ближайших точек. Если разница между классами больше, то это считается хорошей маржей, меньшая маржа — плохой.
Как работает SVM?
Основная цель — наилучшим образом разделить данный набор данных.Расстояние между ближайшими точками называется полем. Цель состоит в том, чтобы выбрать гиперплоскость с максимально возможным запасом между опорными векторами в данном наборе данных. SVM ищет максимальную граничную гиперплоскость, выполнив следующие шаги:
Создает гиперплоскости, которые наилучшим образом разделяют классы. На рисунке слева показаны три гиперплоскости: черный, синий и оранжевый. Здесь синий и оранжевый имеют более высокую ошибку классификации, но черный правильно разделяет два класса.
Выберите правую гиперплоскость с максимальным отделением от ближайших точек данных, как показано на рисунке справа.
Работа с нелинейными и неразрывными плоскостями
Некоторые проблемы невозможно решить с помощью линейной гиперплоскости, как показано на рисунке ниже (слева).
В такой ситуации SVM использует трюк с ядром для преобразования входного пространства в пространство более высокой размерности, как показано справа.2). Теперь вы можете легко разделить эти точки с помощью линейного разделения.
Ядра SVM
На практике алгоритм SVM реализован с использованием ядра. Ядро преобразует пространство входных данных в требуемую форму. SVM использует технику, называемую трюком с ядром. Здесь ядро берет низкоразмерное входное пространство и преобразует его в более высокомерное пространство. Другими словами, вы можете сказать, что он преобразует неразрывную проблему в разделимые проблемы, добавляя к ней больше измерений.Это наиболее полезно в задаче нелинейного разделения. Уловка с ядром поможет вам построить более точный классификатор.
- Линейное ядро Линейное ядро может использоваться как нормальное скалярное произведение любых двух данных наблюдений. Произведение между двумя векторами — это сумма умножения каждой пары входных значений.
К (x, xi) = сумма (x * xi)
- Полиномиальное ядро Полиномиальное ядро - это более обобщенная форма линейного ядра.2))
Здесь гамма — это параметр, который находится в диапазоне от 0 до 1. Более высокое значение гаммы идеально соответствует набору обучающих данных, что приводит к чрезмерной подгонке. Гамма = 0,1 считается хорошим значением по умолчанию. Значение гаммы необходимо вручную указать в алгоритме обучения.
Здание классификатора в Scikit-learn
До сих пор вы изучили теоретические основы SVM. Теперь вы узнаете о его реализации на Python с помощью scikit-learn.
В модели строительной части вы можете использовать набор данных рака, что является очень известной проблемой классификации нескольких классов. Этот набор данных вычисляется из оцифрованного изображения тонкой иглы для аспирации (FNA) новообразования груди. Они описывают характеристики ядер клеток, представленных на изображении.
Набор данных включает 30 характеристик (средний радиус, средняя текстура, средний периметр, средняя площадь, средняя гладкость, средняя компактность, средняя вогнутость, средние вогнутые точки, средняя симметрия, средняя фрактальная размерность, ошибка радиуса, ошибка текстуры, ошибка периметра, ошибка площади). , ошибка гладкости, ошибка компактности, ошибка вогнутости, ошибка точек вогнутости, ошибка симметрии, ошибка фрактального измерения, худший радиус, худшая текстура, худший периметр, худшая область, худшая гладкость, худшая компактность, худшая вогнутость, худшие точки вогнутости, худшая симметрия и худшая фрактальная размерность) и цель (тип рака).
В этих данных есть два типа рака: злокачественный (вредный) и доброкачественный (невредный). Здесь вы можете построить модель для классификации типа рака. Набор данных доступен в библиотеке scikit-learn, или вы также можете загрузить его из библиотеки машинного обучения UCI.
Загрузка данных
Давайте сначала загрузим необходимый набор данных, который вы будете использовать.
# Импорт библиотеки набора данных scikit-learn из наборов данных импорта sklearn # Загрузить набор данных рак = наборы данных.load_breast_cancer ()
Исследование данных
После загрузки набора данных вы можете узнать о нем немного больше. Вы можете проверить имена функций и целей.
# вывести названия 13 функций print ("Характеристики:", Cancer.feature_names) # распечатать этикетку типа рака ('злокачественный' 'доброкачественный') print ("Ярлыки:", Cance.target_names)
Характеристики: ['средний радиус' 'средняя текстура' 'средний периметр' 'средняя площадь' 'средняя гладкость' означает компактность 'означает вогнутость' 'средние вогнутые точки' 'средняя симметрия' 'средняя фрактальная размерность' 'ошибка радиуса' ошибка текстуры 'ошибка периметра' ошибка области ' 'ошибка гладкости' ошибка компактности 'ошибка вогнутости' 'ошибка вогнутых точек' ошибка симметрии 'ошибка фрактальной размерности' 'худший радиус' худшая текстура 'худший периметр' худшая область ' 'худшая гладкость' худшая компактность 'худшая вогнутость' "худшие вогнутые точки" худшая симметрия "худшее фрактальное измерение"] Ярлыки: ['злокачественный' 'доброкачественный']
Давайте рассмотрим его подробнее.Вы также можете проверить форму набора данных с помощью shape.
# данные для печати (функция) shape рак.data.shape
(569, 30)
Давайте проверим 5 лучших записей набора функций.
# распечатать функции данных рака (первые 5 записей) печать (раковые данные [0: 5])
[[1.799e + 01 1.038e + 01 1.228e + 02 1.001e + 03 1.184e-01 2.776e-01 3.001e-01 1.471e-01 2.419e-01 7.871e-02 1.095e + 00 9.053e-01 8.589e + 00 1.534e + 02 6.399e-03 4.904e-02 5.373e-02 1.587e-02 3.003e-02 6.193e-03 2.538e + 01 1.733e + 01 1.846e + 02 2.019e + 03 1.622e-01 6.656e-01 7.119e-01 2.654e-01 4.601e-01 1.189e-01] [2.057e + 01 1.777e + 01 1.329e + 02 1.326e + 03 8.474e-02 7.864e-02 8.690e-02 7.017e-02 1.812e-01 5.667e-02 5.435e-01 7.339e-01 3.398e + 00 7.408e + 01 5.225e-03 1.308e-02 1.860e-02 1.340e-02 1.389e-02 3.532e-03 2.499e + 01 2.341e + 01 1.588e + 02 1.956e + 03 1.238e-01 1.866e-01 2.416e-01 1.860e-01 2.750e-01 8.902e-02] [1.969e + 01 2.125e + 01 1.300e + 02 1.203e + 03 1.096e-01 1.599e-01 1.974e-01 1.279e-01 2.069e-01 5.999e-02 7.456e-01 7.869e-01 4.585e + 00 9.403e + 01 6.150e-03 4.006e-02 3.832e-02 2.058e-02 2.250e-02 4.571e-03 2.357e + 01 2.553e + 01 1.525e + 02 1.709e + 03 1.444e-01 4.245e-01 4.504e-01 2.430e-01 3.613e-01 8.758e-02] [1.142e + 01 2.038e + 01 7.758e + 01 3.861e + 02 1.425e-01 2.839e-01 2.414e-01 1.052e-01 2.597e-01 9.744e-02 4.956e-01 1.156e + 00 3.445e + 00 2.723e + 01 9.110e-03 7.458e-02 5.661e-02 1.867e-02 5.963e-02 9.208e-03 1.491e + 01 2.650e + 01 9.887e + 01 5.677e + 02 2.098e-01 8.663e-01 6.869e-01 2.575e-01 6.638e-01 1.730e-01] [2.029e + 01 1.434e + 01 1.351e + 02 1.297e + 03 1.003e-01 1.328e-01 1.980e-01 1.043e-01 1.809e-01 5.883e-02 7.572e-01 7.813e-01 5.438e + 00 9.444e + 01 1.149e-02 2.461e-02 5.688e-02 1.885e-02 1.756e-02 5.115e-03 2.254e + 01 1.667e + 01 1.522e + 02 1.575e + 03 1.374e-01 2.050e-01 4.000e-01 1.625e-01 2.364e-01 7.678e-02]]
Давайте посмотрим на целевой набор.
# распечатать метки рака (0: злокачественный, 1: доброкачественный) печать (Cance.target)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1]
Разделение данных
Чтобы понять производительность модели, хорошей стратегией является разделение набора данных на обучающий набор и тестовый набор.
Разделите набор данных с помощью функции
train_test_split ()
. вам нужно передать 3 параметра features, target и test_set size. Кроме того, вы можете использовать random_state для случайного выбора записей.# Импортировать функцию train_test_split из sklearn.model_selection import train_test_split # Разделить набор данных на обучающий набор и тестовый набор X_train, X_test, y_train, y_test = train_test_split (Cance.data, Cance.target, test_size = 0.3, random_state = 109) # 70% обучение и 30% тест
Генерирующая модель
Построим опорную векторную модель машины.Сначала импортируйте модуль SVM и создайте объект классификатора вектора поддержки, передав аргумент kernel как линейное ядро в функции
SVC ()
.Затем поместите свою модель в набор поездов с помощью
fit ()
и выполните прогноз на тестовом наборе с помощьюpred ()
.# Импорт модели svm из sklearn import svm # Создание svm-классификатора clf = svm.SVC (kernel = 'linear') # Линейное ядро # Обучите модель с помощью обучающих наборов clf.подходят (X_train, y_train) # Предсказать ответ для тестового набора данных y_pred = clf.predict (X_test)
Оценка модели
Давайте оценим, насколько точно классификатор или модель может предсказать рак груди у пациенток.
Точность можно вычислить путем сравнения фактических значений тестовой выборки и прогнозируемых значений.
# Импорт модуля метрик scikit-learn для расчета точности из показателей импорта sklearn # Точность модели: как часто классификатор верен? print ("Точность:", метрики.precision_score (y_test, y_pred))
Точность: 0,964
07017544 Итак, у вас коэффициент классификации 96,49%, что считается очень хорошей точностью.
Для дальнейшей оценки вы также можете проверить точность и отзыв модели.
# Model Precision: какой процент положительных кортежей помечены как таковые? print ("Точность:", metrics.precision_score (y_test, y_pred)) # Отзыв модели: какой процент положительных кортежей помечены как таковые? print ("Напомнить:", metrics.отзыв_score (y_test, y_pred))
Точность: 0,9811320754716981 Напомним: 0,9629629629629629
Итак, вы получили точность 98% и запоминание 96%, что считается очень хорошими значениями.
Настройка гиперпараметров
- Ядро : Основная функция ядра — преобразовать входные данные заданного набора данных в требуемую форму. Существуют различные типы функций, такие как линейная, полиномиальная и радиальная базисная функция (RBF).Полином и RBF полезны для нелинейной гиперплоскости. Ядра Polynomial и RBF вычисляют разделительную линию в более высоком измерении. В некоторых приложениях предлагается использовать более сложное ядро для разделения изогнутых или нелинейных классов. Это преобразование может привести к более точным классификаторам.
- Регуляризация : параметр регуляризации в параметре Python Scikit-learn C, используемый для поддержания регуляризации. Здесь C — параметр штрафа, который представляет ошибочную классификацию или член ошибки.Термин «неправильная классификация» или «ошибка» сообщает оптимизатору SVM, насколько допустима ошибка. Вот как вы можете контролировать компромисс между границей решения и ошибочной классификацией. Меньшее значение C создает гиперплоскость с маленькими полями, а большее значение C создает гиперплоскость с большими полями.
- Гамма : более низкое значение гаммы будет плохо соответствовать набору обучающих данных, тогда как более высокое значение гаммы будет точно соответствовать набору обучающих данных, что приведет к чрезмерной подгонке.Другими словами, вы можете сказать, что низкое значение гаммы учитывает только близлежащие точки при вычислении линии разделения, в то время как значение гаммы учитывает все точки данных при вычислении линии разделения.
Преимущества
КлассификаторыSVM обеспечивают хорошую точность и обеспечивают более быстрое прогнозирование по сравнению с наивным байесовским алгоритмом. Они также используют меньше памяти, потому что используют подмножество тренировочных точек на этапе принятия решения. SVM хорошо работает с четким разделением и пространством большой размерности.
Недостатки
SVM не подходит для больших наборов данных из-за большого времени обучения, а также требует больше времени на обучение по сравнению с наивным байесовским методом. Он плохо работает с перекрывающимися классами, а также чувствителен к типу используемого ядра.
Заключение
Поздравляем, вы дошли до конца этого урока!
В этом руководстве вы много узнали об алгоритме опорной векторной машины, его работе, ядрах, настройке гиперпараметров, построении модели и оценке набора данных о раке груди с использованием пакета Scikit-learn.Вы также рассмотрели его преимущества и недостатки. Надеюсь, вы узнали что-то ценное!
Чтобы узнать больше об этом типе классификаторов, вам следует взглянуть на наш курс «Линейные классификаторы в Python». Он вводит другие типы функций регрессии и потерь, а также машины опорных векторов.
Я с нетерпением жду любых отзывов или вопросов. Вы можете задать вопрос, оставив комментарий, и я постараюсь на него ответить.
Как работает алгоритм опорных векторов (SVM) в машинном обучении?
Я предполагаю, что к настоящему времени был бы знаком с алгоритмами линейной регрессии и логистической регрессии.Если вы не следовали тому же алгоритму, я бы порекомендовал вам сначала пройти их, прежде чем переходить к поддержке векторных машин.
Машина опорных векторов — очень важный и универсальный алгоритм машинного обучения, он способен выполнять линейную и нелинейную классификацию, регрессию и обнаружение выбросов. Машины опорных векторов, также известные как SVM, — еще один алгоритм, широко используемый специалистами по машинному обучению как для классификации, так и для решения задач регрессии, но широко используется для задач классификации.Он предпочтительнее других алгоритмов классификации, поскольку требует меньше вычислений и обеспечивает заметную точность. Это хорошо, потому что дает надежные результаты даже при меньшем количестве данных.
В этом блоге мы объясним, что такое SVM, как работает SVM, плюсы и минусы SVM, а также практические проблемы с использованием SVM в Python.
Машина опорных векторов — это модель машинного обучения, которая может делать обобщения между двумя разными классами, если набор помеченных данных предоставляется в обучающем наборе для алгоритма.Основная функция SVM — проверить ту гиперплоскость, которая способна различать два класса.
Может быть много гиперплоскостей, которые могут выполнить эту задачу, но цель состоит в том, чтобы найти ту гиперплоскость, которая имеет наивысший запас, который означает максимальные расстояния между двумя классами, чтобы в будущем, если появится новая точка данных, которая является двумя, классифицирована, тогда она можно легко классифицировать.
Как работает Svm ? 1.Линейно разделяемые данныеДавайте разберемся в работе SVM, взяв пример, где у нас есть два класса, которые показаны на изображении ниже, которые являются классом A: Круг и классом B: Треугольник. Теперь мы хотим применить алгоритм SVM и найти лучшую гиперплоскость, разделяющую оба класса.
Класс A и B
Данные с маркировкой
SVM принимает во внимание все точки данных и выдает строку, которая называется « Hyperplane », которая разделяет оба класса.Эта строка называется « Граница решения ». Все, что попадает в класс круга, будет относиться к классу А и наоборот.
Все гиперплоскости не подходят для классификации
Может быть много гиперплоскостей, которые вы можете видеть, но лучшей гиперплоскостью, разделяющей два класса, будет гиперплоскость, находящаяся на большом расстоянии от гиперплоскости обоих классов.Это основной мотив SVM для поиска таких лучших гиперплоскостей.
Могут быть разные размеры, которые зависят исключительно от имеющихся у нас функций. Трудно визуализировать, когда функций больше 3.
Класс A — Красный и Класс B Желтый
Предположим, у нас есть два класса: красный и желтый — A и B соответственно. Нам нужно найти между ними лучшую гиперплоскость, разделяющую два класса.
Мягкий край и гиперплоскость
Мягкая маржа позволяет ошибочно классифицировать некоторые из вышеперечисленных точек данных. Кроме того, он пытается найти баланс между поиском гиперплоскости, которая пытается сделать меньше ошибок в классификации и максимизировать запас.
2. Линейно неразделимые данныеЛинейно неотделимый набор данных
Если данные не разделимы линейно, как показано на рисунке выше, тогда SVM использует уловки ядра, чтобы сделать их линейно разделимыми.Концепция преобразования нелинейно разделяемых данных в линейно разделяемые называется теоремой Ковер. — « g . Если набор обучающих данных не является линейно разделяемым, с высокой вероятностью он может быть преобразован в линейно разделяемый обучающий набор с помощью проецируя его в многомерное пространство посредством некоторого нелинейного преобразования ». Уловки с ядром помогают проецировать точки данных в пространство более высоких измерений, благодаря чему их стало относительно легче разделять в пространстве более высоких измерений.
Уловки ядра:Уловки с ядром, также известные как обобщенное скалярное произведение. Уловки с ядром — это способ вычисления скалярного произведения двух векторов, чтобы проверить, насколько они влияют друг на друга. Согласно теореме Ковер, вероятность того, что линейно неразделимые наборы данных станут линейно разделимыми, возрастает в более высоких измерениях. Функции ядра используются для получения скалярных произведений для решения ограниченной оптимизации SVM.
Функции ядра SVM:Функции ядра | Кредит: Источник
При использовании классификатора svm мы можем принять ядро как «linear», «poly», «rbf», «sigmoid».Давайте посмотрим, какие ядра используются чаще всего: полиномиальные и rbf (радиальная базисная функция). Здесь вы можете найти документацию по sklearn.
Рекомендуемый блог: Введение в алгоритм XGBoost для классификации и регрессии
Степень допуска в SVMШтрафной член, который передается как гиперпараметр в SVM при работе как с линейно разделяемыми, так и с нелинейными решениями, обозначается как «C», что называется степенью допуска.Большое значение C приводит к большему штрафу SVM за ошибочную классификацию. Граница решения будет зависеть от узкой маржи и меньшего количества векторов поддержки.
Плюсы SVMВысокая стабильность благодаря зависимости от опорных векторов, а не от точек данных.
Не подвержен влиянию выбросов.
Никаких предположений относительно наборов данных не делалось.
Проблема численного предсказания может быть решена с помощью SVM.
Мы возьмем набор данных рака груди из библиотеки sklearn, мы будем реализовывать машину векторов поддержки и найдем точность для нашей модели. SVM обычно предпочтительнее для небольших наборов данных, поскольку они оказались более точными, чем любой другой метод регрессии.
импортировать numpy как np импортировать matplotlib.pyplot как plt из sklearn import svm из наборов данных импорта sklearn рак = наборы данных.load_breast_cancer () print ("Ярлыки:", Cance.target_names)
ШАГОВ :
из sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split (раковые данные, рак. цель, размер теста = 0.4, random_state = 99) classifier = svm.SVC (ядро = 'линейный') classifier.fit (X_train, y_train) y_pred = clf.predict (X_test) из показателей импорта sklearn print ("Точность:", metrics.accuracy_score (y_test, y_pred))
Разделил набор данных с помощью train_test-split из sklearn.
Для оценки модели импортирована precision_score
Инициированный объект для SVC, который является svc_model, подогнал обучающие данные к модели.Используется «linear» как ядро.
Сделал прогноз по y_test и рассчитал оценку точности на тестовых данных
, что составило 96%.
ЗаключениеВ этом блоге я попытался объяснить вам машину опорных векторов и то, как она работает.