본문 바로가기
  • SDXL 1.0 + 한복 LoRA
  • SDXL 1.0 + 한복 LoRA
Study/인공지능학습

[머신러닝 Reboot] 독해 - 핸즈온 머신러닝(2판) 2장

by 마즈다 2021. 3. 27.
반응형

늘상 그래왔듯이…내 머릿속에는 온갖 잡다한 관심과 호기심들이 종횡무진 날아다닌다.

덕분에 뭔가 하나를 진득하니 진행할 수가 없다…ㅠ.ㅠ

 

핸즈온 머신러닝 2판을 일기 시작한 것이 언제인지 기억도 안나고, 1장을 읽고 연습 문제 위주로 공부를

해보고자 하면서 1장의 연습문제를 정리해 블로그에 올린 것도 이미 2020년 11월 그러니까…4개월 

하고도 열흘이 지났다…남들 같았으면 책을 네댓 권은 마스터했을 시간이다…ㅠ.ㅠ

 

물론 그렇다고 논 것은 아니지만 이래서야 되겠는가 하는 자괴감이 든다…ㅠ.ㅠ

 

게다가 더더욱 놀라운 것은 나름 열심히 보느라고 2장은 3번 정도 반복해가면서 읽었는데도 불구하고…

연습문제를 풀려고 보니…뭔소린지 하나도 모르겠더라는…그냥 풀기가 어려운 정도가 아니고 아예

어디부터 시작을 해야 하는지를 모르겠는 황당한 상황…ㅠ.ㅠ

 

결국 그 이후 다시 수차례 훑어보고 나서야 2장에서 이야기하고자 하는 것이 무엇인지를 이해할 수 있었다.

그리고 그 전까지 이 부분을 제대로 이해하지 않고 그저 모델을 만들고 학습을 시키고 테스트를 하는 과정만

생각하고 있던 내가 얼마나 어리석었는지를 깨달았다…ㅠ.ㅠ (오늘의 글은 눈물바다로구나…ㅠ.ㅠ)

 

그래서 일단 2장의 내용을 간략하게 정리해두고 좀 더 기초로 돌아가서 데이터를 다루는 법, Python 및

관련 패키지들의 API에 대해 조금 더 기초를 다지기로 하였다.

 

더불어 핸즈온 머신러닝 2판 학습은 잠시 미뤄두고 우선 몇 권의 다른 책들을 먼저 읽어보기로 하였다.

아래는 올해 목표로 잡은 책들 목록이다.

 

  • 모두의 데이터 과학 with 파이썬
  • 파이썬을 활용한 머신러닝 쿡북
  • 머신러닝 탐구생활
  • 캐글 가이드

 

일단 이렇게 데이터 조작에 대해 조금 더 학습을 진행하고 다시 본격적으로 머신러닝에 대해 공부를 진행할

계획이다. 여기에 교재로 쓸 책은 다음과 같다.

 

  • 핸즈온 머신러닝 2판
  • 밑바닥부터 시작하는 딥러닝 1
  • 밑바닥부터 시작하는 딥러닝 2
  • 밑바닥부터 시작하는 딥러닝 3

 

일단 여기까지만 해도 올 한 해는 훌쩍 가버릴듯싶다.

 

그럼 일단 핸즈온 머신러닝 2판 2장의 내용을 간략하게 정리해보자~

 

머신러닝 프로젝트 진행 프로세스

 

  • 데이터 준비 : 다운로드 및 저장

. 어떤 데이터를 다운로드 받느냐에 따라 다르지만 대체로 웹에서 다운로드 받는 경우가 많을 것이며,

로컬에 저장된 파일로부터 읽어올 수도 있고, 또 머신러닝 관련 패키지에서 제공하는 경우들도 있다.

. 관련 라이브러리 및 API

import urllib
import ssl

# 아래 오류 벌생으로 ssl import
# URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)>
ssl._create_default_https_context = ssl._create_unverified_context
urllib.request

 

  • 적절한 데이터 타입으로 변환 (판다스의 DataFrame 등)

. 다운로드 받아 저장한 파일에 들어있는 데이터들은 실제 사용하기 위해 적절한 형식으로 바꾸어 주어야 

한다. numpy의 ndarray나 pandas의 DataFrame으로 바꾸면 데이터를 가공하기가 쉬워진다.

. 관련 라이브러리 및 API

 

import pandas as pd 

