ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [scikit-learn] LabelEncoder 알아보기
    AI-ML 2024. 3. 29. 06:50
    728x90
    반응형

     

    - 목차

     

    키워드.

    • Categorical
    • Ordinal
    • Encoder
    • Label
    • fit
    • inverse_transform

     

    들어가며.

    이번 글에서는 scikit-learn 의 LabelEncoder 에 대해서 알아보도록 하겠습니다.

    LabelEncoder 는 Categorical Data 를 수치화하는데에 활용됩니다.

    예를 들어, True 또는 False 값을 가지는 Boolean Data 는 1 또는 0 으로 표현될 수 있습니다.

    또한 "매우 아니다", "아니다", "조금 아니다", "적당하다", "조금 그렇다", "그렇다", "매우 그렇다" 와 같이 7가지의 상태를 가지는 설문 조사를 가정할 때, 7단계의 상태를 1 부터 7 까지의 수치로 표현할 수 있습니다.

    그 외, ["남성", "여성"] 과 같은 성별 데이터나 ["서울시", "대구시", ... ] 와 같은 거주지 정보와 같인 데이터 또한 대상이 될 수 있습니다.

    이러한 Categorical, Ordinal 한 이산데이터를 수치화시키는 방식은 LabelEncoder 가 제공하게 됩니다.

     

     

    LabelEncoder 사용하기.

    LabelEncoder 는 scikit-learn 의 preprocessing 모듈 내에 존재합니다.

    LabelEncoder 의 사용법은 아래와 같습니다.

    LabelEncoder 의 생성자를 활용하여 "le" 라는 이름의 변수에 LabelEncoder 객체를 할당합니다.

    그리고 fit 함수를 통해서 Encoding 해야할 Categorical Data 를 LabelEncoder 에게 전달합니다.

    transform 함수를 Categorical Data 를 인코딩하는 실질적인 함수입니다.

    from sklearn.preprocessing import LabelEncoder
    
    le = LabelEncoder()
    genders = ["Female", "Male"]
    le.fit(genders)
    print(le.transform(genders))
    array([0, 1])

     

     

    fit 함수.

    fit 함수는 Unique 한 데이터들을 입력합니다.

    LabelEncoder 는 fit 함수를 통해서 인코딩 대상이 되는 범주형 데이터를 입력받습니다.

    LabelEncoder 내부적으로 룩업테이블을 생성하고, 이러한 기반을 통해서 Encoding, Decoding 을 수행할 수 있습니다.

     

    아래 결과를 보시면, "gender""gender_encoded" 칼럼을 가지는 DataFrame 을 확인할 수 있습니다.

    "gender" 칼럼은 성별에 관한 범주형 데이터를 텍스트 형태로 저장하구요.

    "gender_encoded" 칼럼은 "gender" 칼럼의 값을 Encoding 한 결과입니다.

    import pandas as pd
    import random
    from sklearn.preprocessing import LabelEncoder
    
    genders = ["Male", "Female"]
    gender_list = list( map( lambda _: random.choice(genders), range(1000)))
    df = pd.DataFrame({"gender" : gender_list})
    
    le = LabelEncoder()
    le.fit(genders)
    df["gender_encoded"] = le.transform(df["gender"])

     

     

     

    transform 함수.

    이미 설명드렸지만, LabelEncoder 를 통해서 인코딩을 수행하기 위해서 transform 함수가 사용됩니다.

    사용 예시는 아래와 같습니다.

    자세한 설명은 위에서 한차례 이루어졌기에 생략하도록 하겠습니다.

    중요한 점은 fit 함수를 먼저 실행한다는 점입니다.

    범주형 데이터를 어떻게 인코딩할지에 대한 설정을 선행하는 것이 중요합니다.

    그 이후에 transform 함수를 사용할 수 있습니다.

    import pandas as pd
    import random
    from sklearn.preprocessing import LabelEncoder
    
    genders = ["Male", "Female"]
    gender_list = list( map( lambda _: random.choice(genders), range(1000)))
    df = pd.DataFrame({"gender" : gender_list})
    
    le = LabelEncoder()
    le.fit(genders)
    df["gender_encoded"] = le.transform(df["gender"])

     

    만약 fit 함수의 호출이 선행되지 않은 상태에서 transform 함수가 사용되면 아래와 같은 예외 케이스를 마주할 수 있습니다.

    sklearn.exceptions.NotFittedError: This LabelEncoder instance is not fitted yet. 
    Call 'fit' with appropriate arguments before using this estimator.

     

    inverse_transform.

    inverse_transform 은 인코딩된 Label 을 디코딩하도록 도움을 주는 함수입니다.

    사용하는 예시를 아래와 같습니다.

    인코딩된 칼럼에 해당하는 df["gender_encoded"] 를 inverse_transform 함수의 인자로 활용하면 됩니다.

    즉, Pandas 의 Series 를 입력 인자로 활용할 수 있습니다.

    import pandas as pd
    import random
    from sklearn.preprocessing import LabelEncoder
    
    genders = ["Male", "Female"]
    gender_list = list( map( lambda _: random.choice(genders), range(1000)))
    df = pd.DataFrame({"gender" : gender_list})
    
    le = LabelEncoder()
    le.fit(genders)
    df["gender_encoded"] = le.transform(df["gender"])
    df["gender_decoded"] = le.inverse_transform(df["gender_encoded"])

     

     

    classes_.

    LabelEncoder 객체는 내부적으로 classes_ 변수를 가지며, classes_ 변수는 원본 데이터들을 내장합니다.

    아래의 예시와 같이 fit_transform 함수를 통해서 인코딩 과정을 마친 이후에 classes_ 변수를 확인해보면,

    원본 데이터인 ['a', 'b', 'c', 'd', 'e'] 값을 확인할 수 있습니다.

     

    from sklearn import preprocessing
    lb = preprocessing.LabelEncoder()
    lb.fit_transform(['a', 'b', 'c', 'd', 'e'])
    
    print(lb.classes_)
    # ['a' 'b' 'c' 'd' 'e']
    
    print(type(lb.classes_))
    # <class 'numpy.ndarray'>

     

    반응형
Designed by Tistory.