[HO-ML] 2. 머신러닝 프로젝트 처음부터 끝까지


머신러닝 프로젝트를 보통 어떻게 진행하는지 flow를 한번 훑어보자. (필요없는건 거의 생략함..)

2.1 실제 데이터로 작업하기

2.2 큰 그림 보기

1) 문제정의

  • 비즈니스 목적이 정확히 무엇인지부터 정의.
  • 문제를 정의. 지도학습인가? 비지도학습인가? 분류인가? 회귀인가? 배치와 온라인학습 중 어느것을사용해야하는가?

2) 성능 측정 지표 선택

무엇으로 머신의 성능을 측정할것인가? ex. RMSE (평균 제곱근오차) 등..

3) 가정 검사

지금까지 만든 가정을 나열하고 검사를 해보자.

2.3 데이터 가져오기

1) 환경구축

python, jupyter notebook등을 설치해 환경을 구축한다

나는 맥 환경이어서 pyenv 사용해서 따로 머신러닝관련 python 환경을 만들었음

2) 데이터 다운로드

보통 csv파일로 구성된 파일을 많이 사용. 그외 json등으로 구성된 파일을 쓰기도함.

본 데이터 확장자가 무엇이든 어차피 다시 pandas dataframe으로 가져와서 사용하게됨.

3) 데이터 구조 보기

  • pd.read_csv(file_path) 로 데이터불러옴
  • df.head() 로 dataframe의 첫 5행 데이터 볼수있음
  • df.info() 로 dataframe의 간략한 설명과 전체 행 수, 데이터 타입과 널이 아닌 값의 개수를 확인가능
  • df.describe() 로 숫자형 특성의 요약정보 (count, mean, min, max) 등을 확인 가능

4) 테스트셋만들기

sklearn의 train_test_split 메소드를 사용해서 테스트셋만듬. (책에서는 직접 자신이 원하는 방법으로 split할 수 있게 split함수를짜는데, 꼭 필요한 커스텀이 있는게 아니면 있는걸 잘 활용해보자!)

2-4. 데이터 이해를 위한 탐색과 시각화

1) 지리적 데이터 시각화

x축: 위도, y축: 경도로 잡고 시각화하면 쉽게 지리적 데이터를 시각화 할 수 있다.

housing.plit(kind="scatter", x="longitude", y="latitude")

이런 시각화는 그냥 데이터로 깨닫지 못한 인사이트를 얻게 해주기때문에 매우 중요하다.

2) 상관관계 조사

각 특성간의 표준 상관계수corr() 메서드를 통해 쉽게 계산할 수 있다.

corr_matrix = housing.corr()

어떤 특성들끼리 관계가 있는지, 제한값이있는 특성이 있는 지 등을 파악할 수 있다.

3) 특성 조합으로 싫럼

상관계수로 분석한 특성을 기반으로 여러 특성을 조합해보면 또 다른 insight를 얻을 수 있다.

2-5. 머신러닝 알고리즘을 위한 데이터 준비

1) 데이터 정제

보통 데이터에는 노이즈가 많이 있으므로 이를 정제해야한다.

가령, 특성에 값이 없는경우 (null값 처리)

  • 전체 특성을 삭제 → drop()
  • 0, 평균, 중간값 등으로 채움 → fillna(), df.interplate()
  • 해당 구역을 제거 → dropna()

2) 텍스트와 범주형 특성 다루기

수치형이 아니라 텍스트같은 데이터같은경우는 머신러닝 알고리즘에 바로 input으로 활용할 수 없고, 전처리를 해줘야함. 보통은 텍스트를 숫자로 변환하여 사용.

ex. 원-핫인코딩(One-hot encoding)

from sklearn.preprocessing import OneHotEncoder
cat_encoder = OneHotEncoder()
housing_cat_1hot = cat_encoder.fit_transform(housing_cat)

텍스트같은경우 차후에 word2vec 이나 BertTokenizer 처럼 더 좋은 전처리 방법들이 소개될 예정

