Scikit-learn: Реализуйте коэффициент сходства Гауэра

Созданный на 19 нояб. 2015  ·  51Комментарии  ·  Источник: scikit-learn/scikit-learn

По предложению @lesshaste

Бумага - http://cbio.ensmp.fr/~jvert/svn/bibli/local/Gower1971general.pdf

Могу ли я это реализовать, если будет достаточный интерес?

@jnothman @amueller @agramfort

New Feature

Самый полезный комментарий

Привет,

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

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

Исходный код доступен в этой записной книжке jupyter: https://sourceforge.net/projects/gower-distance-4python/files/

Не стесняйтесь использовать это

Все 51 Комментарий

Спасибо.

Эта документация для daisy из R тоже может быть актуальной https://stat.ethz.ch/R-manual/R-devel/library/cluster/html/daisy.html, поскольку это популярный вариант использования для коэффициент Гауэра.

предложил где? в каком контексте?

@agramfort Я предложил это на gitter. Основной интерес для этого коэффициента возникает, когда переменные имеют смешанные типы (то есть категориальные, числовые, порядковые). Один из популярных вариантов использования - упомянутый ранее пакет R daisy() при кластеризации данных со смешанными типами (см. Стр. 27 https://cran.r-project.org/web/packages/cluster/cluster.pdf) . В более общем плане http://www.clustan.talktalk.net/gower_similarity.html утверждает: «Общий коэффициент сходства Гауэра - один из самых популярных показателей близости для смешанных типов данных». что кажется правдоподобным утверждением.

есть ли эталонный или убедительный пример, который мотивировал бы это?

@agramfort Я думаю, что в настоящее время у нас нет другого способа вычисления коэффициента несходства для смешанных типов данных, и это, кажется, стандартный. Я могу найти множество примеров и вопросов / ответов в Интернете, где люди объясняют, что такое коэффициент Гауэра, или предлагают его использовать для смешанных типов данных, но я пока ничего не могу назвать эталоном. Согласно исследованию Google, оригинальная статья была процитирована 2298 раз.

ок я убежден :)

@agramfort Отлично! Это изменение прекрасно дополнит https://github.com/scikit-learn/scikit-learn/pull/4899, который вводит встроенную поддержку категориальных переменных для деревьев.

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

@amueller Чтобы [New Feature] ...

Привет,

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

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

Исходный код доступен в этой записной книжке jupyter: https://sourceforge.net/projects/gower-distance-4python/files/

Не стесняйтесь использовать это

Мне просто было интересно, было ли что-нибудь по этому поводу? Кроме того, проблема, отмеченная @marcelobeckmann, по- прежнему актуальна?

@ ashimb9, похоже, нам нужен кто-то, чтобы интегрировать код из @marcelobeckmann

@agramfort Хм, в таком случае я собираюсь попробовать, когда у меня будет немного свободного времени. Кстати, знаете ли вы что-нибудь о текущем состоянии проблемы, отмеченной выше: «в модуле pdist, потому что внутри pdist выполняет несколько числовых преобразований, которые не работают, если вы используете матрицу со смешанными данными»

Привет, есть несколько частных функций (например, _convert_to_double, _copy_array_if_base_present) в pdist, которые предполагают, что базовые данные полностью числовые, что неверно, когда у вас есть Dataframe с категориальными данными.

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

Функция назначения github работает только для членов команды

17 июля 2017 года, 19:32, "marcelobeckmann" [email protected] написал:

Привет, есть несколько частных функций (например, _convert_to_double,
_copy_array_if_base_present) в pdist, которые предполагают, что базовые данные
полностью числовым, что неверно, если у вас есть Dataframe с
категориальные данные.

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

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/5884#issuecomment-315707830 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AAEz62L3HHzGsSerW5G3n-Z8rrNoV6mwks5sOyoTgaJpZM4Glm0p
.

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

Спасибо @marcelobeckmann за это. Пока вы занимаетесь этим (и если это возможно для вас), мне было интересно, не могли бы вы рассмотреть возможность добавления поддержки вычисления gower для данных со значениями NaN, как это реализовано в пакете daisy в R (на который вы также ссылались выше) ?

Я завершил интеграцию Gower в sklearn.metrics.pairwise (также наблюдая за обработкой значений NaN). Я собираюсь подготовить несколько модульных тестов, прежде чем отправлять свой разветвленный код.

