ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 확률적 경사 하강법 (+ 로지스틱 회귀)
    머신러닝(+딥러닝) 2023. 8. 8. 17:43

    문제

    혼공머신 04-2: 생선의 weight, length, diagonal(대각선 길이), height, width 가 주어졌을때, 7가지(species) 생선중 어떤 생선일지를 맞춰보라. 

     

    코드

    fish 데이터 준비

    import pandas as pd
    
    fish = pd.read_csv('https://bit.ly/fish_csv_data')
    fish

     

    Input 데이터와 target 데이터 준비

    fish_input = fish[['Weight', 'Length', 'Diagonal', 'Height', 'Width']].to_numpy()
    fish_target = fish['Species'].to_numpy()

     

    training 세트와 test 세트로 나누기

    from sklearn.model_selection import train_test_split
    
    train_input, test_input, train_target, test_target = train_test_split(
        fish_input, fish_target, random_state=42
    )

     

    데이터 정규화

    from sklearn.preprocessing import StandardScaler
    
    ss = StandardScaler()
    ss.fit(train_input)
    train_scaled = ss.transform(train_input)
    test_scaled = ss.transform(test_input)

     

    모델 훈련

    loss='log_loss' 로 loss function 을 로지스틱 손실 함수로 지정한다. (default 는 'hinge' loss 로 support vector machine 이라 불림) max_iter 값에 따라 over-fitting 또는 under-fitting 이 될 수 있는데, 조금 있다 살펴보자.

    from sklearn.linear_model import SGDClassifier
    
    sc = SGDClassifier(loss='log_loss', max_iter=10, random_state=42)
    sc.fit(train_scaled, train_target)
    
    sc.score(train_scaled, train_target)  # 0.773109243697479
    sc.score(test_scaled, test_target)  # 0.775

     

    훈련시 반복횟수(max_iter) 가 10 으로 작은것 같다. 에포크를 한번더 실행해 보자

    에포크를 한번 더 실행하면, 아래에서 처럼 score 값이 올라간 것을 확인할 수 있다.

    sc.partial_fit(train_scaled, train_target)
    
    sc.score(train_scaled, train_target)  # 0.8151260504201681
    sc.score(test_scaled, test_target)  # 0.85

     

    훈련에 사용할 좀더 나은 max_iter 값을 찾아보자

    epoch 를 0 에서 부터 300번 까지 순차적으로 수행하기 위해 partial_fit() 을 사용했고, 이때 classes 파라미터 값 지정이 필요하다.

    import numpy as np
    
    sc = SGDClassifier(loss='log_loss', random_state=42)
    train_score = []
    test_score = []
    
    classes = np.unique(train_target)
    
    for _ in range(0, 300):
        sc.partial_fit(train_scaled, train_target, classes=classes)
        train_score.append(sc.score(train_scaled, train_target))
        test_score.append(sc.score(test_scaled, test_target))
    
    import matplotlib.pyplot as plt
    
    plt.plot(train_score)
    plt.plot(test_score)
    plt.xlabel('epoch')
    plt.ylabel('accuracy')
    plt.show()

     

    좀더 나은 max_iter 값으로 최종 훈련을 하자

    위의 그래프를 봤을 때 max_iter=100 이면 적당한 것 같다. SGDClassifier 는 일정 에포크 동안 성능이 향상되지 않으면 더 이상 훈련하지 않고 자동으로 멈추는데, tol=None 으로 지정해 무조건 max_iter=100 만큼 반복하도록 한다.

    from sklearn.linear_model import SGDClassifier
    
    sc = SGDClassifier(loss='log_loss', max_iter=100, tol=None, random_state=42)
    sc.fit(train_scaled, train_target)
    
    sc.score(train_scaled, train_target)  # 0.957983193277311
    sc.score(test_scaled, test_target)  # 0.925

     

    최종 모델로 예측해 보기

    test 데이터 맨위의 5개 레코드에 대해 예측해 본다.

    sc.predict(test_scaled[:5])  # Perch Smelt Pike Perch Perch
    
    proba = sc.predict_proba(test_scaled[:5])
    np.round(proba, decimals=3)

     

    sc.classes_

     

     

    참고

    • 로지스틱 회귀(logistic regression) 는 이름은 회귀이지만 분류 모델이다. SGDClassifier 는 확률적 경사 하강법을 사용한 분류 모델을 만든다.
    • SGDRegressor 는 확률적 경사 하강법을 사용한 회귀 모델을 만든다.

    '머신러닝(+딥러닝)' 카테고리의 다른 글

    랜덤 포레스트 & 랜덤 서치  (0) 2023.08.10
    릿지 회귀  (0) 2023.08.08
    sklearn 으로 학습한 모델을 파일로 저장하기  (0) 2023.08.08

    댓글

Designed by Tistory.