Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[6주차] 퇴근시간 버스승차인원 예측 #6

Open
mingxoxo opened this issue Jan 27, 2021 · 8 comments
Open

[6주차] 퇴근시간 버스승차인원 예측 #6

mingxoxo opened this issue Jan 27, 2021 · 8 comments

Comments

@mingxoxo
Copy link
Member

mingxoxo commented Jan 27, 2021

https://dacon.io/competitions/official/229255/overview/

기온 공공데이터 사용 : https://data.kma.go.kr/stcs/grnd/grndTaList.do?pgmNo=70
강수량 공공데이터 사용 : https://data.kma.go.kr/stcs/grnd/grndRnList.do?pgmNo=69

@mingxoxo
Copy link
Member Author

mingxoxo commented Jan 27, 2021

  • datetime을 요일로 변환하기
    행이 8888-88-88 형의 문자열인 경우 먼저 datetime으로 변경해준다.
    pd.to_datetime(train['date'])
    그리고 요일을 구하는 함수를 사용한다.
    --> datetime.dt.weekday : 숫자로 요일을 반환, 0(월) ~ 6(일)
    --> datetime.dt.weekday_name : 문자로 요일을 반환, Monday ~ Sunday
    train['dayofweek'] = pd.to_datetime(train['date']).dt.weekday

https://truman.tistory.com/97

  • pandas.Series.value_counts
    해당하는 부분의 값을 count해준다.
    train['date'].value_counts()
    image

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.value_counts.html

  • df.dtypes : df의 각 컬럼의 자료형 정보를 표시

@mingxoxo
Copy link
Member Author

LR과 NN으로 모델학습 시킨 결과 성능(오차)값의 큰 변화 없음.
모델 학습을 다른 것을 시도해보느냐가 큰 차이가 있는지 궁금하다..
추측은 전처리를 어떻게 하느냐가 중요한 것이 아닌가 싶다.

  • take off 행을 제거하느냐의 차이가 별로 뚜렷하지 않다.
  • 날씨 데이터를 추가하였으나 큰 영향을 미치지 못하는 것 같다.
  • bus_bts 데이터를 잘 이용해야하는 것인가..? 아직 이용하지 못했다.

@mingxoxo
Copy link
Member Author

제주 기상정보 크롤링
selenium 사용

기상청 제주 기상자료 주소 : https://www.weather.go.kr/weather/observation/currentweather.jsp?auto_man=m&stn=0&type=t99&reg=184&tm=2019.10.25.16%3A00&x=16&y=10

  • observation_text
    image

  • btn[2]
    image

  • weather_data_10
    image

@mingxoxo
Copy link
Member Author

selenium - Colab에서 실행하기(chrome)

Selenium이란?

Selenium은 주로 웹앱을 테스트하는데 이용하는 프레임워크다. webdriver라는 API를 통해 운영체제에 설치된 Chrome등의 브라우저를 제어하게 된다. ‘눈에 보이는’ 컨텐츠라면 모두 가져올 수 있다.

참고 링크


전체 코드 : 1등_코드_날씨데이터_크롤링(colab_버전)

  • 패키지 설치 - selenium과 chromedriver
!pip install selenium
!apt-get update # apt install을 정확히 실행하기 위해 설치된 패키지 업데이트
!apt install chromium-chromedriver #패키지 설치
!cp /usr/lib/chromium-browser/chromedriver /usr/bin

cp : 유닉스 셸에서 한 파일을 어떤 장소에서 다른 장소로 또는 다른 파일 시스템으로 옮길때 사용하는 명령어
/usr/lib/chromium-browser/chromedriver 파일을 /usr/bin로 복사한다.

  • webdriver
    Chrome Headless
    : Chrome 브라우저를 GUI 없이 사용할 수 있는 모드
    리눅스 서버와 같이 GUI를 제공하지 않는 환경에서 '--no-sandbox' 옵션 추가
    disable-dev-shm-usage도 마찬가지로 GUI를 사용할 수 없어서 추가하는 것 같다.
    참고 링크

sys.path.insert : 다른 폴더(경로)에 있는 python 파일 import 가능하도록
경로를 환경변수로 지정 --> 경로를 환경변수로 설정하게 해주면 그 경로 안의 프로그램을 실행시킬 때 마다
경로를 매번 입력하지 않아도 된다.

import sys
sys.path.insert(0,'/usr/lib/chromium-browser/chromedriver')

from selenium import webdriver

