Авито в сортавала: Авито Для дома и дачи в Сортавале на юла, avito, olx, из рук в руки

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. Отличительные особенности:

  1. Скорость
  2. Осведомленность о разреженных данных
  3. Внедрение на одиночных, распределенных системах и внесистемных вычислениях
  4. Распараллеливание

 

Рабочий

 
Чтобы понять 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. Цель регулярного обучения:

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

Obj(Θ)=L(θ)+ Ω(Θ)

где Ω — член регуляризации, который большинство алгоритмов забывают включить в целевую функцию. Однако 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 и ведущий информационный бюллетень по искусственному интеллекту, науке о данных и машинному обучению прямо на вашу почту.