Artificial Intelligence/캐글-데이콘
[데이콘] 쇼핑몰 지점별 매출액 예측 경진대회
inee0727
2022. 7. 12. 19:33
라이브러리 호출
import numpy as np
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error
from sklearn.preprocessing import MinMaxScaler
1. 데이터 살펴보기_(1)데이터 준비
from google.colab import drive
drive.mount('/content/drive')
train_set = pd.read_csv( '/content/drive/MyDrive/shopping data/train.csv')
print(train_set) #[6255 rows x 12 columns]
print("=================================================================================================")
test_set = pd.read_csv('/content/drive/MyDrive/shopping data/test.csv')
print(test_set) #[180 rows x 11 columns]
# sample_submission 불러오기
sample_submission = pd.read_csv('/content/drive/MyDrive/shopping data/sample_submission.csv')
먼저 pandas 라이브러리의 read_csv() 함수를 이용해 분석에 사용할 데이터를 불러온다.
read_csv() 함수는 ('파일이 있는 위치/파일명.확장자명') 의 형식을 받아 데이터를 불러온다.
그리고 잘 불러와졌는지 확인했다.
|
1. 데이터 살펴보기_(2)데이터 확인
print(train_set.info())
print("=================================================================================================")
train_set.head()
데이터가 어떻게 생겼는지 살펴보았다.
pandas의 head(), info() 메소드를 활용하여 데이터에 이상치나 결측지가 있는지 살펴보았다.
1. id, store, date 등 총 13개의 칼럼이 있는것을 알 수 있었다.
2. Non-Null Count 부분을 보니 Promotion 부분에 결측치가 있다는 것을 알 수 있었다.
3. data, isholiday 부분은 숫자가 아니기 때문에 분석 전에 데이터 전처리가 필요하다.
|
2.데이터 전처리_(1)train_set, test_set 결측치 처리
#train 데이터 빈 부분 0으로 채우기
train_set = train_set.fillna(0)
print(train_set)
print("=================================================================================================")
test_set = test_set.fillna(0)
print(test_set)
결측치란 관측되지 않아 아무것도 없는 공간으로 되어 있는 데이터인데, 이 부분은 숫자 0으로 채워주었다.
NA 값들이 0.00으로 채워진 것을 확인할 수 있다.
|
2.데이트 전처리_(2)train / test_set Date 전처리
# Date 칼럼에서 "월"에 해당하는 정보만 추출하여 숫자 형태로 반환하는 함수 작성
def get_month(date):
month = date[3:5]
month = int(month)
return month
# 이 함수를 Date 칼럼에 적용한 Month 칼럼 만들기
train_set['Month'] = train_set['Date'].apply(get_month)
test_set['Month'] = test_set['Date'].apply(get_month)
# 결과 확인
print(train_set)
print("=================================================================================================")
print(test_set)
Date 칼럼은 날짜 정보를 담고 있다.
날짜는 겉으로 보기엔 숫자로 이루어져 있는 것 같지만 '00/00/0000' 형태의 문자로 이루어져 있다.
따라서 '일/월/년도' 형식의 문자를 숫자로 변환해주어야 하며 '월' 정보만 사용했다. '월'에 대한 정보만을 담고 있는 Month 칼럼이 잘 생성된 것을 확인할 수 있다.
|
2.데이트 전처리_(3)train/test_set IsHoliday 제거
# IsHoliday 칼럼의 값을 숫자 형태로 반환하는 함수를 작성합니다.
def holiday_to_number(isholiday):
if isholiday == True:
number = 1
else:
number = 0
return number
# 이 함수를 IsHoliday 칼럼에 적용한 NumberHoliday 칼럼을 만들어줍니다.
train_set['NumberHoliday'] = train_set['IsHoliday'].apply(holiday_to_number)
test_set['NumberHoliday'] = test_set['IsHoliday'].apply(holiday_to_number)
# 결과를 확인합니다.
print(train_set)
print("=================================================================================================")
print(test_set)
Date 칼럼은 휴일 정보를 담고 있다. 값은 휴일인 경우 True , 휴일이 아닌 경우 False 값을 갖는다. 파이썬에서는 True 는 1로, False는 0으로 해석하기 때문에 굳이 전처리를 해주지 않아도 분석을 진행하는 데에는 문제가 없지만 나는 전처리를 해주었다.
|
2.데이터 전처리_(4)칼럼제거
# 분석할 의미 없는 칼럼을 제거
train_set = train_set.drop(columns=['id'])
test_set = test_set.drop(columns=['id'])
# 전처리 하기 전의 칼럼들 제거
train_set= train_set.drop(columns=['Date','IsHoliday'])
test_set = test_set.drop(columns=['Date','IsHoliday'])
분석에 사용할 데이터들만 추리기 위해 id / Date / IsHoliday 칼럼을 제거해주었다.
|
3.학습에 사용할 정보와 예측하고자하는 정보 분리
x = train_set.drop(['Weekly_Sales'], axis = 1) #train 데이터 중 x 변수에는 Weekly 열을 제외한 나머지 컬럼을 저장한다.
y = train_set['Weekly_Sales'] #Weekly_Sales 컬럼만 y 변수에 저장한다.
print(x.shape) #(6255, 11)
print(y.shape) #(6255,)
x_train,x_test,y_train, y_test = train_test_split(x,y, train_size=0.7, shuffle=True, random_state=72)
학습에 사용할 정보는 Weekly_Sales 열을 제외한 나머지 컬럼들로, 이 컬럼들을 x 변수에 저장했다. 예측하고자 하는 정보인 Weekly_Sales 컬럼은 y 변수에 저장했다.
|
4. 모델 훈련_XgBoost
from xgboost import XGBRegressor
model = XGBRegressor(objective='reg:squarederror',
n_jobs = -1,
n_estimators = 90,
learning_rate = 0.2,
max_depth = 8,
min_child_weight = 1,
subsample = 0.8,
colsample_bytree = 0.7,
reg_alpha = 1, # 규제 L1
reg_lambda = 0 # 규제 L2
)
model.fit(x_train, y_train)
xgboost 모델로 학습시켰다.
|
5. 평가, 예측
results = model.score(x_test, y_test)
print("result : ", round(results, 4))
predict = model.predict(x_test)
def RMSE(y_test, predict):
return np.sqrt(mean_squared_error(y_test, predict))
rmse = RMSE(y_test, predict)
print("RMSE :", rmse)
result : 0.9588 RMSE : 115589.92841917255 |
6.submission 파일 생성
sample_submission ['Weekly_Sales'] = rmse
sample_submission .to_csv('/content/drive/MyDrive/shopping data/sample_submission.csv',index = False)