В предыдущей статье на примере покупки Mercedes-Benz E-klasse не старше 2010 года выпуска стоимостью до 1.5 млн рублей в Москве была рассмотрена задача поиска выгодных автомобилей. Под выгодными следует понимать предложения, цена которых ниже рыночной в текущий момент среди объявлений, собранных со всех наиболее авторитетных сайтов по продаже б/у автомобилей в РФ.

На первом этапе в качестве метода машинного обучения была выбрана множественная линейная регрессия, были рассмотрены правомерность ее использования, а также плюсы и минусы. Простая линейная регрессия была выбрана в качестве ознакомительного алгоритма. Очевидно, что существует еще много методов машинного обучения для решения поставленной задачи регрессии. В этой статье я хотел бы рассказать вам, как именно я выбирал наиболее оптимальный алгоритм машинного обучения для исследуемой модели, который в настоящее время используется в реализованном мною сервисе — robasta.ru.



Выбор алгоритма


Претенденты на звание “чемпиона”:


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

Помимо Mercedes-Benz E-klasse мне импонировала Audi A5, особенно с дизельным двигателем мощностью 239 л.с., обладающая хорошей динамикой (6 сек. до 100 км/ч) и приемлемым налогом. Взглянув на зависимость цены от мощности двигателя этого творения немецких инженеров (визуализация ниже), многие вопросы отпадают сами собой.

О линейной зависимости тут не может идти и речи, поэтому алгоритмы, в основе которых лежит линейная зависимость объясняемой переменной (стоимости, в нашем случае) от регрессоров, можно смело отбросить. Использование полиномиальных и нелинейных моделей неправомерно по той причине, что заранее неизвестен вид зависимости того или иного регрессора от цены для каждой отдельной взятой модели автомобиля.

Таким образом, приняв вышеизложенные рассуждения во внимание, нам остается рассмотреть только алгоритмы, в основе которых лежат деревья принятия решенийRandom forest и Xgboost (с двумя видами бустинга — xgbDart, xgbTree), и выбрать из них оптимальный.

Следует оговориться, что оптимальный алгоритм — это тот, который покажет себя наилучшим образом (min RMSE) при перекрестной проверке (cross-validation) и отложенной выборке.
Прежде чем переходить к “слепому” применению выбранных алгоритмов, в следующей главе я хотел бы более подробно осветить вопрос их настройки.

Cross-validation


Для оценки реальных возможностей модели и настройки ее параметров в задачах машинного обучения зачастую используют перекрестную проверку (Cross-validation, СV). Выделяется некоторое множество разбиений исходной выборки на обучающую и контрольную подвыборки. Для каждого из разбиений алгоритм настраивается по обучающей подвыборке, затем на контрольной оценивается его средняя ошибка.

Оценкой перекрестной проверки называется средняя по всем разбиениям величина ошибки на контрольных подвыборках.

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

Разновидности перекрестной проверки:

  1. k-блочная кросс-валидация (k-fold cross-validation).

    Подробнее
    Этот метод случайным образом разбивает данные на k непересекающихся блоков примерно одинакового размера. Поочередно каждый блок рассматривается как валидационная выборка, а остальные k-1 блоков — как обучающая выборка. Модель обучается на k-1 блоках и прогнозирует валидационный блок. Прогноз модели оценивается с помощью выбранного показателя: правильность (accuracy), среднеквадратическое отклонение (СКО, RMSE) и т.п. Процесс повторяется k раз, и мы получаем k оценок, для которых рассчитывается среднее значение, являющееся итоговой оценкой модели. Обычно k выбирают равным 10, иногда 5. Если k равен количеству элементов в исходном наборе данных, этот метод называется кросс-валидацией по отдельным элементам (в этой статье не рассматривается).

  2. Многократная k-блочная кросс-валидация (repeated k-fold cross-validation).

    Подробнее
    В рамках этого метода k-блочная кросс-валидация выполняется несколько раз. Например, 5-кратная 10-блочная кросс-валидация даст 50 оценок, на основе которых затем будет рассчитана средняя оценка. Обратите внимание, это не то же самое, что 50-блочная кросс-валидация.

  3. Кросс-валидация на основе метода Монте-Карло (МККВ, Monte Carlo cross-validation, leave-group-out cross-validation).

    Подробнее
    Данный метод заданное количество раз случайным образом разбивает исходный набор данных на обучающую и валидационную выборку в заданной пропорции.

