아파치 스파크 StringIndexer

IT 위키

StringIndexer는 Apache Spark MLlib에서 제공하는 범주형 문자열 데이터를 수치형 인덱스로 변환하는 변환기(Transformer)이다. 머신 러닝 알고리즘은 일반적으로 숫자형 입력을 필요로 하므로, 문자열로 표현된 범주형 변수를 정수형 인덱스로 매핑하는 데 사용된다.

1 개요[편집 | 원본 편집]

StringIndexer는 입력 열(input column)에 포함된 고유한 문자열 레이블을 빈도 또는 알파벳 순에 따라 정수 인덱스로 변환한다. 결과는 새 열(output column)에 저장된다. 이 작업은 머신 러닝 파이프라인에서 전처리 단계로 자주 사용되며, 이후 원-핫 인코딩과 함께 사용되기도 한다.

2 동작 방식[편집 | 원본 편집]

  • 가장 많이 등장하는 범주에 낮은 인덱스(보통 0)를 부여
  • 같은 빈도일 경우, 알파벳 순으로 우선순위 결정
  • 새로운 데이터에 대해 fit된 인덱싱 모델을 transform 단계에서 재사용 가능

3 주요 파라미터[편집 | 원본 편집]

  • inputCol: 변환할 열 이름
  • outputCol: 결과가 저장될 열 이름
  • handleInvalid: 'skip', 'error' (기본값), 'keep' 중 선택
    • 학습 시 보지 못한 범주가 나왔을 경우 처리 방식 지정

4 예시[편집 | 원본 편집]

from pyspark.ml.feature import StringIndexer
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("StringIndexerExample").getOrCreate()

data = spark.createDataFrame([
    (0, "사과"),
    (1, "바나나"),
    (2, "사과"),
    (3, "포도")
], ["id", "fruit"])

indexer = StringIndexer(inputCol="fruit", outputCol="fruitIndex")
model = indexer.fit(data)
indexed = model.transform(data)
indexed.show()

4.1 출력 예시[편집 | 원본 편집]

id fruit fruitIndex
0 사과 0.0
1 바나나 2.0
2 사과 0.0
3 포도 1.0

5 StringIndexerModel 저장 및 로드[편집 | 원본 편집]

model.save("/path/to/model")
from pyspark.ml.feature import StringIndexerModel
loaded_model = StringIndexerModel.load("/path/to/model")

6 StringIndexer와 OneHotEncoder 결합[편집 | 원본 편집]

StringIndexer로 인덱싱한 결과를 OneHotEncoder에 연결하여 원-핫 인코딩을 수행할 수 있다.

from pyspark.ml.feature import OneHotEncoder
from pyspark.ml import Pipeline

encoder = OneHotEncoder(inputCols=["fruitIndex"], outputCols=["fruitVec"])
pipeline = Pipeline(stages=[indexer, encoder])
model = pipeline.fit(data)
encoded = model.transform(data)
encoded.select("fruit", "fruitIndex", "fruitVec").show()

7 장점[편집 | 원본 편집]

  • 범주형 문자열 데이터를 머신 러닝에 적합한 수치형으로 변환 가능
  • 파이프라인과 쉽게 통합
  • 모델 직렬화 및 배포 가능

8 단점[편집 | 원본 편집]

  • 숫자 인덱스가 순서를 의미하지 않음에도, 일부 알고리즘이 이를 순서로 해석할 수 있음
  • 새로운 범주가 등장할 경우 별도 처리 필요 (`handleInvalid` 옵션 활용)

9 같이 보기[편집 | 원본 편집]

10 참고 문헌[편집 | 원본 편집]