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

Особенности инженерного расположения с формулой Haversine для моделирования прогнозирования

. Теги с Python, линейной регрессией, машинным обучением, расчетом расстояния.

Вот полное Git Reppo: Прогнозирование цен на King Co Этот блог пост – просто фрагмент одной стратегии, которую мы использовали. Со- написано с Наташа Какороски

Таким образом, вы хотите построить модель прогнозирования из некоторых данных, но некоторые колонны кажутся немного. Отказ Отказ бесполезный? В качестве альтернативы, столбец данных может случайно вывести смысл, где там не должно быть. Давайте попробуем это Инженению Некоторые столбцы с данными о местонахождении, чтобы помочь прогнозировать цену дома, используя небольшой ломтик данных отеля King County County, установленный из штата Вашингтон. Давайте рассмотрим, как мы можем превратить сложные столбцы во что-то полезное вместо того, чтобы просто выбрасывать их или использовать их неправильно.

import pandas as pd

df = pd.read_csv('kc_house_data.csv')
df.head().T
7129300520 6414100192 5631500400 2487200875 1954400510 я бы
10/13/2014 12/9/2014 2/25/2015 12/9/2014 2/18/2015 Дата
221900 538000 180000 604000 510000 цена
3 3 2 4 3 спальни
1 2.25 1 3 2 ванные комнаты
1180 2570 770 1960 1680 sqft_living.
5650 7242 10000 5000 8080 sqft_lot.
1 2 1 1 1 полы
Нан 0 0 0 0 набережная
0 0 0 0 0 Посмотреть
3 3 3 5 3 состояние
7 7 6 7 8 оценка
1180 2170 770 1050 1680 sqft_above.
0.0 400.0 0.0 910.0 0.0 sqft_basement.
1955 1951 1933 1965 1987 yr_built.
0 1991 Нан 0 0 yr_renoved
98178 98125 98028 98136 98074 почтовый индекс
47.5112 47.721 47.7379 47.5208 47.6168 лат
-122.257 -122.319 -122.233 -122.393 -122.045 длинная
1340 1690 2720 1360 1800 sqft_living15.
5650 7639 8062 5000 7503 sqft_lot15.

Что значит каждая из этих столбцов?

from IPython.display import display, Markdown

with open('column_names.md', 'r') as fh:
    content = fh.read()

display(Markdown(content))

Имена столбцов и описания для набора данных Coins Country

  • ID – уникальный идентифицированный для дома
  • Дата Дата – Дом был продан
  • PricePrice – цель прогнозирования
  • Спальня – спальни/дома
  • bathroomsNumber – ванных комнат/спален
  • sqft_livingsquare – кадры дома
  • sqft_lotsquare – кадры много
  • Полок пола – этажи (уровни) в доме
  • Набережная – дом, который имеет вид на набережной
  • смотреть – Был просмотрен
  • Состояние – Насколько хорошо состояние (в целом)
  • класс – общая оценка, данная корпусный блок, на основе системы грейдов King County
  • sqft_above – площадь в квадратных футах дома отдельно от фундамента
  • SQFT_Basement – квадратные кадры подвала
  • yr_built – Год постройки
  • yr_renovated – Год, когда дом был отремонтирован
  • zipcode – мол
  • ш – Широта координат
  • долго – Координация долготы
  • sqft_living15 – Метраж интерьер жилья жизненного пространства для ближайших соседей 15
  • sqft_lot15 – квадратные кадры земли много ближайших соседей

Многие из этих колонн, кажется, что они должны иметь какое-то влияние на уровень цен. В частности, общая поговорка «Три самых важных веща, о которых нужно подумать при покупке, – это местоположение, местоположение, местоположение», сообщает нам, что мы, вероятно, не должны много заботиться о таких вещах, как Zipcode, широта и долгота. Кроме того, просто следует отметить, «SQFT_Living15» и «SQFT_LOT15» являются метаданными о каждом доме в базе данных, что кто-то еще уже разработан для нас. Спасибо, округ Кинг. Ученый данные!

Есть много столбцов, которые мы могли бы использовать, но для этого учебника с Haversine давайте просто сосредоточимся на широте и долготе. Давайте посмотрим на визуальные данные эти данные.

target = df['price'].copy()
needs_work = df[['long', 'lat']].copy()

import seaborn as sns
import matplotlib.pyplot as plt

for col in needs_work:
    x = needs_work[col]
    y = target

    plt.figure(figsize=(16,8))
    plt.subplot(1,2,1)
    sns.distplot(x)
    plt.subplot(1,2,2)

    sns.scatterplot(x, y)
    plt.suptitle(col)
    plt.tight_layout
    plt.savefig(col + '.png')

Несмотря на то, что эти пары графиков выглядят похожими, обратите внимание, что оси Y на этих участках измеряют разные вещи. Гистограмма просто подсчитывает, сколько замечаний X-значения у нас в данных, в то время как ScatterPlot показывает цену в долларах США, продаваемой на X-значение. Это почти как продано больше домов (высота гистограммы) коррелирует довольно сильно с более высокой ценой продажи (высота рассеяния). Закон поставок и спроса кажется живым и хорошо в округе Кинг, ва. Мы обсудим, как иметь дело с этими данными в отношении прогнозирования цен на продажу с использованием формулы Haversine 3D Distance.

