Автобус хэзээ ирэх вэ?

Nyamkhuu Demberelsuren
Beyond Data Science
6 min readNov 15, 2020

Data Nomads хурлын I шатны тэмцээнд оролцсон тухай

Зорилго

Одоогийн байдлаар Улаанбаатар хотын иргэд өөрийн хүлээж буй автобусын хаана явж байгааг харах боломжтой байдаг ч тухайн буудал дээр хэзээ ирэхийг мэдэх боломж муутай байдаг. Иймд, автобус ирэх цагийг хэрхэн таамаглаж болох талаар судлах төдийгүй дата анализийн “Cross-Industry process for data mining” (CRISP-DM) стандарттай та бүхнийг танилцуулах зорилгоор энэхүү нийтлэлийг оруулж байна.

CRISP-DM аргачлалын шатлалууд

CRISP-DM нь өгөгдөл олборлох (data mining) процессийг тодорхойлсон нээлттэй стандарт юм. Энэ нь дараах үе шатуудаас бүрдэнэ:

  1. Business Understanding —зорилго болон шаардлагаа тодорхойлох
  2. Data understanding — өгөгдлөө ойлгох. Асуудлыг шийдэхэд ашиглаж болох ямар төрлийн өгөгдөл байгаа, хэрхэн цуглуулах, шаардлага хангаж байгаа эсэхийг судлах шат
  3. Data preparation — өгөгдлөө бэлтгэх. Өмнөх шат дээр судалсан өгөгдлөө анализдаа ашиглахад бэлдэх, боловсруулах шат
  4. Modeling — анализ болон загварчлал хийх шат
  5. Evaluation —загварчлалын үр дүн зорилгодоо хүрсэн эсэхийг хэмжих, шалгах
  6. Deployment — зорилгодоо хүрсэн тохиолдолд загварыг нэвтрүүлэх буюу эцсийн хэрэглэгчид хүргэх

Зорилгоо тодорхойлсон учир дараагийн шат буюу өгөгдлөө ойлгох шатанд шилжье.

Data Understanding

Автобусны ирсэн цагтай холбоотой өгөгдөл цуглуулах дараах боломжууд байгаа:

  1. Хамгийн шулуун арга буюу Улаанбаатар Смарт Карт ХХК -аас шууд автобусны өгөгдлөө нээлттэй болгож хувалцахыг хүсэх :) Татгалзах магадлал өндөр бөгөөд зөвшөөрсөн ч нээлттэй болох хүртэл хугацаа их орох тул тохирохгүй байсан. Өмнө нь http://data.ulaanbaatar.mn/dataset/bus-tracking-data хаяг дээр автобустай холбоотой өгөгдөл нээлттэй байдаг байсан боловч 2016 оны 2 сараас хойш өгөгдөл шинэчлэгдэхээ больсон.
  2. Гар утсанд зориулсан UB Smart Bus программыг ашиглаж өгөгдөл цуглуулах. Энэ арга дотроо 2 төрлийн сонголттой:
  • Hard and Fast. Программын кодыг задлаж ямар хүсэлт хаашаа явуулж байгаа судлах. Үүний дараа хүсэлтийг дурайлган явуулах код бичэн өгөгдлийг цуглуулах.
  • Easy and Slow. Өмнөх сонголттой харьцуулахад энэ тохиолдолд хүн ашиглаж байгаа юм шиг дарж байгаа үйлдлүүдийг автоматаар дурайлгана. Өөрөөр хэлбэл код бичиж программын товч дээр дарах, цэс хооронд шилжих гэх мэт үйлдлийг хийнэ гэсэн үг юм. Үүний тулд Android Emulator (Android Studio-тай хамт сууна) + Appium суулгасан байхад болох юм. Энэ тохиолдолд Appium санг ашиглан Android утасны эмулятор дотор програмаа нээн үйлдлүүд хийж өгөгдлөө цуглуулна. Энэ сонголт нэг том сул талтай: өгөгдөл цуглуулах хурд нь удаан буюу хүн гараараа бүх чиглэлийн дэлгэрэнгүй дотор орж автобусны мэдээллийг бичихтэй адил байна.

Жишээ нь, дараах Python кодыг ашиглан автобусны чиглэлийн жагсаалтыг нээж болох юм:

from appium import webdriver 

desired_caps = dict(
platformName='Android'
platformVersion='10'
automationName='uiautomator2'
deviceName='Android Emulator'
app=PATH('UB Smart Bus_v2.19.1111_apkpure.com.apk')
) # Emulator-ийн тохиргоог зааж өгөх
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # Emulator эхлүүлэхdriver.wait_activity(".MenuActivity", 3, 1) # UB Smart Bus програм нээгдэхийг хүлээхdriver.find_element_by_id("com.uscc.ubbus:id/tv_btn_line").click() # Чиглэх хайх цэсний товч дээр дарахdriver.find_element_by_id("com.uscc.ubbus:id/btn_search").click() # Хайлт хийх товч дээр дарж чиглэлийн жагсаалтыг харах

