지금은마라톤중

멋사 AI스쿨 TIL - (23) 본문

멋쟁이사자처럼/Python

멋사 AI스쿨 TIL - (23)

달리는중 2023. 3. 23. 16:02

2023.03.20

 

 train과 test의 day가 아예 다르기 때문에 빼주는 것이 낫다고 판단!

신호와 소음 구분하기

 

 
 
 하이퍼 파라미터 튜닝을 통해 모델의 성능을 개선시킬 수 있다!
-> GridSearch, RandomSearch로 최적의 하이퍼 파라미터 찾기

 

 

 

질문🙋🏻‍♂️ : 왜 label='casual', label='registered'을 따로 해주나요 ? 
- 모델을 만들고 돌릴 때부터 각각 따로 학습을 시켜준 뒤 최적의 하이퍼파라미터를 찾습니다.
- count = casual + registered

 

 

질문🙋🏻‍♂️ :  train 에는 unique 값의 max 가 2545 인데, test는 49인 이유는? 
- 정답값(y) 컬럼이 빠져 있기 때문

 

질문🙋🏻‍♂️ :  간단하게 모델을 만들기 전에 EDA를 해본다면 어떤 것을 해볼 수 있을까요?
- 정답값의 분포를 참고하여 레이블 스무딩 기법을 적용한다 
- 바이너리 인코딩을 적용할 수 있다. 
- object타입을 카운트해볼 수 있다

 

 기술통계를 통해 알 수 있는 것

0) 익명화 되어 있습니다.

1) 같은 값으로 되어 있는 변수도 있으며

2) 수치데이터의 경우 0~1 사이로 이미 스케일링 되어 있다는 것을 알 수 있습니다.

 

 

 skew -> 비대칭도

skew가 50보다 큰(비대칭도가 큰) 컬럼에 대해 히스토그램을 그려 값이 한쪽으로 치우쳐진 컬럼을 찾아주었습니다

 

 

 데이터의 수가 매우 많을 경우

-> 기술통계의 기술통계들을 구해보거나 , 왜도 첨도를 구해서 데이터의 특성을 파악합니다.

 

 

질문🙋🏻‍♂️ : 기술통계에 대한 기술통계를 구하고 이것을 활용하는 방법에 대해서 다시 한 번 설명해주실 수 있을까요?
데이터의 수가 매우 많기 때문에 , 데이터의 특성을 한눈에 보기 어려워 먼저 기술통계를 출력합니다 ! 
전체적으로 기술통계를 보았을때 max 값에 대한 기술통계 값을 보면 최댓값이 모두 1인 것을 확인할 수 있습니다. 
-> 평균값과 중앙값의 차이가 크지 않을걸로 보아 정규분포와 비슷한 형태를 띄는것을 알 수 있었습니다
-> 범주형으로 보았을 때 카테고리가 여러 개 중 하나만 있는 데이터의 경우 분포가 한쪽으로 값이 치우져져있습니다. 
따라서 기술통계의 기술통계를 구해서 값이 한 쪽으로 치우쳐진 변수를 찾습니다

 

 

질문🙋🏻‍♂️ : 모든 수치 변수가 0~1 사이값으로 되어 있습니다. 이것을 무엇을 의미할까요?



: 변수들이 min max 스케일이 되어있다.

 

질문🙋🏻‍♂️ : 모든 수치 변수가 0~1 사이값으로 되어있는 것이지 '0과 1로 되어있다'로 해석하면 안되는거죠...?
unique(), nunique() 를 확인해 보고 해석하는게 좋겠습니다


nunique() == 2 인 값만 0, 1로 되어 있습니다.(전제는 min == 0, max == 1 일 때)

 

 

팁❗️
수백, 수천개의 변수가 있을 때 어떤 변수부터 자세히 볼지 의사결정할 때 이런 기술통계의 기술통계를 활용해 볼 수 있습니다

 

 category type

: 문자열처럼 보이고 작동하지만 내부적으로는 정수의 배열로 표현됩니다.

이를 통해 데이터를 사용자 지정 순서로 정렬하고 데이터를 보다 효율적으로 저장할 수 있습니다.

 

 

●  XGBoost의 장점

- GBM 대비 빠른 수행시간

- 병렬 처리로 학습, 분류 속도가 빠름.

- 과적합 규제(Regularization)

- 표준 GBM 경우 과적합 규제기능이 없으나, XGBoost는 자체에 과적합 규제 기능으로 강한 내구성을 가짐

- Early Stopping(조기 종료) 기능이 있음

- 다양한 옵션을 제공하며 Customizing이 용이하다.

 

 

●  CatBoost의 장단점

- 속도가 매우 빠르다 .

- Overfitting 방지를 위해 내부적인 프로세스를 구축

- 시계열 데이터를 효율적으로 처리한다.

- 범주형 데이터 처리에 유리.

- 수치형 변수가 매우 많은 데이터일 경우 LightGBM 보다 학습 속도가 오래 걸린다는 단점이 있다.

 

 

● 원핫인코딩( one-hot encoding )

범주형 데이터를 수치형 데이터로 바꾸는 feature engineering 방법 

- 장점 : 

모든 머신러닝 알고리즘에서 사용 가능하다 
범주형 변수를 수치형 변수로 변환해 주므로, 모델이 변수 간 상관관계를 파악할 수 있다. 
범주형 변수의 카테고리 수가 많아져도 적용할 수 있다. 
- 단점 : 

카테고리 수가 많은 경우, 변수의 차원이 늘어남. 
-> 차원의 저주 문제 / 모델 학습 속도 저하 카테고리 수가 적은 경우 희소 행렬 생성
-> 데이터셋 크기가 커져 메모리, 처리 속도에 부담

 

범주형 데이터와 수치형 데이터를 분리

ohe = OneHotEncoder(handle_unknown="ignore”)

로 ohe 변수에 원핫인코더 객체 생성

train_ohe = ohe.fit_transform(train_remove_col[cat_col])
df_train_ohe = pd.DataFrame(train_ohe.toarray(), columns=ohe.get_feature_names_out())
df_train_ohe.index = train.index

train_remove_col 데이터프레임에서 카테고리 변수만 가져와 ohe.fit_transform을 적용해 train_ohe라는 변수에 할당해줌.

train_ohe를 array형태로 바꿔,(데이터프레임 형태로 만들어주기 위해서 먼저 array형태로 바꿔줌) 데이터프레임으로 만들어주고, columns에 ohe.get_feature_names_out()을 지정해 원핫인코딩 된 결과를 데이터프레임 형태로 바꿔준다!

그리고 index를 원래의 train데이터와 같게 만들어줌!(나중에 concat하기 위함)

df_train_num = train_remove_col.drop(columns="y").select_dtypes(include="number") #train_remove_col에서 y컬럼을 제외하고, 수치형 변수만 가져옴
df_train_enc = pd.concat([df_train_num, df_train_ohe], axis=1) #최종적으로 train_remove_col 데이터의 수치형 변수와, 원핫인코딩 된 카테고리 타입 변수를 concat해줌  

 

 

 

 

'멋쟁이사자처럼 > Python' 카테고리의 다른 글

멋사 AI스쿨 TIL - (25)  (0) 2023.03.23
멋사 AI스쿨 TIL - (24)  (0) 2023.03.23
멋사 AI스쿨 TIL - (22)  (1) 2023.03.16
멋사 AI스쿨 TIL - (21)  (0) 2023.03.15
멋사 AI스쿨 TIL - (20)  (0) 2023.03.15
Comments