Содержание
python — Сортировка строк в столбце и график печати
Вы можете сначала добавить новый столбец sort
в функцию f
, затем отсортировать значения по столбцу паре веб-сайтов
и последним drop_duplicates
по столбцам used_at
3 и 90 sort
:
импортировать панды как pd импортировать itertools df = pd.read_csv("avito_trend.csv", parse_dates=[2]) защита f(df): дфс = [] я = 0 для x в [list(x) для x в itertools.combinations(df['address'].unique(), 2)]: я += 1 c1 = df.loc[df['адрес'].isin([x[0]]), 'ID'] c2 = df.loc[df['адрес'].isin([x[1]]), 'ID'] c = pd.Series(список(набор(c1).пересечение(набор(c2)))) # добавить перевернутое пересечение c2 и c1 c_invert = pd.Series (список (набор (c2). пересечение (набор (c1)))) dfs.append(pd.DataFrame({'обычные пользователи':len(c), 'пара веб-сайтов':' и '.join(x), 'sort': i}, index=[0])) # поменять местами значения в x х[1],х[0] = х[0],х[1] dfs. append(pd.DataFrame({'обычные пользователи':len(c_invert), 'пара веб-сайтов':' и '.join(x), 'sort': i}, index=[0])) вернуть pd.concat(dfs) common_users = df.groupby([df['используется_в'].dt.year]).apply(f).reset_index(drop=True, level=1).reset_index()
common_users = common_users.sort_values('пара веб-сайтов') common_users = common_users.drop_duplicates (подмножество = ['используется_в', 'сортировка']) #распечатать общие_пользователи graph_by_common_users = common_users.pivot(index='пара веб-сайтов', columns='used_at', values='обычные пользователи') #print graph_by_common_users #изменить порядок столбцов graph_by_common_users = graph_by_common_users[[2015, 2014]] graph_by_common_users = graph_by_common_users.sort_values (2014, по возрастанию = False) ax = graph_by_common_users.plot(kind='barh', width=0.5, figsize=(10,20)) [label.set_rotation(25) для метки в ax.get_xticklabels()] прямоугольники = ax.patches labels = [int(round(graph_by_common_users.loc[i, y])) для y в graph_by_common_users. columns.tolist() для i в graph_by_common_users.index] для прямоугольника, метки в zip (прямоугольники, метки): высота = rect.get_height() ax.text (rect.get_width() + 20, rect.get_y() - 0,25 + rect.get_height(), метка, размер шрифта = 8) #сортировка значений легенды ручки, метки = ax.get_legend_handles_labels() # сортируем и метки, и дескрипторы по меткам метки, ручки = zip (* sorted (zip (метки, ручки), ключ = лямбда t: t [0])) ax.legend (ручки, метки)
Мой график:
РЕДАКТИРОВАТЬ:
Комментарий:
Зачем вы создали c_invert и x1,x[0] = x[0],x1
Поскольку комбинации для годов 2014
и 2015
были разными — значения 4
отсутствовали в первом столбце и 4
во втором столбце:
used_at 2015 2014 пара веб-сайтов avito.ru и drom.ru 1491,0 1716,0 avito.ru и auto.ru 1473,0 1602,0 avito.ru и e1.ru 1153,0 1364,0 drom.ru и auto.ru NaN 874.0 e1.ru и drom. ru 539,0 634,0 avito.ru и irr.ru/cars 403,0 602,0 avito.ru и am.ru 262,0 579,0 e1.ru и auto.ru 451,0 475,0 avito.ru и cars.mail.ru/sale 256,0 424,0 drom.ru и irr.ru/cars 277,0 423,0 auto.ru и irr.ru/cars 288,0 409.0 auto.ru и am.ru 224,0 408,0 дром.ру и ам.ру 187,0 394,0 auto.ru и cars.mail.ru/sale 195,0 330,0 avito.ru и автомаркет.ру 205,0 299,0 drom.ru и cars.mail.ru/sale 189,0 292,0 дром.ру и автомаркет.ру 175,0 247,0 auto.ru и автомаркет.ру 162,0 243,0 e1.ru и irr.ru/cars 148,0 235,0 e1.ru и am.ru 99,0 224,0 am.ru и irr.ru/cars NaN 223.0 irr.ru/cars и cars.mail.ru/sale 94,0 197,0 am.ru и cars.mail.ru/sale NaN 166,0 e1.ru и cars.mail.ru/sale 105,0 154,0 e1.ru и автомаркет.ру 105,0 139,0 avtomarket.ru и irr.ru/cars NaN 139,0 avtomarket.ru и am.ru 72,0 133,0 avtomarket.ru и cars.mail.ru/sale 48,0 105,0 auto.ru и drom.ru 799,0 NaN cars.mail.ru/sale и am.ru 73,0 NaN irr.ru/cars и am.ru 102.0 NaN irr.ru/cars и avtomarket.ru 73,0 NaN
Затем я создаю все инвертированные комбинации — проблема была решена. Но почему есть NaN
? Почему комбинации 2014
и 2015
разные?
Я добавляю к функции f
:
def f(df): распечатать df['адрес'].unique() дфс = [] я = 0 для x в [list(x) для x в itertools.combinations((df['address'].unique()), 2)]: ... ...
и вывод был (почему первая печать дважды описана в предупреждении
здесь):
['avito.ru' 'e1.ru' 'drom.ru' 'auto.ru' 'avtomarket.ru' 'am.ru' «irr.ru/cars» «cars.mail.ru/sale»] ['avito.ru' 'e1.ru' 'drom.ru' 'auto.ru' 'avtomarket.ru' 'am.ru' «irr.ru/cars» «cars.mail.ru/sale»] ['avito.ru' 'e1.ru' 'auto.ru' 'drom.ru' 'irr.ru/cars' 'avtomarket.ru' 'cars.mail.ru/sale' 'am.ru']
Таким образом, списки разные, а затем и комбинации тоже разные -> я получаю некоторые значения NaN
.
Решение — сортировка списка комбинаций.
по умолч. f(df): #print (отсортировано(df['адрес'].unique())) дфс = [] для x в [list(x) для x в itertools. combinations(sorted(df['address'].unique()), 2)]: c1 = df.loc[df['адрес'].isin([x[0]]), 'ID'] ... ...
Весь код:
импортировать панды как pd импортировать itertools df = pd.read_csv("avito_trend.csv", parse_dates=[2]) защита f(df): #print (отсортировано(df['адрес'].unique())) дфс = [] для x в [list(x) для x в itertools.combinations(sorted(df['address'].unique()), 2)]: c1 = df.loc[df['адрес'].isin([x[0]]), 'ID'] c2 = df.loc[df['адрес'].isin([x[1]]), 'ID'] c = pd.Series(список(набор(c1).пересечение(набор(c2)))) dfs.append(pd.DataFrame({'обычные пользователи':len(c), 'пара веб-сайтов':' и '.join(x)}, index=[0])) вернуть pd.concat(dfs) common_users = df.groupby([df['используется_в'].dt.year]).apply(f).reset_index(drop=True, level=1).reset_index() #распечатать общие_пользователи graph_by_common_users = common_users.pivot(index='пара веб-сайтов', columns='used_at', values='обычные пользователи') #изменить порядок столбцов graph_by_common_users = graph_by_common_users[[2015, 2014]] graph_by_common_users = graph_by_common_users. sort_values (2014, по возрастанию = False) #print graph_by_common_users
топор = graph_by_common_users.plot(kind='barh', width=0.5, figsize=(10,20)) [label.set_rotation(25) для метки в ax.get_xticklabels()] прямоугольники = ax.patches labels = [int(round(graph_by_common_users.loc[i, y])) \ для y в graph_by_common_users.columns.tolist() \ для i в graph_by_common_users.index] для прямоугольника, метки в zip (прямоугольники, метки): высота = rect.get_height() ax.text(rect.get_width()+20, rect.get_y() - 0,25 + rect.get_height(), метка, размер шрифта=8) ручки, метки = ax.get_legend_handles_labels() # сортируем и метки, и дескрипторы по меткам метки, ручки = zip (* sorted (zip (метки, ручки), ключ = лямбда t: t [0])) ax.legend (ручки, метки)
И график:
XGBoost: Краткий технический обзор
«Наша единственная модель XGBoost может попасть в тройку лучших! Наша окончательная модель просто усреднила модели XGBoost с разными случайными начальными значениями».
— Дмитрий Цыбулевский и Станислав Семенов, победители конкурса Avito по обнаружению дубликатов рекламы Kaggle.
Поскольку целые блоги посвящены тому, как единственное приложение XGBoost может повысить рейтинг на соревнованиях Kaggle, пришло время углубиться в концепции XGBoost.
Алгоритмы бэггинга контролируют высокую дисперсию модели. Однако алгоритмы повышения считаются более эффективными, поскольку они имеют дело как со смещением, так и с дисперсией (компромисс между смещением и дисперсией).
XGBoost — это реализация Gradient Boosting Machines (GBM), которая используется для контролируемого обучения. XGBoost — это библиотека машинного обучения с открытым исходным кодом, доступная на Python, R, Julia, Java, C++, Scala. Отличительные особенности:
- Скорость
- Осведомленность о разреженных данных
- Внедрение на одиночных, распределенных системах и внесистемных вычислениях
- Распараллеливание
Рабочий
Чтобы понять XGBoost, мы должны сначала понять Gradient Descent и Gradient Boosting.
a) Градиентный спуск:
Функция стоимости измеряет, насколько близки прогнозируемые значения к соответствующим фактическим значениям. В идеале мы хотим, чтобы разница между прогнозируемыми значениями и фактическими значениями была как можно меньше. Таким образом, мы хотим, чтобы функция стоимости была минимизирована.
Веса, связанные с обученной моделью, заставляют ее прогнозировать значения, близкие к фактическим значениям. Таким образом, чем лучше веса, связанные с моделью, тем точнее прогнозируемые значения и тем ниже функция стоимости. Чем больше записей в обучающем наборе, тем веса изучаются, а затем обновляются.
Градиентный спуск — это итеративный алгоритм оптимизации. Это метод минимизации функции, имеющей несколько переменных. Таким образом, градиентный спуск можно использовать для минимизации функции стоимости. Сначала он запускает модель с начальными весами, а затем пытается минимизировать функцию стоимости, обновляя веса в течение нескольких итераций.
b) Повышение градиента:
Повышение: создается ансамбль слабых учеников, где неправильно классифицированным записям присваивается больший вес («усиливается»), чтобы правильно предсказать их в более поздних моделях. Эти слабые ученики позже объединяются в одного сильного ученика. Существует множество алгоритмов повышения, таких как AdaBoost, Gradient Boosting и XGBoost. Последние две являются древовидными моделями. На рисунке 1 изображена модель ансамбля деревьев.
Рис. 1. Модель древовидного ансамбля для предсказания того, любит данный пользователь компьютерные игры или нет. +2, +0,1, -1, +0,9, -0,9 — баллы предсказания в каждом листе. Окончательный прогноз для данного пользователя представляет собой сумму прогнозов каждого дерева. Источник
Gradient Boosting использует принцип Gradient Descent and Boosting для контролируемого обучения. Модели с градиентным усилением (GBM) — это деревья, построенные последовательно, сериями. В GBM мы берем взвешенную сумму нескольких моделей.
- Каждая новая модель использует оптимизацию Gradient Descent для обновления/корректировки весов, которые должны быть изучены моделью для достижения локальных минимумов функции стоимости.
- Вектор весов, назначенных каждой модели, не выводится из ошибочных классификаций предыдущей модели и результирующих повышенных весов, присвоенных неправильным классификациям, а выводится из весов, оптимизированных градиентным спуском для минимизации функции стоимости. Результатом Gradient Descent является та же функция модели, что и в начале, только с лучшими параметрами.
- Gradient Boosting добавляет новую функцию к существующей функции на каждом этапе для прогнозирования выходных данных. Результатом Gradient Boosting является совершенно другая функция с самого начала, потому что результатом является добавление нескольких функций.
c) XGBoost:
XGBoost был создан, чтобы расширить пределы вычислительных ресурсов для бустинг-деревьев. XGBoost — это реализация GBM со значительными улучшениями. GBM строит деревья последовательно, а XGBoost — параллельно. Это делает XGBoost быстрее.
Особенности XGBoost:
XGBoost масштабируется как в распределенных, так и в ограниченных памятью условиях. Эта масштабируемость обусловлена несколькими алгоритмическими оптимизациями.
1. Алгоритмы поиска разбиений: приблизительный алгоритм:
Чтобы найти наилучшее разбиение непрерывного объекта, данные должны быть отсортированы и полностью помещены в память. Это может быть проблемой в случае больших наборов данных.
Для этого используется приближенный алгоритм. Возможные точки разделения предлагаются на основе процентилей распределения признаков. Непрерывные функции объединяются в сегменты, которые разделяются на основе возможных точек разделения. Наилучшее решение для возможных точек разделения выбирается из агрегированной статистики по корзинам.
2. Блок столбцов для параллельного обучения:
Сортировка данных — самый трудоемкий аспект обучения дерева. Чтобы снизить затраты на сортировку, данные хранятся в единицах памяти, называемых «блоками». В каждом блоке есть столбцы данных, отсортированные по соответствующему значению функции. Это вычисление необходимо выполнить только один раз перед обучением, и его можно использовать повторно позже.
Сортировка блоков может выполняться независимо и может быть разделена между параллельными потоками ЦП. Раздельный поиск можно распараллелить, поскольку сбор статистики для каждого столбца выполняется параллельно.
3. Эскиз взвешенных квантилей для приблизительного изучения дерева:
Чтобы предложить возможные точки разделения среди взвешенных наборов данных, используется алгоритм эскиза взвешенных квантилей. Он выполняет операции слияния и обрезки сводок квантилей по данным.
4. Алгоритм с учетом разреженности:
Ввод может быть разреженным по таким причинам, как однократное кодирование, пропущенные значения и нулевые записи. XGBoost знает о шаблоне разреженности в данных и посещает только направление по умолчанию (непропущенные записи) в каждом узле. 916 примеров на блок.
6. Внешние вычисления:
Для данных, которые не помещаются в основную память, разделите данные на несколько блоков и сохраните каждый блок на диске. Сжимайте каждый блок по столбцам и распаковывайте на лету независимым потоком во время чтения с диска.
7. Цель регулярного обучения:
Чтобы измерить производительность модели с заданным набором параметров, нам нужно определить целевую функцию. Целевая функция всегда должна состоять из двух частей: потерь при обучении и регуляризации. Срок регуляризации снижает сложность модели.
где Ω — член регуляризации, который большинство алгоритмов забывают включить в целевую функцию. Однако XGBoost включает регуляризацию, таким образом контролируя сложность модели и предотвращая переоснащение.
Вышеупомянутые 6 функций могут присутствовать в некоторых алгоритмах по отдельности, но XGBoost объединяет эти методы для создания сквозной системы, обеспечивающей масштабируемость и эффективное использование ресурсов.
Коды Python и R для реализации:
Эти ссылки являются хорошим началом для реализации XGBoost с использованием Python и R. Он предсказывает, будет ли диабет возникать или нет у пациентов индейского происхождения пима. Этот код вдохновлен учебниками Джейсона Браунли.
Заключение
Вы можете обратиться к этому документу, написанному разработчиками XGBoost, чтобы узнать о его подробной работе. Вы также можете найти проект на Github и просмотреть туториалы и примеры использования. 9Однако 0015
XGBoost не следует использовать в качестве панацеи. Наилучшие результаты могут быть получены в сочетании с отличным исследованием данных и проектированием функций.
Связанный:
- XGBoost, лучший метод машинного обучения на Kaggle, объяснение
- XGBoost, реализация алгоритма Winningest Kaggle в Spark и Flink
- Простое руководство по XGBoost с использованием набора данных Iris
Получите БЕСПЛАТНУЮ электронную книгу The Great Big Natural Language Processing Primer и ведущий информационный бюллетень по искусственному интеллекту, науке о данных и машинному обучению прямо на вашу почту.