Каждый из описанных выше методов кросс-валидации, можно охарактеризовать с помощью смещения (bias) и дисперсии (variance). Смещение характеризует правильность (accuracy) оценки. Дисперсия характеризует точность (precision) оценки.

В общем случае смещение метода кросс-валидации зависит от размера валидационной выборки. Если размер валидационной выборки составляет 50% исходных данных (2-блочная кросс-валидация), итоговая оценка СКО будет более смещенной, чем в случае, когда этот размер составляет 10% исходных данных. С другой стороны, меньший размер валидационной выборки увеличивает дисперсию, поскольку каждая валидационная выборка содержит меньше данных для получения стабильного значения СКО.

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

Что же касается МККВ, то для этого вида перекрестной проверки размер валидационной выборки имеет немного большее влияние на дисперсию, чем количество повторений процесса. Следует также отметить, что количество повторений процесса не оказывает существенного влияния на смещение.

Таким образом, для метода МККВ можно порекомендовать использовать валидационную выборку малого размера (например, 10%) и выполнять большое количество повторений, чтобы уменьшить дисперсию.

Однако, при прочих равных, использование многократной 10-блочной КВ обеспечивает меньшую дисперсию, что в первую очередь обусловлено тем, что для этого метода, один и тот же элемент данных не может встречаться в разных выборках, в отличие от МККВ.

В завершении наших рассуждений, хотелось бы сделать оговорку, что при больших объемах данных 10-блочная или даже 5-блочная однократная КВ дает вполне приемлемые результаты, в нашей же задаче, для настройки модели мы будем использовать многократную 10-блочную перекрестную проверку.

Random forest


«Случайный Лес» — алгоритм, который для полученных данных случайным образом создает множество деревьев принятия решений и потом усредняет результаты их предсказаний. Алгоритм построения дерева очень быстр, поэтому не составляет большого труда сделать столько деревьев, сколько будет нужно.

С практической точки зрения у описанного выше метода есть одно огромное преимущество: он почти не требует конфигурации. Если мы возьмем любой другой алгоритм машинного обучения, будь то регрессия или нейронная сеть, они все имеют множество параметров, и их надо уметь подбирать под конкретную задачу. RF, по-сути, имеет лишь один важный параметр требующий настройки — mtry (размер случайного подмножества, выбираемого на каждом шаге построения дерева). Однако, даже используя значение по-умолчанию, можно получить весьма приемлемые результаты.

Как и в предыдущей статье, заменим отсутствующие значения (N/A) на медианные для всех регрессоров, исключим из выборки объем двигателя (ввиду сильной корреляции параметра с мощностью) и посмотрим на возможности этого алгоритма.

dat <- read.csv("dataset.txt") # загружаем выборку в R

dat$mileage[is.na(dat$mileage)] <- median(na.omit(dat$mileage)) # заменяем NA на примере  пробега

dat <- dat[-c(1,11)] # исключаем номер строки и объем двигателя из выборки 

set.seed(1)  # инициализируем генератор случайных чисел (для воспроизводимости)

split <- runif(dim(dat)[1]) > 0.2 # разделяем нашу выборку

train <- dat[split,] # выборка для обучения и настройки (cross-validation) параметров

test <- dat[!split,] # отложенная (hold-out) выборка

Для перекрестной проверки будем использовать пакет caret, который имеет больше возможностей для оценки качества модели, чем rfcv.

library(caret) # подключаем библиотеку caret

fit.control <- trainControl(method = "repeatedcv", number = 10, repeats = 10) 