3. Data Nomads хурлын эхний шатны тэмцээнд оролцох :) Анх ийм сонголт байгаагүй бөгөөд хоёрдох аргыг ашиглан хэрхэн өгөгдлөө цуглуулж болох талаар судалж байх үед уг тэмцээн зарлагдан оролцсон.

Data Nomads: Phase 1 competition

Анализийн дараагийн шатанд энэ тэмцээнд өгөгдсөн өгөгдлийг ашиглах тул тэмцээнтэй дэлгэрэнгүй танилцъя. Тэмцээний хүрээнд дараах 5 файл өгөгдсөн байсан:

  • training.csv — 206MB хэмжээтэй 7 баганатай 3'220'254 мөртэй 2020 оны 1 сарын 6-аас 2020 оны 1 сарын 19 хүртэлх загварчлал хийхэд ашиглах өгөгдөл
  • test.csv — тестийн дата, 7 баганатай 1'557'464 мөртэй 2020 оны 1 сарын 20-оос 2020 оны 1 сарын 26 хүртэлх таамаглал хийх шаардлагатай өгөгдөл
  • sample_submission.csv — таамаглалыг явуулах загвар файл
  • stops.csv — автобусны зогсоолын нэр, байршлын координатууд
  • routes.csv —автобусны чиглэлийн зогсоолын дарааллын мэдээлэл

Таамаглах хийхэд ашиглах өгөгдөл буюу training.csv файл дараах талбаруудтай:

  • BUSROUTE_ID — автобусны чиглэлийн ID дугаар
  • BUS_ID — автобусны ID дугаар
  • BUSSTOP_ID автобусны буудлын ID дугаар
  • BUSSTOP_SEQ — буудлын дараалал (өсөхөөр)
  • RECORD_DATE —автобус буудал дээр зогссон үеийн огноо
  • TIMESTAMP — автобус буудал дээр зогссон үеийн огнооны Timestamp хувиргалт
training.csv өгөгдлийн эхний хэдэн мөр

Харин test.csv файл бүтцийн хувьд сургалтын өгөгдөлтэй адилхан бөгөөд автобус буудал дээр зогссон цагийн 70% нь хоосон байгааг таамаглах шаардлагатай байсан юм.

Мөн зохион байгуулагчдын зүгээс дараах анхааруулгыг өгсөн байсан:

Автобуснууд сул зогсолт хийх, автобус буудал алгасаж явах, автобус эвдрэх зэрэг тохиолдлууд бодит амьдрал дээр байдаг тул сургалтын датанд эдгээр тохиолдлууд багтсан байгаа. Харин тестийн датан дээр бол сул зогсолтын тохиолдлыг аль болох хасаж өгсөн байгаа.

Иймд өгөгдлийг ашиглахын өмнө нэмэлт цэвэрлэгээ хийж сул зогсолт гэх мэт асуудалтай мөрүүдийг хасах хэрэгтэй юм. Үүний талаар дэлгэрэнгүй дараагийн хэсэгт дурдсан байгаа.

Data preparation

Цуглуулсан өгөгдлөө дараагийн шатанд буюу модел сургахад ашиглахад зориулан боловсруулж баяжуулья. Анх өгөгдсөн даалгаварт автобус дараагийн зогсоолд ирэх цагийг таамаглах хэрэгтэй, гэхдээ шууд хугацаа таамаглахын оронд автобус зогсоол хооронд хөдлөх хурдыг таамаглаж болох юм (зогсоол хооронд туулах замын урт тогтмол). Хурдны тархалт нь зарцуулах хугацааны тархалттай харьцуулахад илүү нормал хэлбэртэй тул модел таамаглал хийж сурахад илүү хялбар байна.

Хурд болон хугацааны тархалт