# csv 파일을 읽어 DataFrame 타입으로 리턴한다. 
pd.read_csv(csv_path)

 

  • 샘플 데이터를 통해 데이터셋의 상태 확인

. 누락된 데이터는 없는지?

. 각 특성의 데이터 타입 확인 (숫자형, 문자형, 범주형 등)

. 각 특성간의 스케일 차이 확인 (추후 스케일 조정 수행)

. 수치형 데이터의 분포 확인 (추후 가능한한 종모양의 분포로 조정)

. 관련 라이브러리 및 API

 

# housing은 DataFrame 타입의 객체이며 info() 함수를 실행하면 Non-Null Count 컬럼으로
# null 데이터가 있는지 여부를 확인할 수 있다. 또한 Dtype 컬럼으로 각 컬럼의 데이터 타입을
# 확인할 수 있다.
housing.info()

# 수치형 데이터의 경우 describe() 함수를 이용하여 각종 통계적 값을 확인할 수 있다.
housing.describe()

# matplotlib의 hist() 함수를 이용하여 히스토그램을 그리면 데이터의 형태를 시각적으로 
# 확인할 수 있다.
%matplotlib inline
import matplotlib.pyplot as plt
# Pandas DataFrame의 hist() 함수는  matplotlib.pyplot.hist()를 호출한다.
housing.hist(bins=50, figsize=(20,15)) 
plt.show()

 

  • 훈련 세트와 테스트 세트로 구분

. 모델을 결정하고 훈련을 하기 전에 미리 훈련 세트와 테스트 세트를 분리하여 테스트 세트는 완전히 샌드박스로 만든다. 

. 훈련 세트와 테스트 세트는 대략 80 : 20의 비율로 나눈다.

. 테스트 세트가 계속 변경되어 전체 데이터 세트가 모두 한 번씩 테스트 세트에 포함되는 것을 막아야 한다.

. 관련 라이브러리 및 API

 

from sklearn.model_selection import train_test_split

# scikit-learn의 train_test_split을 이용하여 훈련 세트와 테스트 세트를 나눈다. 
train_set, test_set = train_test_split(housing, test_size=0.2, random_state=42)

 

  • 데이터 샘플링

. 계층적 샘플링 : 모집단과 같은 분포를 갖도록 데이터 샘플링

. 너무 많은 계층으로 나뉘어서는 안되면 각 계층은 충분히 커야 함

. 훈련세트와 테스트 세트를 나눌 때는 이러한 계층적 샘플링이 되도록 나눔

 

from sklearn.model_selection import StratifiedShuffleSplit

# scikit-learn의 StratifiedShuffleSplit을 이용하여 계층적 샘플링을 수행한다.
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
for train_index, test_index in split.split(housing, housing["income_cat"]):
    strat_train_set = housing.loc[train_index]
    strat_test_set = housing.loc[test_index]

 

  • 데이터 시각화

. 훈련 세트를 이용하여 데이터를 시각화 함으로써 데이터에 대해 조금 더 깊이 파악하는 과정

. 산점도를 이용하여 특성간의 상관관계 조사

. 이상 형태를 보이는 데이터(특성) 구간을 확인

. 특성들의 조합(상관관계 분석)을 통해 의미 있는 특성을 새로이 발견

. 관련 라이브러리 및 API

 

%matplotlib inline
import matplotlib.pyplot as plt

# 시각화를 위해서는 matplotlib 패키지를 잘 숙지하도록 하자!

# Pandas DataFrame의 corr() 함수를 이용하면 특성간의 상관관계를 확인할 수 있다.
corr_matrix = housing.corr()

 

  • 데이터 정제

. 학습을 하기 위한 데이터의 준비는 가능한한 자동화를 하는 것이 좋음

. 누락된 특성 값 처리 : 누락된 값이 있는 특성을 모두 버리거나, 값이 누락된 특성이 있는 샘플들을 모두 버리거나, 누락된 값을 대표값으로 채우기 (평균, 중간값 등). 누락된 특성에 대한 처리는 나중에 추가된 데이터에서 어떤 특성에서 누락된 값이 나올지 모르므로 모든 수치형 특성에 적용하는 것이 좋음.

. 범주형 특성 정리

