본문 바로가기
  • 조금 느려도, 꾸준히
Artificial Intelligence/Machine Learning

핸즈온 머신러닝(3) - 머신러닝 프로젝트 4

by chan 2020. 1. 21.
반응형

# 머신러닝 알고리즘을 위한 데이터 준비

 - 머신러닝 알고리즘을 위해 데이터를 준비할 때, 수동으로 작업하는 대신 함수를 만들어 자동화 해야 하는 이유가 있다.

  1) 어떤 데이터셋에 대해서도 데이터 변환을 손쉽게 반복할 수 있음

  2) 향후 프로젝트에 사용할 수 있는 변환 라이브러리를 점진적으로 구축할 수 있음

  3) 실제 시스템에서 알고리즘에 새 데이터를 주입하기 전에 변환시키는 데 이 함수를 사용할 수 있음

  4) 여러가지 데이터 변환을 쉽게 시도해볼 수 있고 어떤 조합이 가장 좋은지 확인하는데 편리

 

 - 예측 변수와 타깃 값에 같은 변형을 적용하지 않기 위해서 예측 변수와 레이블을 분리한다. drop() 함수는 데이터 복사본을 만들며, strat_train_set에는 영향을 주지 않는다.

housing = strat_train_set.drop("median_house_value", axis=1) # 훈련 세트를 위해 레이블 삭제
housing_labels = strat_train_set["median_house_value"].copy()

- 대부분의 머신러닝 알고리즘은 누락된 특성을 다루지 못하므로 이를 처리할 수 있는 함수를 만들 필요가 있다.

total_bedrooms 특성에 값이 없는 경우 이를 고칠 방법은 다음과 같다.

  1) 해당 구역을 제거

  2) 전체 특성을 삭제

  3) 어떤 값으로 채움(0, 평균, 중간값 등)

 

데이터프레임의 dropna(), drop(), fillna() 메서드를 이용해 이러한 작업을 처리한다.

housing.dropna(subset=["total_bedrooms"])    # 옵션 1
housing.drop("total_bedrooms", axis=1)       # 옵션 2
median = housing["total_bedrooms"].median()
housing["total_bedrooms"].fillna(median, inplace=True) #옵션 3

 - 사이킷런의 SimpleImputer을 이용해 누락된 값을 손쉽게 다룰 수 있다. 사용하는 방법은 다음과 같다.

 

먼저 누락된 값을 특성의 중간값으로 대체한다고 지정하여 SimpleImputer의 객체를 생성한다

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy="median")

중간값이 수치형 특성에서만 계산될 수 있기 때문에 텍스트 특성인 ocean_proximity를 제외한 데이터 복사본을 생성한다.

housing_num = housing.drop("ocean_proximity", axis=1)

imputer 객체의 fit() 메서드를 사용하여 훈련 데이터에 적용한다.

imputer.fit(housing_num)

# SimpleImputer(add_indicator=False, copy=True, fill_value=None, missing_values=nan, strategy='median', verbose=0)

imputer 는 각 특성의 중간값을 계산해서 그 결과를 객체의 statistics_ 속성에 저장한다. 나중에 시스템이 서비스될 때 새로운 데이터에서 어떤 값이 누락될 지 확신할 수 없으므로 모든 수치형 특성에 imputer 를 적용하는 것이 바람직하다.

imputer.statistics_
housing_num.median().values

#array([-118.51, 34.26, 29., 2119.5, 433., 1164., 408., 3.5409])

학습된 imputer 객체를 사용해 훈련 세트에서 누락된 값을 학습한 중간값으로 바꿀 수 있다.

X = imputer.transform(housing_num)

결괏값은 평범한 numpy 배열이므로 다시 pandas 데이터프레임으로 되돌린다.

housing_tr = pd.DataFrame(X, columns=housing_num.columns,
                         index = list(housing.index.values))

 

반응형

댓글