3) 나만의 변환기

나만의 변환기를 만들어서 사용할수도있음. 사이킷런은 duck typing을 지원하므로 아래 메서드들을 구현한 transformer를 만들면 된다!

  • fit() : self 리턴(학습)
  • transform() : 새 특징을 반환
  • predict() : 예측

4) 특성 스케일링

데이터의 가장 중요한 변환(전처리)중 하나가특성 스케일링(feature scaling)이다. 모든 특성의 범위를 같도록 표준화 해주는 방법으로 min-max 스케일링(정규화(normalization))표준화(standardization)가 널리 사용됨.

  • min-max 스케일링 : 정규화. 0~1 범위에 들도록 값을 이동하고 스케일을 조정.
  • 표준화 : 데이터에서 평균을 뺀 후 표전편차로 나누어 분산이 1이되도록함. 이상치(outlier)의 영향을 덜받는 스케일링 방법.

5) 변환 파이프라인

연속된 변환을 Pipeline 클래스를 통해 순서대로 처리할 수 있음.

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

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

housing_num_tr = num_pipeline.fit_transform(housing_num)

2-6. 모델 선택과 훈련

1) 훈련 세트에서 훈련하고 평가하기

훈련

from sklearn.linear_model import LinearRegression

lin_reg = LinearRegression()
lin_reg.fit(housing_prepared, housing_labels

예측

some_data = housing.iloc[:5]
some_labels = housing_labels.iloc[:5]
some_data_prepared = full_pipeline.transform(some_data)

print("예측:", lin_reg.predict(some_data_prepared))

평가

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

오차가 작을수록 잘 예측한것!

2) 교차 검증을 사용한 평가

한 세트로만 검증을 하기에는 모델과 데이터를 믿을 수 없다… 훈련세트를 10개 서브셋(fold)로 나누고, 매번 다른 fold를 선택해 평가에 사용하고 남은 9개 ofld는 훈련에 사용하는 k-fold cross-validation (k-겹 교차 검증)을 사용하자.

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)

2-7. 모델 세부 튜닝 (fine-tuning)

적합한 모델을 찾았다고 끝이 아니다. 그 모델이 더 잘 예측하게 하기 위해 모델의 하이퍼파라미터들을 조정하는 fine-tuning 을 수행해야한다.

1) 그리드 탐색

만족할만한 하이퍼파라미터 조합을 찾을 때까지 수동으로 하이퍼파라미터를 조정

사이킷런의 GridSearchCV를 이용하면 됨.

2) 랜덤탐색

GridSearchCV와 비슷하지만, 가능한 모든조합을 다 수행하는게 아니라 하이퍼파라미터에 임의의 수를 대입하여 지정한 횟수만큼만 평가. RandomizedSearchCV 사용.

3) 앙상블(Ensamble)

최상의 모델을 연결해서 사용. (ex. Randomforest). 여러 모델을을 사용해 예측하고 그 결과를 종합하여 예측하는 방법.

4) 최상의 모델과 오차분석

시스템이 오차를 만들었다면 왜 그런 문제가 생겼는지 이해하고 문제를 해결하는 방법이 무엇인지 찾아야함. ex) feature importance 분석

5) 테스트 세트로 시스템 평가

만족할만한 모델을 얻었다면, 나눠놓고 한번도 건드리지않았던 테스트셋을 드디어 사용할 때 ! 최종 모델을 테스트셋을 사용해 평가한다.

2-8. 런칭, 모니터링, 유지보수

훈련된 모델을 어플리케이션으로 말아서 배포하고 rest api 등을 통해 모델에 질의하여 predict 값을 리턴받는 방식으로 서비스 하는 방식이 일방적임. 아무래도 ml/dl은 python으로 주로 모델을 개발/학습하므로 flask나 django등을 사용하여 서비스 많이 하는듯..??




© 2020. by berrrrr

Powered by berrrrr