. 특성 스케일링 : 특성들의 스케일이 유사하도록 조정한다. 목표값에 대한 스케일링은 불필요하다.

    > min-max 스케일링(정규화) : 데이터에서 최솟값을 뺀 후 최댓값과 최솟값의 차이로 나눔.

       0~1사이의 범위에 들도록 함.

       MinMaxScaler

    > 표준화 : 평균을 뺀 후 표준편차로 나누어 결과 분포의 분산이 1이 되도록 함.

       상한과 하한이 없어 어떤 알고리즘에서는 문제가 될 수 있음.

       이상치에 영향을 덜받음.

       StandardScaler

    > 스케일링은 훈련 세트에 대해서만 fit() 메서드를 적용해야 함. transform() 

     메서드는 훈련 및 테스트 세트 모두 적용.

. 관련 라이브러리 및 API

 

# 숫자형 특성들만을 대상으로 누락된 값을 각 컬럼의 특정 값으로 채움
from sklearn.impute import SimpleImputer 

# 범주형 문자열 데이터를 수치형으로 바꿈
from sklearn.preprocessing import OrdinalEncoder

# 범주형 문자열 데이터를 One-Hot_Encoding 형식으로 변환
from sklearn.preprocessing import OneHotEncoder

# 데이터를 표준화 시켜주는 변환기
from sklearn.preprocessing import StandardScaler

 

  • 데이터 샘플링을 통해 변경된 샘플들을 테스트 세트에 추가한다. 이러한 과정들을 추후 파이프라인에 넣을수 있도록 추정기 또는 변환기를 만든다.

. 관련 라이브러리 및 API

 

# fit() 함수와 transform() 함수를 구현하여 변환기를 만들 수 있다.
# TransformerMixin을 상속하면 fit_transform() 함수가 자동 생성된다.
# BaseEstimator를 상속하면 get_params() 함수와 set_params() 함수가
# 자동 생성된다.
from sklearn.base import BaseEstimator, TransformerMixin

 

  • 만들어진 추정기와 변환기를 파이프라인에 넣어 자동화 한다.

. scikit-learn의 PipeLime 이용

. 컬럼 단위로 파이프라인을 적용하고자 할 때는 scikit-learn의 ColumnTransformer를 이용

. 관련 라이브러리 및 API

 

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

num_pipeline = Pipeline([
    ('imputer', SimpleImputer(strategy='median')),
    ('addtibs_adder', CombinedAttributesAdder()),
    ('std_scaler', StandardScaler()),
])

housing_num_tr = num_pipeline.fit_transform(housing_num)

 

  • 최종적으로 만들어진 훈련 데이터 세트를 이용하여 훈련 진행
  • 훈련 결과에 따른 보정

. 과소적합의 경우 더 강력한 모델을 선택하거나 훈련 알고리즘에 더 좋은 특성을 주입하거나 모델의 규제를 감소

. 교차 검증을 사용한 평가

. 관련 라이브러리 및 API

 

# RMSE 측정
from sklearn.metrics import mean_squared_error

housing_predictions = lin_reg.predict(housing_prepared)
lin_mse = mean_squared_error(housing_labels, housing_predictions)
lin_rmse = np.sqrt(lin_mse)
lin_rmse

# 교차 검증 수행
from sklearn.model_selection import cross_val_score

scores = cross_val_score(tree_reg, housing_prepared, housing_labels, scoring="neg_mean_squared_error", cv=10)
tree_rmse_scores = np.sqrt(-scores)

 

  • 모델 튜닝

. 그리드 서치 또는 랜덤 서치를 이용하여 하이퍼 파라미터 조정

from sklearn.model_selection import GridSearchCV
...
from sklearn.model_selection import RandomizedSearchCV

 

정리

 

서두에서도 말했듯이 현재의 나는 너무나 기초가 부족한 상황이다. 이 상태에서 진도를 나간다는 것은 말 

그대로 사상누각일 뿐…

 

현재 상황에서 내가 할 수 있는 일이라고는 머신러닝 공부를 중단하던가(사실 하고싶은 것들이 너무 많아

뭔가 하나를 포기해야 할 상황이긴 하다. 지금은 다른 것을 보류하고 잇는 상태지만 우선순위가 바뀌어도

크게 문제될 것은 없다). 아니면 부족한 기초… 즉, 파이썬 기초, 그리고 데이터를 다루는 법 등을 차근차근

배워나가는 것이다.

 

일단 밑도끝도 없이 인강도 많이 구입해놓았고 또 책들도 선정을 해놓았으니 올 한해는 기초를 다지는 것으로

목표를 삼아야겠다.

 

그래서 핸즈온 머신러닝은 당분간 봉인이다…ㅠ.ㅠ

 

 

반응형