@marcelobeckmann Отлично! Большое спасибо, особенно за поддержку NaN! :)

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

Несколько дней назад я сделал запрос на перенос, b5884.

Да, он в очереди на рассмотрение.

17 августа 2017 г., в 23:40, Марсело Бекманн [email protected]
написал:

Несколько дней назад я сделал запрос на перенос, b5884.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/5884#issuecomment-323076581 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AAEz69uMu0XsoAUfvwWikkadjGCk5yvKks5sZELKgaJpZM4Glm0p
.

Я внес изменения, требуемые CI, и все проверки прошли.

@marcelobeckmann отличная работа! вы можете изменить строку 659 на что-то вроде:
ranges_of_numeric[col] = (1 - min / max, 0)[max == 0] if (max!=0) else 0.0

В противном случае я получаю деление на нулевые предупреждения во втором тестовом примере.

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

@marcelobeckmann и, возможно, другие.

Привет, Марсело (или, возможно, другие), получил несколько быстрых вопросов относительно вашей реализации коэффициента gower, который вы разместили здесь: https://sourceforge.net/projects/gower-distance-4python/files/.

  1. Нужен ли мне panda dataFrame для подачи исходных данных в функцию или я могу также использовать массив numpy?

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

  • во-первых, когда я запускаю функцию, она возвращает предупреждение о преобразовании данных, в котором говорится, что dtype U7 был преобразован в объект !!. Я предположил, что это произошло потому, что записи массива по какой-то причине заключены в кавычки и, следовательно, являются строками. Итак, я привел тип записей массива, например, к int32, и он по-прежнему дает ошибку преобразования, говоря, что int32 был преобразован в объекты

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

Не могли бы вы мне посоветовать, пожалуйста?

Спасибо большое

Привет Али,

Благодарим за интерес к этой реализации расстояния Гауэра.

Хотя код, который я сделал запрос на перенос, не одобрен коммитерами scikit learn (CI зеленый и просто ждет обзора), я отправил эту новейшую и стабильную реализацию на: https://sourceforge.net/projects/gower-distance -4python / файлы / gower_function-v3.ipynb / скачать

Давайте ответим на ваши вопросы:

  1. Нужен ли мне Panda DataFrame для подачи исходных данных в функцию, или я также могу использовать массив numpy?

Ответ: Вы можете использовать DataFrame или Numpy в этой новой версии 3. Также поддерживаются разреженные матрицы.

  1. . Я импортирую свои данные в массив numpy. Все столбцы представляют собой числовые действительные числа, за исключением первого столбца, который является уникальным идентификатором. У меня две проблемы,
  • во-первых, когда я запускаю функцию, она возвращает предупреждение о преобразовании данных, в котором говорится, что dtype U7 был преобразован в объект !!. Я предположил, что это произошло потому, что записи массива по какой-то причине заключены в кавычки и, следовательно, являются строками. Итак, я привел тип записей массива, например, к int32, и он по-прежнему дает ошибку преобразования, говоря, что int32 был преобразован в объекты

Ответ: Эта новая версия поддерживает числовые категориальные атрибуты, есть дополнительный параметр category_features, в котором вы можете установить массив с false (для числовых атрибутов) или true (для категориальных).

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

Ответ: Новая версия, которую я опубликовал, решила эту проблему.

обратите внимание, что я намерен пересмотреть этот PR, но он не очень высокий
приоритетный банкомат

Привет Али,

  1. Последний из них - gower_function-v3.ipynb, и да, он имеет дело с nan.
    распространение

  2. Вы можете использовать только gower_distance (X), если ваш категориальный атрибут не
    числовой или gower_distance (X, category_features = [False, True,
    Ложь, ...]), если атрибут вашего кота представлен числовым.

Сообщите мне наедине, если у вас возникнут проблемы, потому что эта реализация
Я подключил к Интернету не должно беспокоить scikit learn, у них есть
многое предстоит сделать, и это не лучшее место для обсуждения этого.

30 ноября 2017 г., 11:51, «Али-ры» [email protected] написал:

@marcelobeckmann https://github.com/marcelobeckmann

Привет, Марсело (или, возможно, другие), у вас есть быстрый вопрос по поводу вашего
реализация коэффициента мощности, который вы разместили здесь:
https://sourceforge.net/projects/gower-distance-4python/files/