Прежде чем мы попадем в детали формулы, давайте поговорим о том, почему мы должны учитывать вообще увеличить данные о местонахождении. Проблема здесь заключается в том, что только глядя на одномерное движение на карте, не особенно генерирует точные цены цен на жилье. Еще один способ сказать, что это нет линейных отношений между ценой широты против ценой, ни в цене долготы. Например, если существует множество богатых районов, которые имеют более низкие окрестности между ними, используя только то, что одно измерение данных не будет точно прогнозировать значение. На следующем изображении (бесстыдно поднятые из http://www.peteryu.ca/tutorials/matlab/image_in_3d_surface_plot_with_multiple_colormaps ) Представьте себе, что ось Z не высота, а скорее цена. Как вы можете видеть в тепловой поверхности ниже поверхности, нет четкого линейного рисунка при движении по направлению x или просто направление Y, но близость к темно-красному пятному возле задней правой части графика будет иметь четкий шаблон для прогнозирования цены. (Обратите внимание на красное пятно рядом с левом нижнем углом, должны быть синим цветом нагрева, как в этом примере, он представляет собой очень низкие цены на дому.)

При моделировании с многомассажной линейной регрессией, просто имея оба широты, так и долготы, на самом деле тоже не помогают. Вместо этого давайте подумаем о том, почему домашние ценности в некоторых кварталах являются высокими противнизмами. Это может быть просто дома в этих кварталах есть вид на горы и воду, но единственный способ, которым любой дом продается за много денег, если кто-то платит за это много денег. Я знаю, что это кажется упрощенным, но высокие домашние ценности требуют высоких доплат рабочих мест, и люди с высокой платной работой будут платить больше, чтобы его удобно закрыть свою работу (особенно если дом имеет вид на горы или воду). Это приводит мне полагать, что «радиус от высокоплачиваемой кластера работы» может быть гораздо лучшим показателем домашнего значения вместо того, чтобы использовать два столбца «долгота» и «широта» самостоятельно. Давайте построим один! На самом деле, если есть несколько кластеров занятости, возможно, создают один столбец для каждого «HUB-хаба».

Если вы готовы принять, что мы живем на круглой планете, мы можем использовать формулу Гаверина, которая измеряет 3D-длину дуги на поверхности сферы. Это действительно просто адаптация теоремы Пифагорейской.

Мы адаптируем код Python из: https://stackoverflow.com/questions/4913349/haversine-formula-in-python-bearing-and-distance-between-two-gps-points/4913653.

Мы решили пройти два аргумента, каждый из которых в форме [долгота, широта] Отказ Для этого мы сначала построим новую колонку, чтобы служить введенным входом в функцию.

needs_work.head(2)
47.5112 -122.257 0
47.7210 -122.319 1
needs_work['long_lat'] = list(zip(needs_work['long'], needs_work['lat']))
needs_work.head(2)
47.5112 -122.257 (-122.257, 47.5112) 0
47.7210 -122.319 (-122.319, 47.721000000000004) 1

Теперь мы определяем функцию Haversine. Кроме того, вы можете просто импортировать его из https://pypi.org/project/haversine/ но мы хотим убедиться, что мы можем контролировать именно то, что происходит И это весело видеть тригонометрию в действии!

from math import radians, cos, sin, asin, sqrt

def haversine(list_long_lat, other=[-122.336283, 47.609395]):
    """
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees), in this case the 2nd point is in the 
    Pike Pine Retail Core of Seattle, WA.
    """
    lon1, lat1 = list_long_lat[0], list_long_lat[1]
    lon2, lat2 = other[0], other[1]
    # convert decimal degrees to radians 
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
    # haversine formula 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    # Radius of earth in kilometers is 6371
    km = 6371 * c
    return km

Мы наконец готовы построить наш полезный выходной столбец, используя Series.apply () который дает расстояние до Сиэтла.

needs_work['dist_to_seattle'] = needs_work['long_lat'].apply(haversine)

На самом деле, это было бы очень легко построить другой столбец для другого «местонахождения кластера рабочего класса» в этой же точке, передаваем в необязательные аргументы для haversine (), делая разные series.apply (Функция,) Отказ «Пригород» Сиэтла «Белвуя» фактически вырос в своем городе с небоскребами и высокими вакансиями собственного. Давайте создадим 'dist_to_bellevue' колонка тоже.

needs_work['dist_to_bellevue'] = needs_work['long_lat'].apply(haversine, other=[-122.198985, 47.615577])

Наконец, давайте отбросьте столбцы, которые мы использовали в качестве строительных блоков для этих двух новых столбцов. ( Хотя вместо использования df.drop ([колонны],) Мы активно выбираем столбцы, чтобы сохранить.)

engineered_columns = needs_work.loc[:,['dist_to_seattle', 'dist_to_bellevue']]
engineered_columns.head(10)
0 12.434278 12.395639
1 12.477217 14.770934
2 16.247460 13.838051
3 10.731122 17.970486
4 21.850148 11.542868
5 25.361129 15.217257
6 33.331870 35.347235
7 22.284717 24.515385
8 10.796605 15.463271
9 35.274167 30.244215

Теперь вы можете добавить их обратно в свой оригинальный Dataframe и начните улучшать свою модель с этими новыми функциональными столбами.

Оригинал: “https://dev.to/upwardtrajectory/engineering-location-features-with-haversine-s-formula-for-prediction-modeling-23n2”