#chrome의 option 설정
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless') #chrome 창이 나오지 않게 해준다.
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

#1등 코드에서의 browser == driver
driver = webdriver.Chrome('chromedriver', chrome_options=chrome_options)
  • 날씨 데이터 크롤링
import pandas as pd
import time

weather_data_10 = pd.DataFrame(columns = ['현재일기_10','현재기온_10','체감온도_10','일강수_10'])
url = 'http://www.weather.go.kr/weather/observation/currentweather.jsp?auto_man=m&type=t99&reg=184&tm=2019.10.25.16%3A00&x=19&y=7'
driver.get(url) #browser == driver

for i in range(0, 46):
  i+=1

  #id를 찾고 그 공간을 비운 후 새로운 값을 넣어준다 (날짜값,10시)
  elem = driver.find_element_by_id('observation_text')
  elem.clear()
  elem.send_keys("2019.9.{}.10:00".format(i))

  btn = driver.find_elements_by_class_name('btn')
  btn[2].click()

  time.sleep(1)
  weathers = driver.find_elements_by_css_selector('td')
  weather_data_10 = weather_data_10.append(pd.DataFrame([[weathers[40].text,weathers[44].text, weathers[46].text, weathers[47].text]],columns=['현재일기_10','현재기온_10','체감온도_10','일강수_10']))

print('success !')
driver.close()

@mingxoxo
Copy link
Member Author

mingxoxo commented Jan 31, 2021

1등 코드 데이터 전처리 부분

  1. weekday(요일) 변환
  2. route_station = bus_route_id(노선ID) + station_code(해당 승하차 정류소의 ID)
  3. bus_route_id_weekday = bus_route_id(노선ID) + weekday(요일)
  4. station_code_weekday = station_code(해당 승하차 정류소의 ID) + weekday(요일)
  5. route_station_weekday = route_station(노선+정류소 ID) + weekday(요일)
  6. 예측 값이 18 ~ 20시 ride이므로 train 안의 1시간대로 나누어져있는 승/하차 인원을 2시간 단위로 합쳐주는 column 생성

@mingxoxo
Copy link
Member Author

mingxoxo commented Jan 31, 2021

  • Query 함수
    pandas에서 조건에 부합하는 데이터를 추출할 때 가장 많이 사용
    장점 : 가독성과 편의성, 단점 : .loc[ ] 로 구현한 것보다 속도가 느림

Query 함수는 아래 6가지 기능을 포함하고 있습니다.

  1. 비교 연산자( ==, >, >=, <, <=, != )
  2. in 연산자( in, ==, not in, != )
  3. 논리 연산자(and, or, not)
  4. 외부 변수(또는 함수) 참조 연산
    -> 외부변수명 또는 함수명 앞에 @를 붙여 사용해야 한다.
    -> 또는 f-String를 이용하여 외부변수를 미리 참조하는 것도 방법
  5. 인덱스 검색
  6. 문자열 부분검색( str.contains, str.startswith, str.endswith )

출처 : https://blog.naver.com/wideeyed/221867273249

  • agg 함수
    : 여러개의 함수를 여러 열에 적용
    모든열에 여러 함수를 매핑 : group객체.agg([함수1,함수2,함수3,…])
    각 열마다 다른 함수를 매핑 : group객체.agg({‘열1’: 함수1, ‘열2’:함수2, …})
    train.groupby([ID])['18~20_ride'].agg([(col1, 'mean')])
    : ID를 기준으로 groupby함수를 적용한 그룹객체의 18~20_ride 행의 mean값 계산한 것을 col1행에 넣은 것을 반환하는 듯
    image

출처 : https://yganalyst.github.io/data_handling/Pd_13/#1-%EA%B7%B8%EB%A3%B9-%EA%B0%9D%EC%B2%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0--groupby

  • replace
    결측값 혹은 원래의 값을 다른 값으로 교체(replacing generic values)
    List 를 다른 List로 교체
    mapping dict 로 교체
    DataFrame의 특정 칼럼 값 교체

출처: https://rfriend.tistory.com/265 [R, Python 분석과 프로그래밍의 친구 (by R Friend)]

  • pd.get_dummies
    머신러닝을 할 때 기계가 이해할 수 있도록 모든 데이터를 수치로 변환해주는 전처리 작업이 필수적이다. 예를들어, 숫자가 아닌 object형의 데이터들이 있다면 (요일 같은) 먼저 수치형 데이터로 변환을 해주고 (0,1,2,3,...) 그다음 수치화된 데이터를 가변수화하여 나타내 준다면 기계학습에 적합한 데이터의 형태로 가공된다.
    이때 수치형 데이터로만 변환하게 되면 서로의 관계성이 생기게 된다.
    사실이 아닌 관계성으로 잘못된 학습이 일어나는 것을 방지하기 위해서 더미로 만든 가변수로 변환한다.
    image

출처: https://devuna.tistory.com/67 [튜나 개발일기📚]

  • geopy
    먼저 Geocoding이란 고유명칭(주소, 산, 호수 이름등)을 가지고 위도와 경도의 좌표값을 얻는 것을 말한다.
    반대로 위도와 경도값으로부터 고유명칭을 얻는것은 리버스 지오코딩(reverse Geocoding)이된다.
    geopy는 여러 유명한 Geocoding 웹 서비스를 위한 파이썬 client이다.
    geopy를 사용하면 파이썬 개발자가 타사 지오코더 및 기타 데이터 소스를 사용하여 전 세계의 주소, 도시, 국가 및 랜드마크 좌표를 쉽게 찾을 수 있다.
    import geopy.distance #거리 계산해주는 패키지 사용
    classgeopy.distance.vincenty(*args, **kwargs)
    : Thaddeus Vincenty가 고안한 공식을 사용하여 두 점 사이의 측지(위도경도 정확한 위치?) 거리를 계산한다.
coords_jejusi = (33.500770, 126.522761) #제주시의 위도 경도
data['dis_jejusi'] = [geopy.distance.vincenty((data['latitude'].iloc[i],data['longitude'].iloc[i]), coords_jejusi).km for i in range(len(data))]

data의 위도 경도와 제주시의 위도경도의 거리를 계산한다. 여기서 km은 kilometers

출처 : https://geopy.readthedocs.io/en/release-0.96.3/

@mingxoxo
Copy link
Member Author

mingxoxo commented Feb 1, 2021

  • pd.pivot_table()
    데이터 재구조화 : pd.pivot_table(data, index, columns, values, aggfunc)
    image

출처: https://rfriend.tistory.com/275 [R, Python 분석과 프로그래밍의 친구 (by R Friend)]

  • 멱평균(power mean)
    : 평균식을 일반화한 식이다. 산술평균, 기하평균, 조화평균 등을 포함한다.
    image

출처 : https://ko.wikipedia.org/wiki/%EB%A9%B1%ED%8F%89%EA%B7%A0

  • shutil.move
    파이썬에서 파일을 이동할 수 있도록 해주는 함수
import shutil

filename = 'test.txt'
src = 'home/banana/'
dir = 'home/banana/txt/'
shutil.move(src+filename, dir+filename)

출처 : https://ourcstory.tistory.com/96

@mingxoxo
Copy link
Member Author

mingxoxo commented Feb 2, 2021

Light GBM

트리기반의 학습 알고리즘인 gradient boosting 방식의 프레임 워크
import lightgbm as lgb

  • 트리를 수직적으로 확장(leaf-wise)
    : 확장하기 위해서 max delta loss를 가진 leaf를 선택하게 된다.

image

  • 속도가 빠르다.
  • 큰 사이즈의 데이터를 다룰 수 있고 실행시킬 때 적은 메모리 차지
  • 결과의 정확도에 초점을 맞춘다.
  • GPU 학습을 지원
    작은 데이터 셋에 사용하는 것은 추천하지 않는다. overfitting에 민감해 작은 데이터에 대해서는 과적합하기 쉽다. 10,000 이상의 row (행) 을 가진 데이터에 사용하는 것을 권유한다.
  • 핵심 파라미터
  1. Task : 데이터에 대해서 수행하고자 하는 임무를 구체화
  2. application : 가장 중요한 파라미터로, 모델의 어플리케이션을 정한다. regression(default) 또는 classification(binary/multiclass) 인지
  3. boosting : 실행하고자 하는 알고리즘 타입을 정의. default : gdbt
    image
  • dart
    특정 tree를 drop하여 과적합을 방지한다. 인공신경망에서의 dropout과 동일하다.
    일반적인 경우 조금 더 나은 예측력을 보여주지만 절대적인 것은 아니라고 한다.

출처 : 참고링크1 참고링크2

@mingxoxo mingxoxo changed the title 퇴근시간 버스승차인원 예측 [6주차] 퇴근시간 버스승차인원 예측 Feb 2, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant