아파치 스파크 StringIndexer

IT 위키
빅데이터분석기사 (토론 | 기여)님의 2025년 4월 9일 (수) 09:28 판 (새 문서: StringIndexer는 Apache Spark MLlib에서 제공하는 범주형 문자열 데이터를 수치형 인덱스로 변환하는 변환기(Transformer)이다. 머신 러닝 알고리즘은 일반적으로 숫자형 입력을 필요로 하므로, 문자열로 표현된 범주형 변수를 정수형 인덱스로 매핑하는 데 사용된다. ==개요== StringIndexer는 입력 열(input column)에 포함된 고유한 문자열 레이블을 빈도 또는 알파벳 순에 따라 정수...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

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 참고 문헌[편집 | 원본 편집]