본문 바로가기

Dacon 파이썬 프로젝트

1112 LV3. 교차검증과 LGBM 모델을 활용한 와인 품질 분류하기

LV3. 교차검증과 LGBM 모델을 활용한 와인 품질 분류하기

1. EDA

(1) 파이썬 EDA 기초

    : 기본적인 데이터 불러오기, 데이터 정보 관측하기, 데이터 크기 파악하기 
      데이터 피쳐 알아보기

      1) read_csv() 메서드로 csv 파일을 Pandas DataFrame class로 불러오기
          df = pd.read_csv('경로')

      2) info() 메서드로 데이터의 피쳐수, 컬럼명, 결측치 여부, Dtype 정보 알 수 있음
         df.info()

      3) shape 속성 : 데이터의 행 개수, 열 개수 출력 가능
        df.shape

      4) head() 메서드 : 데이터 대략적 정보 파악
         df.head()

      [실습 코드]

      

(2) 파이썬 결측치 유무 확인하기 isnull().sum()

  : EDA 과정에서는 우선적으로 결측치 유무 파악 해야함

  df.isnull().sum()

  [실습 코드]

  

(3) 파이썬 수치데이터 특성 보기 (describe())

  desribe() : Dataframe의 각 열에 대해서 요약 수행
              -> 결측치는 제외하고 수치형 데이터에 한해 데이터 요약 수행
              count, mean, std, min, 1분위 수, 2분위 수, 3 분위수, max값 출력
 df.describe()

 [실습 코드]

 

(4) 파이썬 변수분포 시각화

    예측하고자 하는 변수인 종속변수(quality)의 분포 시각화
    -> matplotlib, seaborn 라이브러리로 시각화 출력 
    * 시각화 결과를 통해 머신러닝 방향성 설정 가능

    import matplotlib
    import matplotlib.pyplot as plt
    import seaborn as sns

    dfcopy = df.copy() //시각화 진행시 copy()로 복사본 생성 후 진행

    sns.distplot(df['피쳐명'],kde=True, bins=None)
    *df['피쳐명']: 출력하고자 하는 컬럼
    *kde : '그래프에 선을 출력할 지 여부'
    *bins : '출력할 막대그래프 개수'

    plt.axis(['x축 최솟값, x축 최댓값, y축 최솟값, y축 최댓값'])
    plt.title('제목')
    plt.show()

    [실습 코드] 

    

(5) 파이썬 Matplotlib 선 그래프 (plot())

    from matplotlib import pyplot as plt
    plt.plot(x,y)
    plt.show()


  [실습 코드] 

  

(6) 파이썬 Matplotlib 히스토그램 그리기

  히스토그램은 도수분포표를 그래프로 나타낸 것 -> 변수들의 분포정도를 볼 때 유용

  from matplotlib.pyplot as plt
  plt.hist(x,y)
  plt.show()

  [실습 코드] 

  

2. 전처리

(1) 파이썬 이상치 탐지

    데이터 중에서는 이상치(Outlier)가 존재하고 일반적인 패턴과 매우 다른 패던을 갖는 데이터
    -> 이상치 데이터는 모델의 성능을 크게 떨어트림
    -> IQR (Inter Quanatile Range) 사분위 편차를 이용하는 방법 사용

    import seaborn as sns
    sns.boxplot(data=train['fixed acidity'])

    [실습 코드]

    

(2) 파이썬 이상치 제거

    IQR를 통한 이상치 제거
    IQR : 3분위 수(75%에 위치한 값) - 1분위수(25%에 위치한 값)을 의미

    이전 실습에서의 boxplot의 4와 6사이의 실선보다 작고, 8과 10 사이의 실선보다
    큰 데이터를 이상치로 판단하고 제거

    #25%에 위치한 값 구하기
    quantile_25 = np.quantile(train['fixed acidity'],0.25)

    #75%에 위치한 값 구하기
    quantile_75 = np.quantile(train['fixed acidity'],0.75)

    #IQR 구하기
    IQR = quantile_75 - quantile_25

    #quantile_25보다 1.5*IQR 작은 값 구하기
    minimum = quantile_25 - 1.5*IQR

    #quantile_75보다 1.5*IQR 큰 값 구하기
    maximum = quantile_75 + 1.5*IQR

    #minimum 보다 크거나 같고, maximum 보다 작거나 같은 값만 추출
    train2 = train[(minimum<=train['fixed acidity'])&(train['fixed acidity']<=maximum)]

    [실습 코드]

    

(3) 파이썬 수치형 데이터 정규화

    의사결정 나무, 랜덤 포레스트 ->'트리기반 모델' : 대소 비교를 통해 구분, 숫자 단위에 크게 영향 받지 않음.
    Logistic Regression, Lasso ->'평활 함수 모델' : 숫자의 크기와 단위에 영향 받음

    수치형 데이터 정규화를 통해 모든 모델에 잘 어울리는 데이터 만듦
    -> **Min Max Scailing** 기법 : 가장 작은 값은 0, 가장 큰 값은 1로 만듦
                                    그 사이 값들은 비율에 따라 0~1 사이에 
                                    분포
                                    '이상치'에 민감하므로 상대적을 큰

값이나, 작은 값을 1이나 0 으로 만들기 때문에 문제 발생 가능

    [실습 코드] 

    