Гэхдээ тэмцээний өгөгдөл дунд автобусны зогсоол хоорондох замын урт өгөгдөөгүй учир, stops.csv гэсэн файлд өгөгдсөн байршлын мэдээллээс зайг тооцож гаргах хэрэгтэй. Зайг хоёр аргаар бодож болно:

  1. Haversine томьёо (https://en.wikipedia.org/wiki/Haversine_formula) — хоёр цэгийн хоорондох хамгийн богино замын урт. Гэхдээ энэ тохиолдолд автобус шулуун биш замдаа олон эргэлт хийж тойрч явдаг бол тооцоолол бодит зайнаас бага буюу зөрүүтэй гарах эрсдэлтэй.
  2. Google Maps (https://developers.google.com/maps/documentation/distance-matrix/overview)— Google Cloud дээр байдаг сервисийг ашиглан газрын зураг дээр хоёр цэгийн хоорондох зайг бодох. Гэхдээ, энэ сервисийг ашиглахын тулд Google Cloud дээр бүртгүүлж нууц түлхүүр үүсгэж авах хэрэгтэй. Мөн уг сервис нь 1000 хүсэлт тутам 5$-ийн үнэтэй боловч, Google-ийн сар бүр бэлэглэдэг 200$ эрхийг ашиглах нь бидний тохиолдолд хангалттай юм.
Google Maps дээр замын урт тооцсон жишээ

routingpy сан ашиглан сервисийг дараах байдлаар дуудаж болно:

import routingpyroute_client = routingpy.Google('SECRET_KEY')direction = route_client.directions(
[[lon_start, lat_start], # эхлэх цэгийн уртраг, өргөрөг
[lon_end, lat_end]], # очих цэгийн уртраг, өргөрөг
profile='driving', # автомашины хувьд тооцоолол хийх
units='metric') # хэмжилтийг метрээр хийх
dur = direction.duration # туулах хугацаа
dist = direction.distance # туулах зай

Таамаглах хувьсагчаа сонгосны дараа хурдыг сайн таамаглахад нөлөөлж болох хувьсагчдыг жагсаая:

  1. Долоо хоногийн өдөр (ажлын эсвэл амралтын өдөр, долоо хоногийн аль өдөр) болон цаг
  2. Автобусны зогсоолын мэдээлэл (хэдэн чиглэлийн автобус дамждаг, тухайн чиглэлийн эхлэлийн эсвэл эцсийн зогсоол эсэх)
  3. Цаг агаар. Жишээ нь, цас орсны дараа замын хөдөлгөөн удаашрах үзэгдэл бий. Гэхдээ тухайн тэмцээний сургалтын өгөгдөл ердөө 14 хоног бөгөөд, цаг агаарын нөлөөллийг сайн тооцоолж сурахад хангалтгүй гэж үзсэн тул ашиглагдаагүй
  4. Түгжрэл. Замын түүхэн түгжрэлийн мэдээлэл байхгүй тул, сүүлийн 5, 15, 30, 60 минутад автобус зогсоолууд хооронд хөдөлж буй дундаж хурдаар орлуулж болох юм
  5. Зогсоол хоорондох статистик (хоорондоо хэдэн км зайтай, дунджаар ямар хугацаанд ямар хурдтай явдаг гэх мэт)

Өөр нэгэн анхаарах асуудал нь өгөгдлөөс сул зогсолт, буудал алгасах гэх мэт хэвийн бус мөрнүүдийг модел сурахад муугаар нөлөөлөх асуудалтай байдаг тул хасах хэрэгтэй юм. Хамгийн энгийн арга нь хувьсагчдын утга тодорхой нэг тооноос илүү эсвэл бага гэсэн нөхцөлөөр хасаж болох юм. Өмнө зурсан хурд болон хугацааны тархалт дээр үндэслэн, хурд нь 60 км/ц -аас их эсвэл хугацаа нь 12500 секундээс илүү мөрнүүдийг хассан.

Modeling

Өгөгдлөө бэлдэж дууссаны дараа хамгийн гол хэсэг буюу модел сургаж эхэлье. Бидний тохиолдолд буюу бүтэцлэгдсэн өгөгдөл дээр Gradient Boosting арга ихэнх тохиолдолд сайн ажилладаг. Хэрвээ энэ аргын талаар та мэдэхгүй бол, энгийнээр тайлбарлахад тус арга нь олон жижиг буюу сул модел дараалан сургах бөгөөд, шинэ модел болгон өмнөх моделуудийн хийсэн таамаглалын алдааг засаж сурдаг. Доорх зураг нь дээр X, Y хувьсагчдыг ашиглан модел хэрхэн дөрвөлжин болон бөөрөнхий цэгүүдийг хооронд нь ялгаж сурч байгааг харж болно:

Gradint Boosting моделийн жишээ

Evaluation

Хэрвээ train.csv өгөгдлөө 80/20 харьцаатай сургалт болон тест хэсгүүдэд хуваан (time series split) моделоо сургавал, модел тест өгөгдлийн хувьд бодит хугацаанаас дунджаар 43 секунд эсвэл ±22% алдаатай байна. Гарч ирсэн үр дүн нь анх тавьсан зорилгыг биелүүлэхэд хангалттай бөгөөд ирээдүйд нэмэлт эх сурвалж ашиглах болон өгөгдлийн чанарыг сайжруулснаар алдааг илүү бууруулах боломжтой гэж үзэж байна.

Deployment

Эцсийн шат буюу моделийг нэвтрүүлэх, хэрэглэгчид хүргэхэд оршино. Жишээ нь, хэрвээ UB Smart Bus програм дээр моделийн үр дүнг харуулах тохиолдолд хийсэн таамаглалыг татаж авах веб-сервис Flask (https://flask.palletsprojects.com/en/1.1.x/) дээр хөгжүүлэх боломжтой юм. Гэхдээ одоогоор модел таамаглал хийхэд шаардлагатай өгөгдлийг шууд / цаг алдалгүй нээлттэй авах боломжгүй тул энэ шатыг түр алгасъя.

Энэхүү нийтлэлд CRISP-DM аргачлалтай хэрхэн ажиллах болон автобус ирэх хугацааг хэрхэн таамаглаж болох талаар багахан ч гэсэн ойлголттой болсон болвуу гэж найдаж байна. Дараагийн удаа, илүү сонирхолтой нийтлэлээр уулзъя. Хоцрохгүйн тулд манай хуудсыг follow хийгээрэй. Stay tuned!

--

--