웹 로그는 웹사이트를 통해 방문자의 활동을 기록하는 중요한 데이터 입니다. 이러한 웹 로그 데이터를 기반으로 조회수 예측 모델을 학습하는 것은 웹사이트의 효율적인 운영 및 마케팅 전략을 수립하는 데 도움이 될 수 있습니다. 본문에서는 웹 로그 데이터를 활용하여 조회수를 예측하는 모델을 학습하는 코드를 소개하겠습니다.
웹 로그 기반 조회수 예측 모델 학습
DACON의 웹 로그 기반 조회수 예측 해커톤에서 데이터를 다운로드하였습니다.
또한, 공개된 Baseline 코드를 사용했습니다.
주제는 웹 로그 데이터를 기반으로 조회수를 예측하는 것입니다.
수상자가 되면 인증서를 발급받을 수 있습니다.
DACON에서 공개한 데이터 명세는 다음과 같습니다.
- sessionID : 세션 ID
- userID : 사용자 ID
- TARGET : 세션에서 발생한 총 조회수
- browser : 사용된 브라우저
- OS : 사용된 기기의 운영체제
- device : 사용된 기기
- new : 첫 방문 여부 (0: 첫 방문 아님, 1: 첫 방문)
- quality : 세션의 질 (거래 성사를 기준으로 측정된 값, 범위: 1~100)
- duration : 총 세션 시간 (단위: 초)
- bounced : 이탈 여부 (0: 이탈하지 않음, 1: 이탈함)
- transaction : 세션 내에서 발생의 거래의 수
- transaction_revenue : 총 거래 수익
- continent : 세션이 발생한 대륙
- subcontinent : 세션이 발생한 하위 대륙
- country : 세션이 발생한 국가
- traffic_source : 트래픽이 발생한 소스
- traffic_medium : 트래픽 소스의 매체
- keyword : 트래픽 소스의 키워드, 일반적으로 traffic_medium이 organic, cpc인 경우에 설정
- referral_path : traffic_medium이 referral인 경우 설정되는 경로
웹 로그 기반 조회수 예측 모델 학습 코드
Baseline code에서 스케일 처리를 하고 Lasso 모델에서 LinearRegressor 모델로 변경해 보았습니다.
필요한 라이브러리를 임포트 합니다.
import pandas as pd
import numpy as np
import random
import os
from datetime import datetime
from sklearn.preprocessing import LabelEncoder
from sklearn.linear_model import Lasso
from lightgbm import LGBMRegressor
동일한 결과가 나오도록 시드를 고정합니다.
def seed_everything(seed):
random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
np.random.seed(seed)
seed_everything(42) # Seed 고정
데이터를 불러옵니다.
train = pd.read_csv('./open/train.csv')
test = pd.read_csv('./open/test.csv')
train 데이터셋에서 결측값을 확인합니다.
# train 데이터셋에서 결측값 확인
train_missing_values = train.isnull().sum()
print("Train 데이터셋의 결측값:")
print(train_missing_values[train_missing_values > 0]) # 결측값이 있는 열만 출력
모델 학습 시 결측값이 있으면 안되므로 결측값을 최빈값으로 채워줍니다.
여기서 test 데이터의 결측값은 train 데이터의 최빈값으로 채워줍니다.
train['keyword'].fillna(train['keyword'].mode()[0], inplace=True)
train['referral_path'].fillna(train['referral_path'].mode()[0], inplace=True)
test['keyword'].fillna(train['keyword'].mode()[0], inplace=True) #train의 최빈값 사용
test['referral_path'].fillna(train['referral_path'].mode()[0], inplace=True)
ID값은 학습에 필요가 없으므로 제거합니다.
train = train.drop(columns=['sessionID','userID'],axis=1)
test = test.drop(columns=['sessionID','userID'],axis=1)
범주형 형식의 컬럼을추출합니다.
encoding_target = list(train.dtypes[train.dtypes == "object"].index)
train, test 데이터의 범주형 컬럼을 label encoder를 수행합니다.
for i in encoding_target:
le = LabelEncoder()
le.fit(train[i])
train[i] = le.transform(train[i])
for case in np.unique(test[i]):
if case not in le.classes_:
le.classes_ = np.append(le.classes_, case)
test[i] = le.transform(test[i])
학습데이터와 타겟데이터를 구분해 줍니다.
train_x = train.drop(columns=['TARGET'])
train_y = train['TARGET']
test_x = test
컬럼 간 분포를 맞추기 위하여 스케일링을 합니다.
(결론적으로, 스케일링을 하지 않을 때와 큰 차이가 없었습니다.)
# scaling
from sklearn.preprocessing import MinMaxScaler
# MinMaxScaler scaled
std = MinMaxScaler()
std.fit(train_x)
X_train_scaled = std.transform(train_x)
X_test_scaled = std.transform(test_x)
LinearRegression 모델로 예측모델을 학습하고 test 데이터셋으로 예측합니다.
from sklearn.linear_model import LinearRegression
lr_model = LinearRegression()
lr_model.fit(X_train_scaled, train_y)
preds = lr_model.predict(X_test_scaled)
마지막으로, 결과를 제출하기 위한 코드입니다.
submission = pd.read_csv('./open/sample_submission.csv')
submission
submission['TARGET'] = preds
submission
submission.to_csv('./baseline_submission_scale.csv', index=False)
결론적으로, 웹 로그 데이터를 활용한 조회수 예측 모델을 통해 웹사이트의 트래픽 이용자의 행동 패턴을 분석하고 예측할 수있습니다. 이를 통해 온라인의 플랫폼 성과를 높이고, 효율적인 운영 및 마케팅 전략을 수립할 수 있습니다.
'취미' 카테고리의 다른 글
[OpenAI] text-to-video 모델 Sora(소라) 공개 (0) | 2024.02.26 |
---|---|
[Pandas] 판다스 프로파일링 파이썬 EDA 도구 ydata-profiling (0) | 2024.02.21 |
[멀티모달] 달리2(DALL-E2) 이해하기 (0) | 2024.02.15 |
[딥러닝] 합성곱 신경망(convolution) 딥러닝 기초 (0) | 2024.02.14 |
[딥러닝] 다층 퍼셉트론(MLP) 딥러닝 기초 (0) | 2024.02.13 |