https://dacon.io/competitions/open/235536/overview/description
import pandas as pd
import lightgbm as lgb
# 데이터 불러오기
train = pd.read_csv('/content/drive/MyDrive/ml/dacon/영화관객수예측연습/movies/movies_train.csv')
test = pd.read_csv('/content/drive/MyDrive/ml/dacon/영화관객수예측연습/movies/movies_test.csv')
submission = pd.read_csv('/content/drive/MyDrive/ml/dacon/영화관객수예측연습/movies/submission.csv')
train.head()
Column_name Description
1 title : 영화의 제목
2 distributor : 배급사
3 genre : 장르
4 release_time : 개봉일
5 time : 상영시간(분)
6 screening_rat : 상영등급
7 director : 감독이름
8 dir_prev_bfnum : 해당 감독이 이 영화를 만들기 전 제작에 참여한 영화에서의 평균 관객수(단 관객수가 알려지지 않은 영화 제외)
9 dir_prev_num : 해당 감독이 이 영화를 만들기 전 제작에 참여한 영화의 개수(단 관객수가 알려지지 않은 영화 제외)
10 num_staff : 스텝수
11 num_actor : 주연배우수
12 box_off_num : 관객수
test.head()
submission.head()
print(train.shape)
print(test.shape)
print(submission.shape)
(600, 12)
(243, 11)
(243, 2)
train.info()
dir_prev_bfnum(해당 감독이 이전에 만든 영화의 관객 수) 에 결측치 있음
test.info()
마찬가지 dir_prev_bfnum(해당 감독이 이전에 만든 영화의 관객 수) 에 결측치 있음
train.describe().T
test.describe().T
# 장르별 관객수
train[['genre', 'box_off_num']].groupby('genre').mean().sort_values('box_off_num')
# heatmap 사용 불가 시
corr_mat = train.corr()
corr_mat['box_off_num'].sort_values(ascending =False)
# 히스토그램
import matplotlib.pyplot as plt
%matplotlib inline
train.hist(bins = 50, figsize = (20,15))
plt.show()
오른쪽으로 꼬리가 긴 분포를 가진 변수에는 log 변환 필요
변수 | 일반적인 변환 |
---|---|
매출, 판매수량, 가격, 가구소득 | |
지리적 거리 | , |
효용에 근거한 시장점유율, 선호점유율 | |
우측으로 꼬리가 긴 분포 | , |
좌측으로 꼬리가 긴 분포 |
X_train = pd.get_dummies(columns=['screening_rat'], data = X_train)
X_test = pd.get_dummies(columns=['screening_rat'], data = X_test)
y_train = np.log1p(y_train)
예측한 값은 다시 원래 분포로 돌려놔야 함
pred = np.expm1([0 if x<0 else x for x in model.predict(X_train)])
X_train = pd.get_dummies(columns=['screening_rat'], data = X_train)
X_test = pd.get_dummies(columns=['screening_rat'], data = X_test)
features = ['time', 'dir_prev_num', 'num_staff', 'num_actor', 'dir_prev_bfnum', 'genre_rank', 'dist_rank', 'screening_rat']
from xgboost import XGBRegressor
from sklearn.ensemble import GradientBoostingRegressor, RandomForestRegressor
from sklearn.metrics import mean_squared_error
xgb = XGBRegressor(random_state = 42)
gbr = GradientBoostingRegressor(random_state=42)
rf = RandomForestRegressor(random_state=42)
md_label = ['XGBRegressor', 'GradientBoostingRegressor', 'RandomForestRegressor']
all_md = [xgb, gbr, rf]
all_rmse = []
for model, label in zip(all_md, md_label):
model.fit(X_train, y_train)
pred = np.expm1([0 if x<0 else x for x in model.predict(X_train)])
all_rmse.append({f'{label}' : mean_squared_error(y_train, pred, squared=False)})