train.rf.model <- train(price~., data=train, method="rf", trControl=fit.control , metric = "RMSE") # применим 10-ти кратную 10-ти блочную кросс-валидацию для настройки модели

train.rf.model # посмотрим на результаты кросс-валидации

Подробнее
Random Forest

292 samples
15 predictor

No pre-processing
Resampling: Cross-Validated (10 fold, repeated 10 times)
Summary of sample sizes: 262, 262, 262, 263, 263, 263,…
Resampling results across tuning parameters:

mtry RMSE Rsquared
2 134565.8 0.4318963
8 117451.8 0.4378768
15 122897.6 0.3956822

RMSE was used to select the optimal model using the smallest value.
The final value used for the model was mtry = 8.

library(“randomForest”) # подключаем библиотеку random forest

train.rf.model <- randomForest(price ~ ., train,mtry=8) # построим модель на основе полученных с помощью кросс-валидации параметров

Построим график, наглядно иллюстрирующий важность каждого из предикторов модели.

varImpPlot(train.rf.model) # оценим важность предикторов



rf.model.predictions <- predict(train.rf.model, test) # проверим точность оценки на отложенной выборке

print(sqrt(sum((as.vector(rf.model.predictions - test$price))^2)/length(rf.model.predictions))) # средняя ошибка прогноза цены (в рублях)
[1] 121760.5

Полученная средняя ошибка оценки стоимости автомобиля эквивалентна этой же величине полученной для линейной регрессии. Напомню, что при построении линейной модели, в отличие от RF, мы избавлялись от выбросов, что приводило к дополнительным неточностям в оценках стоимости автомобилей. Таким образом, можно утверждать о робастности “случайного леса” к выбросам.

XGboost


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

“Бустить” можно практически любые модели — общие линейные, обобщенные линейные, деревья решений, K-ближайших соседей и многие другие.

К особенностям реализации алгоритма бустинга в xgboost можно отнести, во-первых, использование помимо первой еще и второй производной от функции потерь, что повышает эффективность алгоритма. Во-вторых, наличие встроенной регуляризации, что помогает бороться с переобучением. И наконец, возможность задавать пользовательские функции потерь и метрики качества.

Благодаря экспериментальному параметру num_parallel_tree можно задать количество одновременно создаваемых деревьев и представить Random Forest, как частный случай бустинговой модели с одной итерацией. А если использовать больше одной итерации, то получится бустинг “случайных лесов”, когда каждый “случайный лес” выступает в качестве элементарной модели.

В рамках статьи рассмотрим только один вид бустинга — xgbTree, т.к. xgbDart даёт схожие результаты.

fit.control <- trainControl(method = "repeatedcv", number = 10, repeats = 10) 

train.xgb.model <- train(price ~., data = train, method = "xgbTree", trControl = fit.control, metric = "RMSE") # применим 10-ти кратную 10-ти блочную кросс-валидацию

train.xgb.model # посмотрим на результаты кросс-валидации

Подробнее
eXtreme Gradient Boosting

292 samples
15 predictor

No pre-processing
Resampling: Cross-Validated (10 fold, repeated 10 times)
Summary of sample sizes: 263, 262, 262, 263, 264, 263,…
Resampling results across tuning parameters:

