본문 바로가기
머신러닝/프로젝트

Proj 구글 스토어 앱 데이터 분석을 통한 평점 예측 (2)

by ADELA_J 2023. 11. 27.

지난꺼 이어서 

https://dev-adela.tistory.com/279

 

 

앱 평점을 예측하기 위해서 회귀모델을 사용할 예정,

0~5점까지의 값을 내야하니까

 

학습하기 전 해야할 

<데이터 전처리>

 

1. 카테고리형 변수를 수치형으로 바꾸기.

 > ML에서 학습을 하려면 문자열이 아닌 컴퓨터가 학습할 수 있는 숫자로 바꿔줘야한다.

 

- 이전 글에서 확인했듯이

'Free', 'Ad Supported', 'In App Purchases',' Editors Choice', '2021'는

'False' 와 'True'로 되어 있다.

▶ 그래서 Ture를 1로 False를 0으로 바꾸기

 

 

▷원래 bool로 되어 있었던 피쳐들이 int 숫자로 바뀌었다.

그리고 아직도 남아있는 object...을 바꾸기 위해 사용할 one-hot encoding

(공부해놓고 정리를 아직 못했지만)

간단하게 이야기하자면 

 

▶대표적인 인코딩 방식으로 피쳐값의 유형에 따라

새로운 피쳐를 추가해서 고유 값에 해당하는 컬럼에만 1을 표시하고

나머지 컬럼에는 0으로 표시하는 것. 

예를 들면 원본데이터가 '상품분류 - TV, 냉장고' 일때

'상품분류_TV'와 '상품분류_냉장고'라는 컬럼을 만들어주고

냉장고인 것에는 1을 표시하고 TV에는 0을 표시하는 것이다. 

 ▷ 여러 개의 속성 중 한 개의 속성만 1로 표시하기 때문에 원-핫 인코딩이라 불림

 

▷ ▷ 사이킷런의 OneHotEncoder 클래스로 변환 가능 :

이건 input이 2차원 데이터가 필요하고 나중에 다시 toarray()를 사용해서

dense matrix로 변환해야지만 학습된다는 단점,,,☆

▶ 그래서 pandas에서 get_dummies()를 사용하면 됨.

 

▼ 여기서는 Category랑 Content Rating이 object으로 남았으니까 두개를 원핫인코딩 고고

 

확실히 됐는지 다시 확인!

이전에 info()를 통해 확인해봤을 때 

있었던 변수(컬럼)이 사라진 것을 확인 가능하다

 

▶ 그리고 데이터 분리

 

▶ 그리고 정규화, Normalization

input 데이터만 적용할거고, 

▷ Normalization을 하는 이유는,

값의 크기 범위가 달라서 학습이 한 쪽으로 치우쳐질 수 있는 문제를 방지하기 위해

 그러니까 간단하게, 값 범위를 일정한 수준으로 맞추기 위해. : feature scaling이라고도 함.

최소-최대 정규화가 있고 표준화가 있는데

여기서는 표준화 Standardization을 사용할 예정.

 

여기서 진짜,,,실수 많이했었는데...😂

결론부터 말하자면 

학습데이터에는 fit_transform을 해야하지만 테스트데이터에는 transform만 해야함.

▷ 학습데이터에 사용된 fit_transform은 fit + transform이 같이 되는 것인데,

fit은 보통 모델을 학습하는 메소드임.

그리고 transform은 fit에서 구한 평균과 표준편차로 주어진 데이터를 정규화함.

근데 기껏 미래에 만들어질 데이터를 모방하기 위해 만들어진 테스트 데이터에

fit을 한다면...?

미래에 어떻게 만들어질지 아직 모르는데 어떻게 평균과 표준편차를 구할 수 있을까 (강조)

그래서 테스트 데이터에는 학습데이터에서 구한 평균과 표준편차를 이용해서 정규화를 해야하기 때문에

fit 으로 학습을 하면 절대 안됨. 그래서 transform만 적용해야함.

 

 

그리고 드디어

<모델 학습 및 평가>

 

내가 구축할 모델은

1. Linear Regression

2. Random Forest

3. Decision Tree

4. XGBRegressor

5. LightGBM

와 학습시간 괜찮을까 컴퓨터야 괜찮을까

 

그리고 평가지표는 RMSE랑 R2 score로만 할 예정

한 번에 확인할 수 있도록 함수를 만들기

 

 

하하하 미세하게 XGBLight가 그나마 성능이 좀 좋은 편이지만

그렇게 썩 좋은 성능이 나오진 않았다 

Fine-tuning을 하게 된다면 좀 더 괜찮아지지않을까 싶다.