(4) 파이썬 원-핫 인코딩

  컴퓨터는 '문자'로 데이터를 학습할 수 없어 'type' 같은 피쳐들은 컴퓨터가
   읽어서 학습 할 수 있도록 인코딩 하는 과정 필요 

  One-Hot Encoding : '하나만 Hot하고, 나머지는 Cold한 데이터' 
                     자신에게 맞는 것은 1로, 나머지는 0으로 바꿈

  [실습 코드]

  

3. 모델링

(1) 파이썬 랜덤포레스트 정의

    RandomForest - 분류 모형
    : 어떤 그룹에 속할 지 예측하느 모형
    *RandomForest - 회귀 모형 : 집값, 주가, 시가 등 특정한 값을 맞추는 모형

    [실습 코드]
    from sklearn.ensemble import RandomForestClassifier

    random_forest = RandomForestClassifier()

(2) 파이썬 모델 랜덤포레스트 실습

  [실습 코드]

  

(3) 파이썬 교차 검증

  **Hold-out**
  : Train data를 (train, valid)라는 이름의 2개의 데이터로 나누는 작업
    예측 성능을 가늠해 보기 위해 train:valid = 8:2, 7:3 비율로 데이터

  -Hold-out 문제점은 데이터의 낭비 -> solution

  **교차검증**

  K-Fold : 모든 데이터를 최소한 한 번씩 다 학습하게 하는 것 
           -> valid 데이터를 겹치지 않게 나누어 N개의 데이터셋을 만듦

  [실습 코드]

  

(4) 파이썬 교차 검증 실습

1. K-Fold를 이용해서 Train과 Valid Data 나누기
2. Model 이용해서 train 데이터 학습
3. Model 이용해서 valid 데이터 예측해 성능 확인
4. Model 이용해서 test 데이터 예측
5. n_splits를 5로 설정하면 5개의 결과값들에 대한 '최빈값'을 이용해 가장 등장할 가능성이 높은 결과값으로 결정
6. 결과 제출

[실습 코드] 

4. 튜닝

(1) Bayesian Optimization

    하이퍼 파라미터 튜닝 Grid Search, Random Search
    -> 최적의 값을 찾아 갈 수 없는 문제점

    **Bayesian Optimization**
    1. 'Gausain Process'라는 통계학 기반으로 만들어진 모델
    2. 여러개의 하이퍼 파라미터들에 대해
    3. Aquisition Function을 적용했을 때
    4. 가장 큰 값이 나올 확율이 높은 지점 찾음

    *Bayesian Optimization 과정
    1. 변경할 하이퍼 파라미터의 범위 설정
    2. Bayesian Optimization 패키지를 통해, 하이퍼 파라미터의 범위 속 값들을 랜덤하게 가져옴
    3. 처음 R번은 랜덤하게 좌표를 꺼내 성능 확인
    4. 이후 B번은 Bayesian Optimization을 통해 B번 만큼 최적의 값 찾음

    [실습 코드]
    pip install bayesian-optimization
    from bayes_opt import BayesianOptimization

(2) 파이썬 그리드, 랜덤 서치, Bayesian

  <하이퍼 파라미터의 3가지 튜닝 방법 비교>

  1.Grid Search

    
기법 : Grid Search는 사전에 탐색할 값들을 미리 지정하고 그 값들의 모든 조합을 바탕으로 성능의 최고점을 찾음 장점 : 내가 원하는 범위를 정확하게 비교 분석 가능 단점 : 시간이 오래걸림, 성능의 최고점이 아닐 가능성이 높다. "최적화 검색" (여러개들을 비교 분석해서 최고를 찾아내는 기법)이지, "최적화 탐색"(성능이 가장 높은 점으로 점차 찾아가는 기법)이 아님 2. Random Search
기법 : 사전에 탐색할 값들의 범위를 지정하고, 그 범위 속에서 가능한 조합을 바탕으로 최고점을 찾음. 장점 : Grid Search에 비해 시간이 짧게 걸림,Grid Search보다, 랜덤하므로 성능이 더 좋은 점으로 갈 가능성이 높음 단점 : 반대로 성능이 Grid Search보다 낮을 수 있음. 하이퍼 파라미터의 범위가 너무 넓으면, 일반화된 결과가 나오지 않음. seed를 고정하지 않으면, 할 때 마다 결과가 달라진다. "최적값 검색"의 느낌이지, "최적화 탐색"의 개념이 아님 3. Bayesian Optimization
기법 : 하이퍼파라미터의 범위를 지정한 후, Random하게 R 번 탐색한 후, B번 만큼 최적의 값을 찾음 장점 : 정말 "최적의 값"을 찾을 수 있음, 상대적으로 시간이 덜 걸림 엔지니어가 그 결과값을 신뢰할 수 있음. 단점 : Random하게 찍은 값이 달라질 경우, 최적화 하는데 오래 걸림 Random하게 찍은 값이 부족하면, 최적의 값을 탐색하는게 불가능 Random하게 찍은 값이 너무 많으면, 최적화 이전에 이미 최적값 가질 수 있음 Bayesian Optimization은 수동적으로 하이퍼 파라미터를 튜닝하는데 좋음.

(3) Bayesian Optimization 실습

[실습 코드] 

출처 : https://dacon.io/competitions/open/235698/talkboard/403458?page=1&dtype=recent