ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 56일차 - 파이썬 머신러닝(2)
    AI 솔루션 개발자과정(Java, Python) 2022. 12. 26. 17:59

    정렬, Aggregation 함수, GroupBy 적용

    DataFrame과 Series의 정렬을 위해서는 sort_values() 메서드를 이용한다.

    sort_values()는 RDBMS SQL의 order by 키워드와 매우 유사하다.

     

    주요 입력 파라미터는 by, ascending, inplace이다.

    by로 특정 칼럼을 입력하면 해당 칼럼으로 정렬을 수행한다.

    ascending=True로 설정하면 오름차순으로 정렬하며, inplace=False로 설정하면 sort_values()를 호출한 DataFrame은 그대로 유지되며 정렬된 DataFrame을 결과로 반환한다.

     

     

    Aggregation 함수 적용

    DataFrame에서 min(), max(), sum(), count()와 같은 aggregation 함수의 적용은 RDBMS SQL의 aggregation 함수 적용과 유사하다.

    다만 DataFrame의 경우 DataFramem에서 바로 aggregation을 호출할 경우 모든 칼럼에 해당 aggregation을 적용한다는 차이가 있다.

     

    단, count()는 Null 값을 반영하지 않은 결과를 반환한다.

    때문에 Null 값이 있는 칼럼은 count()의 결과 값이 다르다.

     

     

     

     

    groupby() 적용

    DataFrame의 groupby() 사용 시 입력 파라미터 by에 칼럼을 입력하면 대상 칼럼으로 groupby된다.

    DataFrame의 groupby()를 호출하면 DataFrameGroupBy라는 또 다른 형태의 DataFrame을 반환한다.

     

    DataFrame의 groupby()에 특정 칼럼만 aggregation 함수를 적용하려면 groupby()로 반환된 객체에 해당 칼럼을 필터링한 뒤 aggregation 함수를 적용한다.

    이때 여러 개의 aggregation 함수를 적용하려면 DataFrameGroupBy 객체의 agg()내에 인자로 입력해서 사용한다.

     

    여러 개의 칼럼이 서로 다른 aggregation 함수를 groupby에서 호출하려면 agg() 내에 입력값으로 딕셔너리 형태로 칼럼들과 함수를 입력한다.

     

     

     

     

    결손 데이터 처리하기

    판다스는 결손 데이터(Missing Data)를 처리하는 편리한 API를 제공한다.

    결손 데이터는 칼럼에 값이 없는 , 즉 NULL인 경우를 의미하며, 이를 넘파이의 NaN으로 표시한다.

    머신러닝 알고리즘은 이 NaN값을 처리하지 않기 때문에 이 값을 다른 값으로 대체해야 한다.

     

    또한 NaN 값은 평균, 총합 등의 함수 연산 시 제외가 된다.

    특정 칼럼의 100개 데이터 중 10개가 NaN 값일 경우, 평균 값은 90개 데이터에 대한 평균이다.

     

    NaN 여부를 확인하는 API는 isna()이며, NaN값을 다른 값으로 대체하는 API는 fillna()이다.

    isna()를 수행하면 모든 칼럼의 값이 NaN인지 아닌지를 True나 False로 알려준다.

    결손 데이터의 개수는 isna() 결과에 sum() 함수를 추가해 구할 수 있다.

    sum()을 호출 시 True는 1로, False는 0으로 반환되어 결손 데이터의 개수를 구할 수 있다.

     

     

    fillna()를 이용하면 결손 데이터를 편리하게 다른 값으로 대체할 수 있다.

     

     

     

     

    apply lambda 식으로 데이터 가공

    판다스는 apply 함수에 lambda 식을 결합해 DataFrame이나 Series의 레코드별로 데이터를 가공하는 기능을 제공한다.

     

    판다스의 경우 칼럼에 일괄적으로 데이터 가공을 하는 것이 속도 면에서 더 빠르나 복잡한 데이터 가공이 필요할 경우 어쩔 수 없이 apply lambda를 이용한다.

     

    lambda 식을 이용할 때 여러 개의 값을 입력 인자로 사용해야 할 경우에는 보통 map() 함수를 결합해서 사용한다.

    각 a의 요소에 접근하여 제곱하는 람다식이다.

     

     

    판다스 DataFrame의 lambda 식은 파이썬의 이러한 lambda 식을 그대로 적용한다.

     

     

     

    람다 식은 if else를 지원하는데, 주의할 점이 있다.

    if 절의 경우 if 식보다 반환 값을 먼저 기술해야 한다.

    이는 람다 식 ':' 기호의 오른편에 반환 값이 있어야 하기 때문이다.

    따라서  [ lambda x : if x <= 15 'Child' else 'Adult' ]가 아니라  

    [ lambda x : 'Child' if x <= 15 else 'Adult' ]가 맞다.

     

    또한, else if를 이용하기 위해서는 else 절을 ()로 내포해 if else에 적용해 사용한다.

     

     

     

     

     

    사이킷런

    사이킷런(scikit-learn)은 파이썬 머신러닝 라이브러리 중 가장 많이 사용되는 라이브러리이다.

    파이썬 기반의 머신러닝은 곧 사이킷런으로 개발하는 것을 의미할 정도로 오랜 기간 파이썬 세계에서 인정받았으며, 사이킷런은 파이썬 기반의 머신러닝을 위한 가장 쉽고 효율적인 개발 라이브러리를 제공한다.

     

    사이킷런의 특징

    • 쉽고 가장 파이썬스러운 API를 제공한다.
    • 머신러닝을 위한 매우 다양한 알고리즘과 개발을 위한 편리한 프레임워크와 API를 제공한다.
    • 오랜 기간 실전 환경에서 검증됐으며, 매우 많은 환경에서 사용되는 성숙한 라이브러리이다.

     

     

    사이킷런은 아나콘다를 설치하면 기본으로 설치가 되어 있다.

    하지만, 아나콘다의 기본 가상환경이 아닌 다른 가상환경에 설치하기 위해서는 다음과 같은 과정을 통해 설치해야 한다.

     

    먼저 아나콘다의 가상환경 목록을 확인한다.

     

    다음 명령어를 통해 가상환경을 변경한다.

     

    사이킷런을 설치한다. 특정 버전을 선택하여 설치할 수 있다.

     

     

     

    붓꽃 품종 예측하기 예제

    • 붓꽃 데이터 세트로 품종 예측하기
    • 피처로는 꽃잎의 길이와 너비, 꽃받침의 길이와 너비가 주어진다.
    • 피처란, 학습을 위해 주어지는 단서(특징) 데이터를 말한다.
    • 레이블이란, 분류 결정값을 뜻하는 것으로 '결과 카테고리'라 할 수 있다.

     

    실습 예제에 사용되는 하위 모듈이다.

    사이킷런 하위 모듈 종류

    • datasets : 자체적으로 제공하는 데이터세트(알고리즘 학습용)
    • tree : 트리 기반 머신러닝 알고리즘 구현 클래스 모음
    • model_selection : 학습 데이터와 검증 데이터, 예측 데이터를 분리하거나 평가하기 위한 기능

     

     

    피처에는 sepal length, sepal width, petal length, petal width가 있다.

    레이블은 0, 1, 2 세 가지 값으로 돼 있으며, 0이 Setosa 품종, 1이 versicolor 품종,  2가 virginica 품종이다.

     

     

    다음으로 학습용 데이터와 테스트용 데이터를 분리한다.

    학습용 데이터와 테스트용 데이터는 반드시 분리되어야 한다.

    학습 데이터로 학습된 모델이 얼마나 뛰어난 성능을 가지는지 평가하려면 테스트 데이터 세트가 필요하기 때문이다.

    이를 위해서 사이킷런은 train_test_split() API를 제공한다.

    train_test_split()을 이용하면 학습 데이터와 테스트 데이터를 test_size 파라미터 입력값의 비율로 쉽게 분할한다.

     

    예를 들어 test_size = 0.2로 입력 파라미터를 설정하면 전체 데이터 중 테스트 데이터가 20%, 학습 데이터가 80%로 데이터를 분할한다.

    iris_data는 피처 데이터 세트이다. 두 번째 파라미터인 iris_label은 레이블의 데이터 세트이다.

    test_size=0.2는 전체 데이터 세트 중 테스트 데이터 세트의 비율이다.

    마지막으로 random_state는 호출할 때마다 같은 학습/테스트 용 데이터 세트를 생성하기 위해 주어지는 난수 발생 값이다.

     

    train_test_split()은 호출 시 무작위로 데이터를 분리하므로 random_state를 지정하지 않으면 수행할 때마다 다른 학습/테스트 용 데이터를 만들 수 있다.

     

     

    이제 이 학습 데이터를 기반으로 머신러닝 분류 알고리즘의 하나인 의사 결정 트리를 이용해 학습과 예측을 수행한다.

     

    먼저 사이킷런의 의사 결정 트리 클래스인 DecisionTreeClassfire를 객체로 생성한다.

    random_state=11는 코드를 수행할 때마다 동일한 학습/예측 결과를 출력하기 위해 사용된다.

    예측은 반드시 학습 데이터가 아닌 다른 데이터를 이용해야 하며, 일반적으로 테스트 데이터 세트를 입력해 호출하면 학습된 모델 기반에서 테스트 데이터 세트에 대한 예측값을 반환하게 된다.

     

    예측 결과를 기반으로 의사 결정 트리의 예측 성능을 평가한다.

    일반적으로 머신러닝 모델의 성능 평가 방법은 여러가지가 있으나, 여기서는 정확도를 측정한다.

    정확도는 예측 결과가 실제 레이블 값과 얼마나 정확하게 맞는지를 평가하는 지표이다.

     

    예측한 붓꽃 품종과 실제 테스트 데이터 세트의 붓꽃 품종이 얼마나 일치하는 지를 확인한다.

    사이킷런은 정확도 측정을 위해 accuracy_score() 함수를 제공한다.

    이 함수의 첫 번째 파라미터로 실제 레이블 데이터 세트를, 두 번째 파라미터로 예측 레이블 데이터 세트를 입력한다.

     

    학습한 의사 결정 트리의 알고리즘 예측 정확도는 약 0.9333(93.33%)으로 측정되었다.

     

    붓꽃 데이터 세트로 분류를 예측한 프로세스를 정리하면 다음과 같다.

    1. 데이터 세트 분리 : 데이터를 학습 데이터와 테스트 데이터로 분리한다.
    2. 모델 학습 : 학습 데이터를 기반으로 ML 알고리즘을 적용해 모델을 학습시킨다.
    3. 예측 수행 : 학습된 ML 모델을 이용해 테스트 데이터의 분류(즉, 붓꽃 종류)를 예측한다.
    4. 평가 : 이렇게 예측된 결과값과 테스트 데이터의 실제 결괏값을 비교해 ML 모델 성능을 평가한다.

     

     

    Estimator 이해 및 fit(), predict() 메서드

    사이킷런은 ML모델 학습을 위해서 fit()을, 학습된 무델의 예측을 위해 predict() 메서드를 제공한다.

    지도학습의 주요 두 축인 분류(Classification)와 회귀(Regression)의 다양한 알고리즘을 구현한 모든 사이킷런 클래스는 fit()과 predict()만을 이용해 간단하게 학습과 예측 결과를 반환한다.

     

    사이킷런에서는 분류 알고리즘을 구현한 클래스를 Classifier로, 회귀 알고리즘을 구현한 클래스를 Regressor로 지칭한다.

    이들을 합쳐서 Estimator 클래스라고 부른다.

     

    Estimator 클래스는 다음과 같은 특징이 있다.

    • 분류 알고리즘 구현 클래스
    • 회귀 알고리즘 구현 클래스
    • 모든 Estimator는 fit()과 predict()를 가진다.

     

    cross_val_score() 와 같은 evaluation 함수, GridSearchCV와 같은 하이퍼 파라미터 튜닝을 지원하는 클래스의 경우 이 Estimator를 인자로 받는다.

    인자로 받은 Estimator에 대해서 cross_val_score(), GridSearchCV.fit() 함수 내에서 이 Estimator의 fit()과 predict()를 호출해서 평가를 하거나 하이퍼 파라미터 튜닝을 수행하는 것이다.

     

    사이킷런에서 비지도학습인 차원 축소, 클러스터링, 피처 추출 등을 구현한 클래스 역시 대부분 fit()과 transform()을 적용한다. 

     

     

    비지도학습과 피처 추출에서 fit()은 지도학습의 fit()과 같이 학습을 의미하는 것이 아니라 입력 데이터의 형태에 맞춰 데이터를 변환하기 위한 사전 구조를 맞추는 작업이다.

     

    fit()으로 변환을 위한 사전 구조를 맞추면 이후 입력 데이터의 차원 변환, 클러스터링, 피처 추출 등의 질제 작업은 transform() 으로 수행한다.

     

    사이킷런은 fit()과 transform()을 하나로 결합한 fit_transform()도 함께 제공한다.

    fit_transform()은 fit()과 transform()을 별도로 호출할 필요를 줄여주지만, 사용에 약간의 주의가 필요하다.

     

     

    키는 보통 data, target, target_name, feature_names, DESCR으로 구성되어 있다.

    개별 키가 가리키는 데이터 세트의 의미는 다음과 같다.

    • data는 피처의 데이터 세트를 가리킨다.
    • target은 분류 시 레이블 값, 회귀일 때는 숫자 결과값 데이터 세트이다.
    • target_names는 개별 레이블의 이름을 나타낸다.
    • feature_names는 피처의 이름을 나타낸다.
    • DESCR은 데이터 세트에 대한 설명과 각 피처의 설명을 나타낸다.

     

    data, target은 넘파이 배열(ndarray)타입이며,

    target_names, feature_names는 넘파이 배열 또는 파이썬 리스트 타입이다.

    DESCR은 스트링 타입이다.

     

    피처의 데이터 값을 반환받기 위해서는 내장 데이터 세트 API를 호출한 뒤에 그 Key값을 지정하면 된다.

    load_iris() API의 반환 결과는 sklearn.utils.Bunch 클래스이다.

    Bunch 클래스는 파이썬 딕셔너리 자료형과 유사하다.

    데이터 세트에 내장돼 있는 대부분의 데이터 세트는 이와 같이 딕셔너리 형태의 값을 반환한다.

     

    딕셔너리 형태인 load_iris() 데이터 세트의 key값은 다음과 같다.

     

    데이터 키는 피처들의 데이터 값을 가리킨다.

    데이터 세트가 딕셔너리 형태이기 때문에 피처 데이터 값을 추출하기 위해서는 데이터 세트, data를 이용하면 된다.

    마찬가지로 target, feature_names, DESCR key가 가리키는 데이터 값의 추출도 동일하게 수행하면 된다.

     

     

    Model Selection 모듈

    사이킷런의 model_selection 모듈은 학습 데이터와 테스트 데이터 세트를 분리하거나 교차 검증 분할 및 평가, 그리고 Estimator의 하이퍼 파라미터를 튜닝하기 위한 다양한 클래스를 제공한다.

     

    학습/테스트 데이터 세트 분리 - train_test_split()

    학습데이터와 테스트 데이터를 분리하지 않고 수행한다면, 정확도가 100%로 예측된다.

    이는 답을 알고 있는 상태에서 시험을 보는 것과 동일한 현상이다.

     

    따라서 예측을 수행하는 데이터 세트는 학습을 수행한 학습용 데이터 세트가 아닌 전용의 테스트 데이터 세트여야 한다.

    사이킷런의 train_test_split()을 통해 원본 데이터 세트에서 학습 및 테스트 데이터 세트를 쉽게 분리할 수 있다.

     

    train_test_split()은 첫 번째 파라미터로 피처 데이터 세트, 두 번째 파라미터로 레이블 데이터 세트를 입력받는다.

    그리고 선택적으로 다음 파라미터를 입력받는다.

    • test_size : 전체 데이터에서 테스트 데이터 세트 크기를 얼마로 샘플링할 것인가를 결정한다. 디폴트는 0.25이다.
    • train_size : 전체 데이터에서 학습용 데이터 세트 크기를 얼마로 샘플링할 것인가를 결정한다. test_size를 주로 사용하기 때문에 잘 사용되지 않는다.
    • shuffle : 데이터를 분리하기 전에 데이터를 미리 섞을지 결정한다. 디폴트는 True이다.
    • random_state : 호출할 때마다 동일한 학습/테스트용 데이터 세트를 생성하기 위해 주어지는 난수값이다. 이를 지정하지 않으면 수행할 때마다 다른 학습/테스트 용 데이터를 생성한다.
    • train_test_split의 반환값은 튜플 형태이다. 순차적으로 학습용 데이터의 피처 데이터 세트, 테스트용 데이터의 피처 데이터 세트, 학습용 데이터의 레이블 데이터 세트, 테스트용 데이터의 레이블 데이터 세트가 반환된다.

     

     

    교차 검증

    앞에서 알고리즘을 학습시키는 학습 데이터와 이에 대한 예측 성능을 평가하기 위한 별도의 테스트용 데이터가 필요하다고 하였다.

    하지만 이 방법 역시 과적합에 취약한 약점을 가질 수 있다.

    과적합은 모델이 학습 데이터에만 과도하게 최적화되어, 실제 예측을 다른 데이터로 수행할 경우에 예측 성능이 과도하게 떨어지는 것을 말한다.

     

    이러한 문제점을 개선하기 위해 교차 검증을 이용해 더 다양한 학습과 평가를 수행한다.

     

    교차 검증은 데이터 편중을 막기 위해서 별도의 여러 세트로 구성된 학습 데이터 세트와 검증 데이터 세트에서 학습과 평가를 수행하는 것이다.

    그리고 각 세트에서 수행한 평가 결과에 따라 하이퍼 파라미터 튜닝 등의 모델 최적화를 더욱 손쉽게 할 수 있다.

     

    대부분의 ML 모델의 성능 평가는 교차 검증 기반으로 1차 평가를 한 뒤에 최종적으로 테스트 데이터 세트에 적용해 평가하는 프로세스이다.

     

    ML에 사용되는 데이터 세트를 세분화해서 학습, 검증, 테스트 데이터 세트로 나눌 수 있다.

    테스트 데이터 세트 외에 별도의 검증 데이터 세트를 둬서 최종 평가 이전에 학습된 모델을 다양하게 평가하는 데 사용한다.

     

     

     

    K 폴드 교차 검증

    K 폴드 교차 검증은 가장 보편적으로 사용되는 교차 검증 기법이다.

    먼저 K개의 데이터 폴드 세트를 만들어서 K번만큼 각 폴드 세트에 학습과 검증 평가를 반복적으로 수행하는 방법이다.

     

    총 5개의 폴드 세트가 있다면, 5번의 학습과 검증 평가를 반복 수행한다.

     

    사이킷런에서는 K 폴드 교차 검증 프로세스를 구현하기 위해 KFold와 StratifiedKFold 클래스를 제공한다.

     

     

     

     

    Stratified K 폴드

    Stratified K 폴드는 불균형한 분포도를 가진 레이블 데이터 집합을 위한 K 폴드 방식이다.

    불균형한 분포도를 가진 레이블 데이터 집합은 특정 레이블 값이 특이하게 많거나 매우 적어서 값의 분포가 한쪽으로 치우치는 것을 말한다.

     

    Stratified K 폴드는 K 폴드가 레이블 데이터 집합이 원본 데이터 집합의 레이블 분포를 학습 및 테스트 세트에 제대로 분배하지 못하는 경우의 문제를 해결해 준다.

     

    이를 위해 Stratified K 폴드는 원본 데이터의 레이블 분포를 먼저 고려한 뒤 이 분포와 동일하게 학습과 검증 데이터 세트를 분배한다.

     

    Stratified K 폴드의 경우 원본 데이터의 레이블 분포도 특성을 반영한 학습 및 검증 데이터 세트를 만들 수 있으므로 왜곡된 레이블 데이터 세트에서는 반드시 Stratified K 폴드를 이용해 교차 검증해야 한다.

     

     

    교차 검증을 보다 간편하게 해주는 cross_val_score()

    사이깃 런은 교차 검증을 좀 더 편리하게 수행할 수 있게 해주는 API를 제공한다.

    대표적인 것이 cross_val_score()이다.

     

    KFold로 데이터를 학습하고 예측하는 코드는 다음과 같은 구조를 가진다.

    [ 1. 폴드 세트를 설정한다. ]

    [ 2. for 루프에서 반복으로 학습 및 테스트 데이터의 인덱스를 추출한다. ]

    [ 3. 반복적으로 학습과 예측을 수행하고 예측 성능을 반환한다.]

     

    cross_val_score()는 이런 일련의 과정을 한꺼번에 수행해주는 API이다.

     

     

     

    GridSearchCV - 교차 검증과 최적 하이퍼 파라미터 튜닝을 한번에

    사이킷런은 GridSearchCV API를 이용해 Classifier나 Regressor와 같은 알고리즘에 사용되는 하이퍼 파라미터를 순차적으로 입력하면서 편리하게 최적의 파라미터를 도출할 수 있는 방안을 제공한다.

     

    예를 들어 결정 트리 알고리즘의 여러 하이퍼 파라미터를 순차적으로 변경하면서 최고 성능을 가지는 파라미터 조합을 찾고자 한다면 파라미터의 집합을 만들고 이를 순차적으로 적용하면서 최적화를 수행할 수 있다.

     

     

    GridSearchCV는 교차 검증을 기반으로 하이퍼 파라미터의 최적 값을 찾게 해준다.

    즉, 데이터 세트를 cross-validation을 위한 학습/테스트 세트로 자동 분할한 뒤에 하이퍼 파라미터 그리드에 기술된 모든 파라미터를 순차적으로 적용해 최적의 파라미터를 찾을 수 있게 해준다.

     

    GridSearchCV는 사용자가 튜닝하고자 하는 여러 종류의 하이퍼 파라미터를 다양하게 테스트하면서 최적의 마라미터를 편리하게 찾게 해주지만 동시에 순차적으로 파라미터를 테스트하므로 수행시간이 상대적으로 오래 걸린다.

     

     

    다음 예제는 GridSearchCV API를 활용한 예제이다.

    학습 데이터와 테스트 데이터를 분리하고, 학습 데이터에서 GridSearchCV를 이용해 최적 하이퍼 파라미터인 max_depth와 min_damples_split의 값을 변화시키면서 최적화를 진행한다.

     

    테스트할 하이퍼 파라미터 세트는 딕셔너리 형태로 하이퍼 파라미터의 명칭은 문자열 Key 값으로, 하이퍼 파라미터의 값은 리스트 형으로 설정한다.

     

    학습 데이터 세트를 GridSearchCV 객체의 fit() 메서드에 인자로 입력한다.

    fit() 메서드를 수행하면 학습 데이터를 cs에 기술된 폴딩 세트로 분할해 param_grid에 기술된 하이퍼 파라미터를 순차적으로 변경하면서 학습/평가를 수행하고 그 결과를 cv_result_속성에 기록한다.

    여기에는 gridsearchcv의 결과 세트로서 딕셔너리 형태로 key 값과 리스트 형태의 value값을 가진다.

    cv_results_를 pandas의 DataFrame으로 변환하면 내용을 좀 더 쉽게 볼 수 있다.

     

    위의 결과에서 총 6개의 결과를 볼 수 있으며, 이는 하이퍼 파라미터 max_depth와 min_samples_split을 순차적으로 총 6번 변경하면서 학습 및 평가를 수행했음을 나타낸다.

     

    위 결과의 params 칼럼에는 수행할 때마다 적용된 하이퍼 파라미터 값을 가지고 있다.

     

    rank_test_score 칼럼 값을 보면 5번째와 6번째가 1이다.

    이는 예측 성능이 1위라는 의미이다.

     

     

     

    GridSearchCV객체의 fit()을 수행하면 최고 성능을 나타낸 하이퍼 파라미터의 값과 그 때의 평가 결과 값이 각각 best_params_, best_score_속성에 기록된다.

    즉, cv_results_의 rank_test_score가 1일때의 값이다.

     

    이 속성을 이용해 최적 하이퍼 파라미터의 값과 그 때의 정확도를 알아보면 다음과 같다.

    max_depth가 3, min_samples_split 2일 때 검증용 폴드 세트에서 평균 최고 정확도가 97.5%로 측정되었다.

    GridSearchCV 객체의 생성 파라미터로 refit=True가 디폴드값이다.

    refit=True이면 GridSearchCV가 최적 성능을 나타내는 하이퍼 파라미터로 Estimator를 학습해 best_estimator_로 저장한다.

     

    이미 학습된 best_estimator_ 를 이용해 앞에서 train_test_split()으로 분리한 테스트 데이터 세트에 대해 예측하고 성능을 평가하면 다음과 같다.

    별도의 테스트 데이터 세트로 정확도를 측정한 결과 약 96.67%의 결과가 도출되었다.

    일반적으로 학습 데이터를 GridSearchCV를 이용해 최적 하이퍼 파라미터 튜닝을 수행한 뒤에 별도의 세트에서 이를 평가나는 것이 일반적인 머신러닝 모델 적용 방법이다.

     

     

     

    데이터 전처리

    데이터 전처리는 ML 알고리즘만큼 중요하다.

    ML 알고리즘은 데이터에 기반하고 있기 때문에 어떤 데이터를 입력으로 가지느냐에 따라 결과도 크게 달라질 수 있다.

     

    사이킷런의 ML 알고리즘을 적용하기 전에 데이터에 대해 미리 처리해야 할 기본사항이 있다.

    결손값, 즉 NaN, Null 값은 허용되지 않는다.

     

    따라서 이러한 Null 값은 고정된 다른 값으로 변환해야 한다.

     

    Null값은 어떻게 처리해야 할지는 경우에 따라 다르다.

    피처 값 중 Null 값이 얼마 되지 않는다면 피처의 평균값 등으로 간단히 대체할 수 있다.

    하지만 Null 값이 대부분이라면 오히려 해당 피처는 드롭하는 것이 더 좋다.

     

    가장 결정이 힘든 부분은 Null 값이 일정 수준 이상 되는 경우이다.

    정확히 몇 퍼센트까지를 일정 수준이라고 할 기준은 없다. 하지만 해당 피처가 중요도가 높은 피처이고, Null을 단순히 피처의 평균값으로 대체할 경우 예측 왜곡이 심할 수 있다면 업무로직 등을 상세히 검토해 더 정밀한 대체 값을 선정해야 한다.

     

    사이킷런의 머신러닝 알고리즘은 문자열 값을 입력값으로 허용하지 않는다.

    모든 문자열 값은 인코딩하여 숫자 형으로 변환해야 한다.

     

    문자열 피처는 일반적으로 카테고리형 피처와 텍스트형 피처를 의미한다.

     

    카테고리형 피처는 코드값으로 표현하는 것이 더 이해하기 쉬울 것이다.

    텍스트형 피처는 피처 벡터화 등의 기법으로 벡터화하거나, 불필요하다면 삭제하는 것이 좋다.

     

    이러한 식별자 피처는 단순히 데이터 로우를 식별하는 용도로 사용되기 때문에 예측에 중요한 요소가 될 수 없드며 알고리즘을 오히려 더 복잡하게 만들고 예측 성능을 떨어뜨리기 때문이다.

     

     

     

    데이터 인코딩

    머신러닝을 위한 대표적인 인코딩 방식은 레이블 인코딩과 원-핫 인코딩이 있다.

     

    먼저 레이블 인코딩은 카테고리 피처를 코드형 숫자 값으로 변환하는 것이다.

    사이킷런의 레이블 인코딩은 LableEncoder 클래스로 구현하고, fit()과 transform()을 호출해 레이블 인코딩을 수행한다.

     

     

     

    레이블 인코딩

    레이블 인코딩은 간단하게 문자열 값을 숫자형 카테고리 값으로 변환한다.

    하지만 레이블 인코딩은 일괄적인 숫자 값으로 변환이 되면서 몇몇 ML 알고리즘에는 이를 적용할 경우 예측 성능이 떨어지는 경우가 발생할 수 있다.

    이는 숫자 값의 크고 작음에 대한 특성이 작용하기 때문이다.

    B가 A보다 크지만, 숫자로 변환했을 때 A가 1이 되고 B가 2가 된다면, A가 큰 상태가 되기 때문에 이 변환값은 단순한 코드이지 숫자 값에 따른 순서나 중요도로 인식돼서는 안된다.

     

    이러한 특성 때문에 레이블 인코딩은 선형회귀와 같은 ML 알고리즘에서는 적용하지 않아야 한다.

    트리계열의 ML 알고리즘은 숫자의 이러한 특성을 반영하지 않으므로 레이블 인코딩도 별 문제가 없다.

    위의 예제는 데이터가 작아서 문자열 값이 어떤 숫자로 인코딩 되었는지 직관적으로 알 수 있지만, 많은 경우에는 이를 알지 못한다. 이 경우에는 LabelEncoder 객체의 classes_속성값으로 확인하면 된다.

     

    또한 inverse_transform()을 통해 인코딩된 값을 다시 디코딩할 수 있다.

     

     

     

    원-핫 인코딩

    원-핫 인코딩은 피처 값의 유형에 따라 새로운 피처를 추가해 고유 값에 해당하는 칼럼에만 1을 표시하고 나머지 칼럼에는 0을 표시하는 방식이다.

    즉 행 형태로 되어 있는 피처의 고유 값을 열 형태로 차원을 변환한 뒤, 고유 값에 해당하는 칼럼에만 1을 표시하고 나머지 칼럼에는 0을 표시한다.

     

    원-핫 인코딩은 사이킷런에서 OneHotEncoder 클래스로 변환이 가능하다.

    단, LabelEncoder와 다르게 약간 주의할 점이 있다.

    입력값으로 2차원 데이터가 필요하다는 것과, OneHotEncoder를 이용해 변환한 값이 희소 행렬 형태이므로 이를 다시 toarray() 메서드를 이용해 밀집 행렬로 변환해야 한다는 것이다.

     

     

    판다스에는 원-핫 인코딩을 더 쉽게 지원하는 API가 있다.

    get_dummies()를 이용하면 된다.

    OneHotEncoder와 다르게 문자열 카테고리 값을 숫자형으로 변환할 필요 없이 바로 변환할 수 있다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

Designed by Tistory.