eta max_depth colsample_bytree nrounds RMSE Rsquared
0.3 1 0.6 50 114131.1 0.4705512
0.3 1 0.6 100 113639.6 0.4745488
0.3 1 0.6 150 113821.3 0.4734121
0.3 1 0.8 50 114234.6 0.4694687
0.3 1 0.8 100 113960.5 0.4712563
0.3 1 0.8 150 114337.1 0.4685121
0.3 2 0.6 50 115364.6 0.4604643
0.3 2 0.6 100 117576.4 0.4472452
0.3 2 0.6 150 119443.6 0.4358365
0.3 2 0.8 50 116560.3 0.4494750
0.3 2 0.8 100 119054.2 0.4350078
0.3 2 0.8 150 121035.4 0.4222440
0.3 3 0.6 50 117883.2 0.4422659
0.3 3 0.6 100 121916.7 0.4162103
0.3 3 0.6 150 125206.7 0.3968248
0.3 3 0.8 50 119331.3 0.4296062
0.3 3 0.8 100 124385.7 0.3987044
0.3 3 0.8 150 128396.6 0.3753334
0.4 1 0.6 50 113771.6 0.4727520
0.4 1 0.6 100 113951.6 0.4717968
0.4 1 0.6 150 114135.0 0.4710503
0.4 1 0.8 50 114055.0 0.4700165
0.4 1 0.8 100 114345.5 0.4680938
0.4 1 0.8 150 114715.8 0.4655844
0.4 2 0.6 50 116982.1 0.4499777
0.4 2 0.6 100 119511.9 0.4347406
0.4 2 0.6 150 122337.9 0.4163611
0.4 2 0.8 50 118384.6 0.4379478
0.4 2 0.8 100 121302.6 0.4201654
0.4 2 0.8 150 124283.7 0.4015380
0.4 3 0.6 50 118843.2 0.4356722
0.4 3 0.6 100 124315.3 0.4017282
0.4 3 0.6 150 128263.0 0.3796033
0.4 3 0.8 50 122043.1 0.4135415
0.4 3 0.8 100 128164.0 0.3782641
0.4 3 0.8 150 132538.2 0.3567702

Tuning parameter 'gamma' was held constant at a value of 0
Tuning parameter 'min_child_weight' was held constant at a value of 1
RMSE was used to select the optimal model using the smallest value.
The final values used for the model were nrounds = 100, max_depth = 1, eta = 0.3, gamma = 0, colsample_bytree = 0.6 and min_child_weight = 1.

library(“xgboost”) # подключаем библиотеку xgboost

xgb_train <- xgb.DMatrix(as.matrix(train[-c(1)] ), label=train$price) # тренировочная выборка 

xgb_test <- xgb.DMatrix(as.matrix(test[-c(1)]), label=test$price) # тестовая выборка

xgb.param <- list(booster = "gbtree", 
              max.depth = 1, 
              eta = 0.3, 
              gamma = 0,
              subsample = 0.5, 
              colsample_bytree = 0.6, 
              min_child_weight = 1, 
              eval_metric = "rmse")

train.xgb.model <- xgb.train(data = xgb_train, nrounds = 100, params = xgb.param) # построим модель на основе полученных с помощью кросс-валидации параметров

Построим график, демонстрирующий важность каждого из предикторов модели.

importance.frame <- xgb.importance(colnames(train[-c(1)]),  model = train.xgb.model) # оценим важность предикторов

library("Ckmeans.1d.dp") # подключим библиотеку для xgb.plot

xgb.plot.importance(importance.frame)



xgb.model.predictions <- predict(train.xgb.model, xgb_test) # проверим точность оценки на отложенной выборке

print(sqrt(sum((as.vector(xgb.model.predictions - test$price))^2)/length(xgb.model.predictions))) # средняя ошибка прогноза цены (в рублях)
[1] 118742.8

XGboost для данного конкретного случая показал немного более точные оценки стоимости автомобилей. Вызывает опасение большое число гиперпараметров, которые требуют перенастройки в зависимости от выбранной марки и модели авто. В связи с этим, для использования на сервисе robasta.ru предпочтение было отдано алгоритму Random Forest.

Апробация выбранного алгоритма


Теперь, когда с выбором “чемпиона” покончено, самое время посмотреть на него в деле.

library(“randomForest”) # подключаем библиотеку random forest

rf.model <- randomForest(price ~ ., dat,mtry=8) # построим модель на основе полученных с помощью кросс-валидации параметров

predicted.price <- predict(rf.model, dat) # предскажем цену для каждого автомобиля

real.price <- dat$price # вектор цен на автомобили полученный из объявлений

profit <- predicted.price - real.price # выгода между предсказанной нами ценой и ценой из объявлений

