결측치와 범주형 값을 단순하게 처리하기
Random Forest Regression은 꽤 견고해서 시간이 많이 드는 지루한 데이터 준비 과정을 상당 부분 건너뛸 수 있어요. 일부 Random Forest 구현체는 결측치와 범주형 값을 자동으로 처리하지만, PySpark의 구현체는 그렇지 않아요. 그래도 수학적 원리는 같기 때문에 단순한 값 치환만으로도 충분히 동작합니다.
결측치의 경우, 데이터가 모두 양수이므로 -1을 할당하겠습니다. Random forest는 이 값을 기준으로 분할하여 같은 특성 내의 다른 값들과 구분해 처리합니다.
범주형 값의 경우, 텍스트 값을 숫자로 매핑해 두면 random forest가 이를 기준으로 적절히 분할해 처리할 수 있어요. 이 예제에서는 코드를 더 간결하게 작성하려고 Introduction to PySpark에서 다뤘던 pipelines를 다시 활용하겠습니다. 연습 문제는 데이터프레임 열의 dtypes를 먼저 보여주는 것으로 시작하니, 이 연습 문제의 마지막 결과와 비교해 보세요.
참고: Pipeline과 StringIndexer는 이미 임포트되어 있습니다. categorical_cols 리스트도 제공되어 있어요.
이 연습은 강의의 일부입니다
PySpark로 하는 Feature Engineering
연습 안내
fillna()와subset매개변수를 사용해WALKSCORE와BIKESCORE의 값을 -1로 바꾸세요.- 리스트 내포(list comprehension)를 사용해
categorical_cols의 각 열을 순회하며StringIndexer목록을 만드세요. - 파이프라인
indexer_pipeline에fit()과transform()을 적용하세요. - 더 이상 필요하지 않으므로
drop()을 사용해categorical_cols를 제거하세요.dtypes로 결과 데이터 타입을 확인해 보세요.
실습형 인터랙티브 연습
이 예제를 이 샘플 코드를 완성하여 풀어보세요.
# Replace missing values
df = df.____(____, ____=[____, ____])
# Create list of StringIndexers using list comprehension
indexers = [____(inputCol=____, outputCol=____+"_IDX")\
.setHandleInvalid("keep") for ____ in ____]
# Create pipeline of indexers
indexer_pipeline = Pipeline(stages=indexers)
# Fit and Transform the pipeline to the original data
df_indexed = ____.____(df).____(df)
# Clean up redundant columns
df_indexed = df_indexed.____(*____)
# Inspect data transformations
print(df_indexed.dtypes)