1.

Является ли gower_single_function-v2.ipynb окончательной версией и занимается
NaN тоже?
2.

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

Спасибо большое

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/5884#issuecomment-348166596 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AA3G79jWVbpBNdAFOAim7wJS92-QGl0dks5s7pa8gaJpZM4Glm0p
.

Привет Али,

  1. Последний из них - gower_function-v3.ipynb, и это копия того, что я подтолкнул к scikit learn, и да, он касается распространения нан

  2. Вы можете использовать только gower_distance (X), если ваш категориальный атрибут не является числовым, или gower_distance (X, category_features = [False, True, False, ...]), если ваш категориальный атрибут представлен как числовой.

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

@marcelobeckmann Привет, Марсело,
Должно ли значение параметра category_features быть True или False, если у нас есть категориальные переменные, закодированные в числовой формат?

Я также получаю следующую ошибку:
ValueError: найден массив с 0 образцами (shape = (0, 0)), в то время как для check_pairwise_arrays требуется минимум 1.

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

Привет @bendiste!

Если вы представите True и False как 1 и 0, вы получите те же результаты.

Вы используете новейший ноутбук gower_function-v6.4.ipynb в
https://sourceforge.net/projects/gower-distance-4python/files/
?

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

Привет, @marcelobeckmann , спасибо за ответ. И да, я использую самую новую версию, которую вы указали. Когда я его повторно загрузил, он успешно заработал. Я хотел бы спросить пару вещей, так как я новичок в машинном обучении:
1- Могу ли я использовать KPCA для уменьшения размеров в качестве входных данных для алгоритма иерархической кластеризации?
2- Или мне нужно использовать весь набор данных с высокой размерностью в качестве входных данных для иерархической кластеризации?

Привет @marcelobeckmann!
спасибо за эту реализацию!

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

Это верно?

Спасибо!

Привет @annelaura!

Приносим извинения за задержку с ответом. Да, это правильно, этот тест был просто для проверки, не повлияют ли параметры category_features = [0, 1] на результаты, если нечисловые столбцы также могут быть идентифицированы как объекты. Входные данные совпадают, поэтому результаты должны быть такими же.

После того, как я закончил несколько статей, я вернулся к работе, чтобы наконец предложить свою реализацию в ветке scikit master! :)

@marcelobeckmann есть новости по этому поводу? :)

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

Любые обновления? @marcelobeckmann

Работа после проверки.

Был ли одобрен PR? @marcelobeckmann

Пока нет, работа продолжается после недавней проверки кода.

Жаль, что мне это нужно.

Где-то доступна только функция? Так что я могу использовать его самостоятельно (для исследовательских целей)

Спасибо

Вы можете взять последний коммит этой функции в этом PR:
https://github.com/scikit-learn/scikit-learn/pull/9555

Мне удалось заставить его работать локально. Спасибо!

Просто отметьте +1 к этому билету! Спасибо за всю работу над этим.

Удар. Это было бы отличным дополнением. Я не могу поверить, что на относительно простой расчет, чтобы воплотить его в sklearn, потребовалось 4 года !!

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

Или вы можете сказать: спасибо за самоотверженное упорство в течение четырех лет добровольных усилий!

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

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

С нетерпением жду этого в sklearn.

Кто-то, кто утверждает, что « позаимствовал идеи » из этой ветки, выпустил на github пакет для расчета расстояния Гауэра (технически сходство). Говоря о расстоянии и сходстве, пример идентичен тому, что был от @marcelobeckmann. Я пока только взглянул на код, но вот краткая информация:

Из записной книжки

    # This is to normalize the numeric values between 0 and 1.
    X_num = np.divide(X_num ,max_of_numeric,out=np.zeros_like(X_num), where=max_of_numeric!=0)

Из «Майкла Яна»:

    # This is to normalize the numeric values between 0 and 1.
    Z_num = np.divide(Z_num ,num_max,out=np.zeros_like(Z_num), where=num_max!=0)

Привет, ребята, спасибо, что следите за этим.

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

Надеюсь, этот код будет частью scikit-learn, если этот PR # 9555 будет принят.

С наилучшими пожеланиями,

Марсело Бекманн

Удачи в процессе !!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги