[KaggleStudy] EDA + Baseline Model(0.40 RMSE)

이하얀·2024년 12월 16일
0

Notebook


라이브러리 import Error

  • from sklearn.preprocessing import Imputer

    • from sklearn.impute import SimpleImputer로 변경하여 임포트
  • pd.set_option('display.max_colwidth', -1)

    • 현재 지원되지 않는 것으로 보여, 우선 주석 처리 후 진행

결측치 확인

train[pd.isnull(train)].sum()

  • 데이터프레임에 datetime64[ns] 타입이 포함되어, datetime 값을 sum으로 합하려고 해서 생긴 문제
    • train.isnull().sum()로 작성하여 확인하는 방식으로 변경

Pickup, drop 일반적 위치 히트맵 시각화

  • folium 라이브러리 : int64 데이터 타입이 JSON으로 읽어오기 어려워 발생
pickup_map = folium.Map(location = [40.730610,-73.935242],zoom_start = 10,)

hm_wide = HeatMap( list(zip(pickup.pickup_latitude_round3.values, pickup.pickup_longitude_round3.values, pickup.Num_Trips.values)),
                     min_opacity=0.2,
                     radius=5, blur=15,
                     max_zoom=1 
                 )
pickup_map.add_child(hm_wide)

pickup_map

  • pickup['Num_Trips'] = pickup['Num_Trips'].astype('float64')으로 float으로 변환하여 사용
pickup['Num_Trips'] = pickup['Num_Trips'].astype('float64')

pickup_map = folium.Map(location = [40.730610,-73.935242],zoom_start = 10,)
hm_wide = HeatMap(list(zip(pickup['pickup_latitude_round3'].values,
                           pickup['pickup_longitude_round3'].values, 
                           pickup['Num_Trips'].values)),
                     min_opacity=0.2,
                     radius=5, blur=15,
                     max_zoom=1)

pickup_map.add_child(hm_wide)
pickup_map

Distribution of Pickups across Days

  • 그래프 x축 및 y축 재설정
plt.figure(figsize=(8,5))
sns.countplot(train['pickup_day_of_week'],order=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday', 'Sunday'])

  • 변경
plt.figure(figsize=(8, 5))
sns.countplot(x=train['pickup_day_of_week'], order=['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'])

plt.ylabel('Count')


Bearing

  • 방위각 계산

    • 두 지점 간 이동 방향을 구하는 데 사용
    • (구) 출발 지점에서 목적지까지의 방향
    • 북쪽 기준 각도 제공
  • 공식

    θ=atan2(sin(Δλ)cos(ϕ2),cos(ϕ1)sin(ϕ2)sin(ϕ1)cos(ϕ2)cos(Δλ))θ = \text{atan2}\left( \sin(\Delta \lambda) \cdot \cos(\phi_2), \cos(\phi_1) \cdot \sin(\phi_2) - \sin(\phi_1) \cdot \cos(\phi_2) \cdot \cos(\Delta \lambda) \right)

    • θ: 방위각 (단위: 라디안)
    • φ₁: 출발지점의 위도
    • φ₂: 목적지의 위도
    • λ₁: 출발지점의 경도
    • λ₂: 목적지의 경도
    • Δλ: 경도의 차이: Δλ=λ2λ1\Delta \lambda = \lambda_2 - \lambda_1
  • 계산

  1. 경도 차이 계산: Δλ=λ2λ1\Delta \lambda = \lambda_2 - \lambda_1
  2. 공식에 위도와 경도 값 대입
  3. atan2 함수로 방위각 θ 계산
def calculateBearing(lat1,lng1,lat2,lng2):
    R = 6371 
    lng_delta_rad = np.radians(lng2 - lng1)
    lat1, lng1, lat2, lng2 = map(np.radians, (lat1, lng1, lat2, lng2))
    y = np.sin(lng_delta_rad) * np.cos(lat2)
    x = np.cos(lat1) * np.sin(lat2) - np.sin(lat1) * np.cos(lat2) * np.cos(lng_delta_rad)
    return np.degrees(np.arctan2(y, x))
train['bearing']=train.apply(lambda row:calculateBearing(row['pickup_latitude_round3'],row['pickup_longitude_round3'],row['dropoff_latitude_round3'],row['dropoff_longitude_round3']),axis=1)
  • 이 코드를 사용한 이유
    • Bearing vs Trip Duration
    • 이동 방향에 따라서 이동 시간이 어떠한 추이나 패턴을 보이는지 파악할 수 있기 때문으로 미루어 짐작.
    • 이를 통해, 방향에 따른 이상치 분리가 가능할 것으로 보임

Number of pickups in each neighbourhood

  • 시간이 오래 걸려 고유값 개수 확인 -> 8개
print(train['pickup_neighbourhood'].nunique())
  • 55분 이상 소요됨 -> 다른 원인이 있는 것으로 추측됨
    • 단순 시각화이므로, 우선 주석처리하고 넘어감.

Feature Engineering on Test Data

  • pickup_neighbourhood, dropoff_neighbourhood에 대한 kmeans 객체가 정의되지 않아 발생한 문제
    • valueError 발생 후 해결되지 않아, 우선 넘어감

  • 코드 수정
    • 코랩 재실행으로 해결(왜.....?)
test['pickup_datetime']=pd.to_datetime(test['pickup_datetime'],format='%Y-%m-%d %H:%M:%S')
#test['dropoff_datetime']=pd.to_datetime(test['dropoff_datetime'],format='%Y-%m-%d %H:%M:%S')
test['pickup_date']= test['pickup_datetime'].dt.date
test['pickup_day']=test['pickup_datetime'].apply(lambda x:x.day)
test['pickup_hour']=test['pickup_datetime'].apply(lambda x:x.hour)
test['pickup_day_of_week']=test['pickup_datetime'].apply(lambda x:calendar.day_name[x.weekday()])
#test['dropoff_date']= test['dropoff_datetime'].dt.date
#test['dropoff_day']=test['dropoff_datetime'].apply(lambda x:x.day)
#test['dropoff_hour']=test['dropoff_datetime'].apply(lambda x:x.hour)
#test['dropoff_day_of_week']=test['dropoff_datetime'].apply(lambda x:calendar.day_name[x.weekday()])
test['pickup_latitude_round3']=test['pickup_latitude'].apply(lambda x:round(x,3))
test['pickup_longitude_round3']=test['pickup_longitude'].apply(lambda x:round(x,3))
test['dropoff_latitude_round3']=test['dropoff_latitude'].apply(lambda x:round(x,3))
test['dropoff_longitude_round3']=test['dropoff_longitude'].apply(lambda x:round(x,3))
test['trip_distance']=test.apply(lambda row:calculateDistance(row),axis=1)
#test['trip_duration_in_hour']=test['trip_duration'].apply(lambda x:x/3600)
test['bearing']=test.apply(lambda row:calculateBearing(row['pickup_latitude_round3'],row['pickup_longitude_round3'],row['dropoff_latitude_round3'],row['dropoff_longitude_round3']),axis=1)
test.loc[:, 'pickup_neighbourhood'] = kmeans.predict(test[['pickup_latitude', 'pickup_longitude']])
test.loc[:, 'dropoff_neighbourhood'] = kmeans.predict(test[['dropoff_latitude', 'dropoff_longitude']])

RandomForest

  • 런타임 에러 발생
    • 코랩에서의 RAM이 견디지 못해서 생기는 문제
    • 해결 방안 : 병렬처리, 파라미터 조정 등으로 해결할 예정
profile
언젠가 내 코드로 세상에 기여할 수 있도록, BE&Data Science 개발 기록 노트☘️

0개의 댓글