Как и для линейной регрессии в прошлой статье, построим график зависимости выгоды от цены.

plot(real.price,profit) 
abline(0,0)



А теперь посчитаем выгоду в процентном соотношении.

sorted <- sort(predicted.price /real.price, decreasing = TRUE) 
sorted[1:10]

   69        42      122       15      168      248     346       109      231     244
1.412597 1.363876 1.354881 1.256323 1.185104 1.182895 1.168575 1.158208 1.157928 1.154557

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

Для сравнения результатов в этой статье мы использовали выборку из прошлой публикации, поэтому давайте посмотрим много ли выгодных предложений Mercedes-Benz E-klasse не старше 2010 года выпуска, стоимостью до 1.5 млн рублей в Москве на рынке сейчас.



Резюмируя все сказанное выше, могу с уверенностью заявить, что для подбора б/у автомобилей мы получили мощный инструмент, не чувствительный к “фейковым” объявлениям, работающий в режиме реального времени. Вам больше не нужно просиживать часами на нескольких сайтах с объявлениями по продаже машин и ездить смотреть потенциально невыгодные предложения.

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

Продажа автомобиля


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

Для решения этой задачи, на основе все того же “случайного леса”, был разработан сервис для оценки авто. Вы заполняете все поля формы поиска, в соответствии с параметрами вашего автомобиля, после чего модель обучается на основе рыночных предложений в текущий момент. В случае если нашлось пять и более объявлений на рынке, алгоритм для заполненных вами данных предсказывает цену и выдает несколько интересных особенностях в зависимости от общей картины рынка. Стоит подчеркнуть, что для достижения наибольшей точности, для анализа выбираются только автомобили того же поколения, что и ваш. Результаты оценки вашего автомобиля формируются в виде pdf-отчета, стоимость которого составляет 99 ?.



Напоследок


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

Относительно новые автомобили (пробег до 100 тыс. км) часто продают перед крупными дорогими ТО, эти данные полезно учитывать в модели. Поэтому сейчас я нахожусь в поиске надежных партнеров среди средних и крупных автодилеров.

Открытие оффлайн-центра по подбору и оценке автомобилей в Москве, который, благодаря реализованному алгоритму, будет гораздо менее затратным чем у конкурентов.

Создание удобного API для предоставления функционала “интеллектуальным перекупщикам”.

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

Ссылки


  • dat (выборка MB E-klasse)
  • dat_a5 (выборка Audi A5)
Поделиться с друзьями
-->

Комментарии (48)


  1. Pashkevich
    17.10.2016 06:38
    +17

    Я помню, меня НЛО наказывало за ссылку в статье, а тут еще и ссылка на платные услуги.


  1. occam
    17.10.2016 07:26
    +1

    Вам бы спецкурсы по эконометрике в МГУ читать, платят, конечно, немного, но может быть команду пополните :-)


    1. nikitos18
      17.10.2016 09:59

      Спасибо, я подумаю над Вашим предложением.


  1. AllexIn
    17.10.2016 08:10
    +12

    Если уж рекламой занимаетесь — могли бы дать промо-коды, для тестирования вашего сервиса хабро-пользователями.
    Да, 99 рублей — ерунда. Но платить ради теста — смысла нет. А пользоваться… Уверен что считает не правильно. :) Как минимум потому что не учитывает ряд важных характеристик.


  1. xtelekom
    17.10.2016 08:35
    +15

    приезжаешь машину смотреть, а там перевертыш с убитым двигателем


    1. nikitos18
      17.10.2016 10:01
      +1

      Хуже когда приехал смотреть перевертыш с убитым двигателем еще и по крайне высокой цене.


      1. Libert
        17.10.2016 10:15
        +4

        После таких вот статей, доверия недорогим вариантам «100% не битых, не крашеных, с одним владельцем и всеми документами» совсем нет


        1. nikitos18
          17.10.2016 10:52
          +1

          Надо искать, а вслепую это слишком долго, поэтому как раз и нужны оценки предложений относительно рынка.


        1. DmitryMry
          19.10.2016 23:13

          Это просто жесть. Спасибо за ссылку. Интересно, есть ли в Новосибирске такие грамотные специалисты, способные помочь с осмотром и покупкой б/у авто?


    1. dmitry_ch
      17.10.2016 18:49
      +2

      > приезжаешь машину смотреть, а там перевертыш с убитым двигателем

      Вот-вот! А на справедливые "@#$!" в сторону хозяина за потраченное время и нервы хозяин честно смотрит в глаза и говорит «я цену поставит, как мне сервис с Хабра посоветовал!»

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

      Скажем, девушка продает машинку, на которой отъездила пару лет, и про которую что знает — говорит как есть. Но когда машину смотрил грамотный кузовщик, он видит, что она попала под дерево, и ее очень геморно восстанавливали (но восстановили хорошо). Девушка не врет, это видно (ну или примем для примера как постулат), но продавала бы она машину не как мятую/битую, а как нормальную, проехавшую сколько-то км и за которой хорошо смотрели (она и правда смотрела за ней).

      Ну а продаванов, которые даже не извиняются, когда им на их же вранье (даже не заблуждение, а именно вранье указываешь), да еще и тебя пытаются обвинить в некомпетентности — такого никакой сервис не учтет и не отфильтрует.

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


      1. MathBio
        17.10.2016 22:56
        +1

        Ваш комментарий и многие подобные в целом справедливы. Да, проблему недобросовестных продавцов сервис не решает. Но автор и не ставил себе целью решить эту проблему. По большому счёту сервис решает две следующие задачи:

        1) Агрегация. Сбор по запросу пользователя объявлений с основных интернет площадок по продаже авто.
        2) «Умная» выдача. Сервис анализирует срез рынка по запросу пользователя и по описанному автору алгоритму представляет данные в порядке сортировки по «выгодности».

        Уже по первой причине использовать сервис точно удобнее, чем искать ручками по трем сайтам. Если же есть предложения, как можно решить вторую задачу точнее/правильнее — полагаю, автор будет рад советам. Но писать про то, что сервис не спасает от мошенников, которые врут в объявлениях — не конструктивно. Эта проблема есть, и её наличие не зависит от того, используете вы сервис или нет.

        P.S. Автору желаю успехов. Полагаю, что если добавить в функционал сайта сортировку «втупую» по цене, недовольных в комментариях поубавится. :)


        1. nikitos18
          17.10.2016 22:58
          +1

          Браво! Похоже, Вы первый кто прочитал статью и вник, прежде чем делать выводы!


  1. 2PAE
    17.10.2016 08:43
    +4

    Первое впечатление от PDF-ки. Слабо, откровенно слабо. Слишком мало информации на первом листе, и слишком непонятно на следующих 6 листах. Я обычный человек, мне данные не понятны и не наглядны.

    1) Добавить возможность вставить фото машины. Брать или из каталога, или загружает сам человек.
    2) Параметры авто, свести в таблицу, или в одну строку через точку-запятую. В любом случае не так как сейчас.
    3) Предусмотреть печать на ч/б принтере.
    4)…
    эээ… не готов продолжить, но считаю, что менять дизайн однозначно необходимо.

    Вы ведь делаете сервис, для людей не владеющих высшей математикой? Так что всё должно быть на одном листе.
    Первое что попалось под руку. http://cs624431.vk.me/v624431773/ac03/QwXqfcWzilI.jpg
    Вложитесь в разработку хорошей инфографики.


    1. nikitos18
      17.10.2016 10:51
      +1

      Спасибо за критику, учту.


      1. ikashnitsky
        17.10.2016 11:12

        Для вдохновения можно поизучать макетирование резюме (CV). Простое правило — все должно быть на 2 стр. Так, чтобы распечатал — и в руках один лист со всей информацией.


        1. nikitos18
          17.10.2016 11:16

          спасибо за совет


        1. occam
          17.10.2016 21:33

          Правила усложнились. Идеальное cv должно быть на 1 стр. Так, чтобы распечатал — и даже не переворачивать.


          1. n01d
            18.10.2016 10:47
            +2

            Простите, не удержался


  1. elve
    17.10.2016 08:48
    +4

    Как пример с data mining круто. Но с реальностью эта «оценка авто» мало связана. Из-за этого сервис будет выдавать неверные, с практической точки зрения, результаты. Правильно выдаст только среднерыночную цену (видимо поэтому только ее вы и продаете по 99 рублей).

    Юмор в том, что «выгодное предложение» это не самая низкая цена (т.к. это обычно самое невыгодное предложение из-за необходимости дорогих ремонтов), а самое высокое качество при как можно более низкой цене =). А качество оценивается при личном осмотре специалистом (хотя некоторые частично могут по фотографиям определить). В вашем случае люди больше времени потратят на осмотры машин доверяя вашим оценкам, чем они бы на сайтах объявлений потратили. И это если кто-то не додумается по такой рекомендации купить не глядя.


    1. Vjatcheslav3345
      17.10.2016 22:50

      Как пример с data mining круто… если кто-то не додумается по такой рекомендации купить не глядя.

      Получается, сейчас сервис на уровне хорошего курсовика хорошего студента, но "работает" он чисто формально. И он вылезет с этого уровня только тогда, когда сможет дать правильную информацию — другое дело, что он может не успеть это сделать — за информацию берётся деньга, и, с точки зрения закона, это платная услуга и, значит, разгневанные владельцы купленных не глядя машин могут подать в суд на автора сервиса
      (по закону о защите прав потребителей) — как только они это сделают, разработчику сервиса тут же станет не до его улучшений.


      1. nikitos18
        19.10.2016 01:12
        +1

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


    1. nikitos18
      19.10.2016 01:00

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

      «В вашем случае люди больше времени потратят на осмотры машин доверяя вашим оценкам, чем они бы на сайтах объявлений потратили» — ну а этого говорит о том, что Вы, вероятно, никогда не пробовали искать машину на нескольких сайтах.


      1. elve
        21.10.2016 10:35
        -1

        Читал и смотрел картинки и основную суть уловил. А вот сайтик ваш, в момент написания моего комментария, отличался от того, как он выглядит сейчас. Очень неконструктивно изменить его, а потом отвечать на протухший комментарий с претензиями.

        Машину по нескольким сайтам вручную искал не один раз, если вам так интересно.


        1. nikitos18
          21.10.2016 10:52

          Смешно)) И что же, по Вашему, я поменял на сайте. Вы себе очень льстите, думая что прочитав ваш комментарий, я бросился что-то править.


  1. unwrecker
    17.10.2016 08:49
    +5

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


    1. nikitos18
      17.10.2016 09:56

      Это по параметрам получить список автомобильных которые стоит смотреть в первую очередь.


    1. VSOP_juDGe
      17.10.2016 15:59

      А что за сервисы, и как они их вычисляют? Ищут объявления с тем же телефоном?


      1. zzzmmtt
        17.10.2016 18:26

        Примерно так и есть, по номеру телефона ведется поиск по нескольким сайтам (авинфогуру посмотрите). Правда с вводом услуги подмены номера — не самая актуальная затея. Да и прошаренные перекупы пользуются правилом — 1 автомобиль — 1 симкарта.


  1. superkonst1
    17.10.2016 09:44

    А еще хорошо бы завести базу с заранее заполненными значениями основного парка автомобилей. Чтобы указать модель, а остальное было подставлено автоматически.
    Ибо вот зачем указываю авто выпускающееся с 2010 года, предлагать выбрать год начиная с 1978?
    А двигателей там всего 3 модификации…
    Плюс таки да. А потестировать? 1 раз с Ip 1 машину бесплатно, или еще какой способ. Или цену картинкой отдавать, но пока. «не верю!» ;)


    1. nikitos18
      17.10.2016 09:45
      +1

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


      1. superkonst1
        17.10.2016 11:33

        Fiat Doblo.
        Их было далеко не одно поколение. Но у Вас поколений нет совсем.
        Но даже по марке можно отфильтровать большинство годов и объемов двигателя.


        1. nikitos18
          17.10.2016 12:33
          +1

          Поправил fiat doblo, спасибо за замечание.


          1. superkonst1
            17.10.2016 12:53

            Угу. Стало лучше. Но.
            2005-2015 (I restyle) Поправить год с дефолтного. И опять 1978 и далее по списку. :( Плюс с клавиатуры не вбить.
            Двигатель ладно. Угадали. Но если менять опять весь список, вместо нескольких значений.
            Пробег, я бы не против и руками вбить.
            Пробег в год, считается из возраста машины и общего пробега, зачем его выбирать?
            Тип кузова, привод, тоже можно подставлять, по выбору поколения, или модели.


            1. nikitos18
              19.10.2016 01:48
              +1

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


  1. kankov
    17.10.2016 09:49
    +3

    Вообще есть специальные платные сервисы для перекупщиков, куда объявления прилетают на полчаса-час раньше, чем на сами сайты обэявлений. В итоге выгодные варианты распродаются до публикации объявлений.


    1. nikitos18
      17.10.2016 09:56
      -3

      Конечно есть, только аналитики они не предоставляют.


  1. San_tit
    17.10.2016 09:52
    +3

    Все, конечно, замечательно. Кроме одного НО: машины сильно ниже среднего, скорее всего, «в хлам». За исключением, разве что, ситуаций, когда нужно срочно продать машину, но отфильтровать это ваш способ не может, как я понял.


    1. nikitos18
      17.10.2016 09:59
      -4

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


  1. gskm
    17.10.2016 09:52
    +2

    При покупке автомобиля нужно учитывать множество факторов, чтобы оценить насколько оправдана цена, которую за нее просит продавец. И то, если учитывать что продавец указал правдивые данные, что как правило далеко не так.


  1. zzzmmtt
    17.10.2016 14:10
    +1

    Объём двигателя на современном рынке с мощностью не сильно коррелируют, есть турбопакеты молока (1.2-1.6л) (фольксы, ауди, шкоды с их TSI и TFSI) и есть атмосферники. При равных объёмах мощность будет отличаться довольно сильно. Внутри этих двух подклассов таки да, корреляция объёма и мощности имеется.


    1. nikitos18
      17.10.2016 14:27
      -2

      Таких двигателей не много, поэтому целесообразно рассматривать только мощность в формировании модели.


      1. zzzmmtt
        17.10.2016 18:39
        +2

        Литраж учитывать особо смысла нет, для конечного потребителя зачастую важнее мощность, т.к. транспортный налог исчисляется именно по ней. И вы не поверите, у вага сейчас атмосферников почти не осталось, преимущественно турбодвижки.


    1. nikitos18
      17.10.2016 14:50
      +1

      Вопрос расчета корреляции между регрессорами подробно рассмотрен в предыдущей статье.


  1. gluck59
    17.10.2016 15:25
    +1

    Мотоциклы бы сюда…


    1. nikitos18
      17.10.2016 15:37
      +1

      сделаю, но попозже.


  1. occam
    19.10.2016 08:00
    +1

    Предметный рассказ о полезном проекте, у которого хорошее будущее, спасибо.


  1. ikashnitsky
    20.10.2016 01:14
    +1

    Очень релевантный свежий пост с R-bloggers


    https://longhowlam.wordpress.com/2016/10/19/dont-buy-a-brand-new-porsche-911-or-audi-q7/


    В связи с этим запрос на новую публикацию (если, конечно, у вас будет желание/время). Было бы очень интересно посмотреть на сравнительный анализ убывания цены в зависимости от производителя/модели на российских данных.


    1. nikitos18
      20.10.2016 01:44

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