실제로 작업할 때 전체적인 흐름을 보자면
1. 큰 그림 보기
2. 데이터 구하기
3. 데이터로부터 통찰을 얻기 위해 탐색, 시각화
4. 머신러닝 알고리즘을 위해 데이터 준비
5. 모델을 선택하고 훈련
6. 모델을 상세하게 조정
7. 솔루션 제시
8. 시스템 런칭, 모니터링하면서 유지 보수
첫 번째 큰 그림 보기 예시를 봐보겠습니다.
- 캘리포니아 인구조사 데이터를 사용해 캘리포니아의 주택 가격 모델 만들기
- 이 데이터로 모델을 학습시켜서 다른 측정 데이터가 주어졌을 때 그 구역의 중간 주택 가격을 예측해야 한다.
- 문제를 정의하고 성능 측정 지표를 선택한다.
문제 정의에서는 비즈니스의 목적이 정확이 무엇인지, 현재 솔루션 구성이 어떻게 되는지, 어떤 머신러닝으로 문제를 해결할 것인지 이렇게 크게 3가지 정도를 정하고 가야 합니다.
그다음은 성능 지표를 선택해야 합니다. 여기서 사용될 수 있는 성능 지표는
- RMSE(평균 제곱근 오차): 회귀 문제의 성능지표로 오차가 커질수록 출력값이 커집니다.
$$RMSE(X,h) = \sqrt{\frac 1 m \sum \limits^m_{i = 1} (h(x^{(i)}) - y^{(i)})^2}$$
- 또는 MAE(평균 절대 오차)도 고려할 수 있습니다.
$$MAE(X,h) = \frac 1 m \sum \limits^m_{i = 1} |h(x^{(i)}) - y^{(i)}|$$
여기서 m은 성능을 측정할 데이터셋에 있는 샘플 수
$x^{(i)}$는 데이터셋에 있는 i번째 샘플(레이블을 제외한)의 전체 특성값의 벡터
$y^{(i)}$는 해당 레이블(실제 타깃값)
$h(x^{(i)})$는 예측값
X는 데이터셋에 있는 모든 샘플의 모든 특성값을 포함하는 행렬로 샘플
RMSE와 MAE 두 지표 모두 예측값의 벡터와 실제 타겟값의 벡터 사이의 거리를 재는 방법 norm을 사용합니다. RMSE는 유클리디안 노름(L2 norm), MAE는 절댓값의 합을 계산하는 맨해튼 노름(L1 norm)을 사용합니다.
norm의 지수가 클수록 큰 값의 원소에 치우치며 작은 값은 무시되기 때문에 RMSE가 MAE보다 조금 더 이상치에 민감합니다. 하지만 이상치가 드물다면 RMSE를 더 자주 사용합니다. (RMSE는 제곱을 하기 때문에 큰 값에 치우칠 확률이 높다.)
데이터 가져오기
이제 모델을 학습시키기 위해서 데이터를 가져올텐데 데이터는 train set과 test set으로 나뉩니다. test set은 편향적인 판단을 방지하기 위해 데이터를 학습하기 전에 미리 test set을 떼어놓습니다. 전체 data set이 적다면 train set의 비율을 높이고 test set의 비율을 낮추지만 일반적인 경우에는 20%을 test set으로 설정해둡니다. 이 test set으로 모델을 평가합니다.
from sklearn.model_selection import train_test_split
X, y = train_test_split(housing, test_size = 0.2, random_state = 42)
# 다운받은 데이터를 담은 변수를 적어주면 됩니다. 여기서는 housing
test set을 만드는 방법 중에서는 사이킷런이 제공하는 train_test_split 함수를 이용하는 것이 가장 흔한 방법입니다. test set 샘플은 전체 데이터셋에 있는 여러 카테고리를 잘 대표해야 하는데 그러기 위해서는 적정 수로 계층(카테고리)을 나누고 각각의 계층들이 충분한 양의 샘플이 존재해야 합니다. 히스토그램을 보고 어떻게 나눌지 결정하는 것이 좋습니다.
데이터 이해를 위한 탐색과 시각화
test set을 분리했다면 train set에 대해서 데이터 탐색(학습)을 진행합니다. train set이 매우 크다면 조작을 간단하고 빠르게 하기 위해 탐색을 위한 set을 별로도 또 다시 샘플링할 수 있으나(mini batch), 사이즈가 작다면 train set 전체를 사용합니다. 시작하기 앞서 train set을 손상시키지 않기 위해서 복사본을 만들어서 사용해야 합니다.
위에 사진은 지리적 데이터를 시각화한 것입니다. 지리 정보가 있으니 모든 구역을 산점도로 만들어 데이터를 시각화해보면서 특정 패턴이 보이는지 생각해보고 alpha 옵션을 0.1로 주면 데이터 포인트가 밀집된 영역을 잘 보여주는데 이렇게 눈에 띄는 지역의 특성도 생각해봐야 합니다. 그 이후에 주택가격에 따라 다른 색깔로 시각화도 해보고 인구 수에 비례해서 원의 크기도 다르게 적용해봅니다.
각 특성간의 상관관계를 분석해보겠습니다.
1. 상관계수 행렬: 상관계수 행렬은 선형적이어야 합니다. 선형이 부족해지면 값이 0에 가깝게 됩니다. 절댓값이 중요
corr_matrix = housing.corr()
corr_matrix['median_house_value'].sort_values(ascending = False)
2. 산점도 행렬: 특성 사이의 상관관계를 확인하는 다른 방법은 숫자형 특성 사이에 산점도를 그려주는 판다스의 scatter_matrix 함수를 사용합니다.
머신러닝 알고리즘을 위한 준비
머신러닝 알고리즘은 수치형 특성들의 스케일이 많이 다르면 좋은 성능을 뽑아낼 수 없습니다. 여기서는 전체 방 개수의 범위는 6에서 39,320인 반면 중간 소득의 범위는 0~15까지 입니다. 모든 특성의 범위를 같도록 만들어주는 방법으로 min-max 스케일링과 표준화가 잘 사용됩니다.
min-max 스케일링은 0~1 사이 범위에 들도록 값을 이동하여 스케일을 조정하는 것으로 데이터 최솟값을 뺀 후 최댓값의 차이로 나누면 됩니다.
표준화는 먼저 평균을 뺀 후(표준화는 평균이 항상 0) 표준편차로 나눠서 결과 분포의 분산이 1이 되도록 합니다. 정규화와 달리 표준화는 범위의 상한과 하한이 없어 어떤 알고리즘에서는 문제가 될 수 있습니다.
'BOAZ > 데이터 분석' 카테고리의 다른 글
3. Ensemble and Random Forest (0) | 2022.08.09 |
---|---|
2. Decision Tree and SVM (0) | 2022.08.03 |
[핸즈온 머신러닝] 3장 (0) | 2022.07.31 |
1. Classification and Regression (0) | 2022.07.28 |
[핸즈온 머신러닝] 1장 한눈에 보는 머신러닝 (0) | 2022.07.21 |