본문 바로가기
독서

예측모델 연습하기

by _><- 2022. 6. 18.
반응형

1. 데이터 살펴보기
1-1. 요약정보 확인
info() 함수 : 결측치 확인, 범주형 변수 확인

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10886 entries, 0 to 10885
Data columns (total 9 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   datetime  10886 non-null  object 
 1   계절        10886 non-null  int64  
 2   공휴일       10886 non-null  int64  
 3   근무일       10886 non-null  int64  
 4   날씨        10886 non-null  int64  
 5   온도        10886 non-null  float64
 6   체감온도      10886 non-null  float64
 7   습도        10886 non-null  int64  
 8   풍속        10886 non-null  float64
dtypes: float64(3), int64(5), object(1)
memory usage: 765.5+ KB

1-2. 기초 통계량 확인
describe() 함수
- 데이터의 범위가 일정한지 확인, 필요시 standardscalar, minmaxscalar 적용
- 데이터의 범위가 일정한 경우 pass

1-3. 종속변수와 독립변수의 관계 확인하기
groupby로 범주형 값에 따른 독립변수 관계 확인
먼저 독립변수와 종속변수를 합한 data 변수를 생성

datetime	계절	공휴일	근무일	날씨	온도	체감온도	습도	풍속	datetime2	count
0	2011-01-01 0:00	1	0	0	1	9.84	14.395	81	0.0	2011-01-01 0:00	16
1	2011-01-01 1:00	1	0	0	1	9.02	13.635	80	0.0	2011-01-01 1:00	40
2	2011-01-01 2:00	1	0	0	1	9.02	13.635	80	0.0	2011-01-01 2:00	32
3	2011-01-01 3:00	1	0	0	1	9.84	14.395	75	0.0	2011-01-01 3:00	13
4	2011-01-01 4:00	1	0	0	1	9.84	14.395	75	0.0	2011-01-01 4:00	1

data.groupby(['계절'])['count'].sum()

계절
1    312498
2    588282
3    640662
4    544034
Name: count, dtype: int64
data.groupby(['공휴일'])['count'].sum()
공휴일
0    2027668
1      57808
Name: count, dtype: int64
data.groupby(['근무일'])['count'].sum()
 
근무일
0     654872
1    1430604
Name: count, dtype: int64
data.groupby(['날씨'])['count'].sum()
날씨
1    1476063
2     507160
3     102089
4        164
Name: count, dtype: int64



2. 전처리
2-1. datatime으로 파생변수 만들기
datatime 칼럼의 타입을 datetime으로 변환하기

x_train['datetime'] = pd.to_datetime(x_train['datetime'])
x_train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10886 entries, 0 to 10885
Data columns (total 9 columns):
 #   Column    Non-Null Count  Dtype         
---  ------    --------------  -----         
 0   datetime  10886 non-null  datetime64[ns]
 1   계절        10886 non-null  int64         
 2   공휴일       10886 non-null  int64         
 3   근무일       10886 non-null  int64         
 4   날씨        10886 non-null  int64         
 5   온도        10886 non-null  float64       
 6   체감온도      10886 non-null  float64       
 7   습도        10886 non-null  int64         
 8   풍속        10886 non-null  float64       
dtypes: datetime64[ns](1), float64(3), int64(5)
memory usage: 765.5 KB

이제 datetime 컬럼에서 dt.year, dt.month, dt.day, dt.hour, dt.dayofweek 로 각각 파생컬럼 생성

x_train['year'] = x_train['datetime'].dt.year
x_train['month'] = x_train['datetime'].dt.month
x_train['day'] = x_train['datetime'].dt.day
x_train['hour'] = x_train['datetime'].dt.hour
x_train['dayofweek'] = x_train['datetime'].dt.dayofweek   //0 : 월, 1 : 화, 2 : 수 ..
 

groupby함수를 활용하여 연도별, 월별, 일별, 시간대별, 요일별 count의 값을 파악해봅니다.

2-2. 불필요 컬럼 삭제하기
x_test의 datetime 컬럼은 별도 변수에 저장 후 삭제하고 최종 제출결과 파일에 추가

x_test_datetime = x_test['datetime']
x_test = x_test.drop(columns=['datetime'])
 
 
 
 
3. 데이터 분리
 
from sklearn.model_selection import train_test_split
X_TRAIN, X_TEST, Y_TRAIN, Y_TEST = train_test_split(x_train, y_train, test_size = 0.2, random_state=10)
 
 
3-1. 분리되 행/열 확인
 
X_TRAIN.shape
X_TEST.shape
Y_TRAIN.shape
Y_TEST.shape
 


4. 데이터 학습 및 파라미터 튜닝하기

 
4-1. 예측모델로 학습하고 예측하기
 
from xgboost import XGBRegressor
model = XGBRegressor(n_estimators = 100, random_state = 10)
model.fit(X_TRAIN, Y_TRAIN)

y_test_predicted = pd.DataFrame(model.predict(x_test)).rename(columns={0:'count'})

4-2. 예측결과 평가해보기

Y_TEST_PREDICTED = pd.DataFrame(model.predict(X_TEST)).rename(columns={0:'count'})
Y_TEST_PREDICTED[Y_TEST_PREDICTED['count'] < 0] = 0

from sklearn.metrics import r2_score

r2_score(Y_TEST, Y_TEST_PREDICTED)
 
0.8557687199442273
 
 
 

4-3. 하이퍼파라미터를 변경하여 다시 모델을 생성 후 r2_socre 비교

from xgboost import XGBRegressor
model = XGBRegressor(n_estimators = 300, random_state = 10)
 
model.fit(X_TRAIN, Y_TRAIN)

 

Y_TEST_PREDICTED = pd.DataFrame(model.predict(X_TEST)).rename(columns={0:'count'})

Y_TEST_PREDICTED[Y_TEST_PREDICTED['count'] < 0] = 0
 
 
 
from sklearn.metrics import r2_score
r2_score(Y_TEST, Y_TEST_PREDICTED)
0.9067627133587264



5. 결과제출
concat함수로 datetime 결합

final = pd.concat([x_test_datetime, y_test_predicted], axis = 1)
final
 
	datetime	count
0	2011-01-20 00:00:00	1.627005
1	2011-01-20 01:00:00	0.000000
2	2011-01-20 02:00:00	0.000000
3	2011-01-20 03:00:00	0.000000
4	2011-01-20 04:00:00	0.000000
...	...	...
6488	2012-12-31 19:00:00	279.707062
6489	2012-12-31 20:00:00	182.190186
6490	2012-12-31 21:00:00	135.548462
6491	2012-12-31 22:00:00	93.159081
6492	2012-12-31 23:00:00	57.042912
6493 rows × 2 columns

final.to_csv('result.csv', index = False)


반응형

'독서' 카테고리의 다른 글

HSK 4급 어휘(1) 예문정리  (0) 2022.10.19
네이버 파파고, 구글 번역기  (0) 2022.10.19
분류모델 만들고 평가하기 연습  (0) 2022.06.18
전처리 연습  (0) 2022.06.18
힘들고 배고픔의 가치  (0) 2022.06.16