7/2 Today I Learned -1

boks·2024년 7월 2일
post-thumbnail

📖 학습한 내용

  • 와인 품질 예측 모델 생성
  • 활성화함수
  • 비용함수
  • 역전파
  • 경사하강법
  • 옵티마이저

📖 핵심내용

📌 와인 품질 예측 모델 생성

데이터 확인 및 EDA

  • 데이터 파악

    -> 결측치 없는 것을 확인
    -> 피처들은 와인의 성분이나 특징들을 나타내고 있고, 타겟 제외하고는 숫자형데이터가 맞는 것을 확인

  • 타겟 속성 변경 및 파악


    - 범주형-순서형데이터인 것을 확인 -> 라벨인코더 사용 예정
    - 종속변수가 대략 정규분포를 따르는 것 같다는 것 확인

타겟과 피처들 관계 시각화로 파악

  • 박스 플랏

    -> 바운더리를 넘어가는 데이터가 많은 것을 확인
    -> 매우 큰 특징을 보여주는 데이터가 없어 보인다.

  • 각 피처들의 스케터 플랏으로 타겟의 군집 확인

    -> 5점과 6점이 서로 뭉쳐있는 경향을 확인
    -> 이외에 딱히 어떤 경향이나 군집은 찾기 어려워보인다.

  • 히트맵으로 상관관계 파악

    -> 눈에 띄는 것은 'alcohol', 'density' 두컬럼이 서로 어느정도 상관관계가 있다는 것
    -> 이외에 상관관계에서 특이점은 없어보인다.

전처리

  • 이상치 제거
def remove_outliers(df, column, threshold=1.5):
    """
    주어진 열에서 IQR을 기준으로 이상치를 제거하는 함수
    """
    Q1 = df[column].quantile(0.25)
    Q3 = df[column].quantile(0.75)
    IQR = Q3 - Q1
    
    # IQR 범위 내에 있는 데이터만 선택
    df_filtered = df[(df[column] >= Q1 + (-1 * threshold) * IQR) & (df[column] <= Q3 + threshold * IQR)]
    return df_filtered

워낙 많은 데이터가 이상치에 포한되어서 IQR의 2.5배 바운더리 바깥의 값들 제거

  • 약한 상관관계 제거

    0.05 이하의 값은 머신러닝에 방해가 될 것으로 추정되므로 제거하였다.

인코딩 및 스케일링

모델에 넣기 전에 최종

  • 범주형 인코딩
le = LabelEncoder()
le.fit_transform(df_remove_outliner['quality'])
y = le.fit_transform(df_wine_predic['quality'])
np.unique(y, return_counts=True)
  • 스케일링
    이상치가 꽤 있어서 로버스트 스케일링 고려했지만, 효과가 미미하여서 스텐다드스케일링 사용
ss = StandardScaler()
train_X_sc = ss.fit_transform(df_remove_outliner[df_remove_outliner.columns[:-1]])
test_X_sc = ss.transform(test_X)

모델 생성

  • 그리드서치 - 랜덤포래스트
params = {
    'max_depth' : [None, 2,3,4],
    'n_estimators' : [50, 100, 150, 200],
    'max_features' : ["sqrt", "log2", None, 0.5],
    
}

model_rf = RandomForestClassifier(random_state=13, n_jobs=-1, oob_score=True)
grid_cv = GridSearchCV(model_rf, param_grid=params, cv=3, n_jobs=-1)
grid_cv.fit(train_X_sc, train_Y_ed)

print(grid_cv.best_estimator_)

  • 최적파라미터로 랜덤포래스트 모델 실행
rf_clf_best = grid_cv.best_estimator_
rf_clf_best.fit(train_X_sc, train_Y_ed)

pred_rf = rf_clf_best.predict(test_X_sc)
accuracy_score(test_Y, pred_rf)
# 결과는 테스트 데이터의 정확도

  • 베스트 피처 선정하여 다시 돌려보기

    -> 결과는 비슷하다.

📌 활성화함수

  • 은닉노드와 출력 노드에 존재, 해당 노드에 입력된 값을 변환하여 출력하는 역할 수행

  • 활성화함수의 역할
    비선형함수 - 독립변수와 종속변수 간에 존재할 수 있는 비선형 관계를 파악하기 위함
    선형함수는 아무리 사용해도 선형이다.

  • 출력노드의 활성화 함수
    회귀문제: 없음 (또는 항등함수)
    분류문제: 보통 소프트맥스 함수 사용

  • 은닉노드의 활성화 함수


    -> 많은 종류가 있으나 ReLU 함수를 많이 쓴다
    - 이유 1 : 시그모이드, 하이퍼볼릭 탄젠트는 좌우로 값이 커지면 기울기 소실이 일어난다. -> 층을 거쳐서 역전파 될때마다 가중치의 변화가 없어짐

    • 이유 2 : 빠르다. 0 이상이면 값 그대로 나가고, 0 이하면 0으로 출력하므로, 안그래도 양이 많아서 처리할게 많은 딥러닝에서 시간적 효율성을 준다.

📌 비용함수

  • 신경망의 예측이 실제 데이터와 얼마나 잘 일치하는지를 측정하는 데 사용

  • 모델 최적화
    학습 과정은 비용 함수의 값을 최소화하기 위해 가중치와 편향을 조정하는 과정
    결론적으로 학습은 비용함수 줄이기다.

  • 비용함수 종류
    - 분류 문제
    교차 엔트로피

    	- 회귀 문제

    평균 제곱 오차

    -> 왜 절대값을 하지않고 제곱을 하는가?
    -> 오차의 값을 부각시켜서 더 빠르게 학습시킬 수 있고, 연산 속도가 빠르다

  • 이외의 비용함수 (회귀)

  • 이외의 비용함수 (분류)

  • 비용함수 정리
    문제의 종류에 따라 구분(회귀, 분류)
    실제의 종속변수 값과 모형을 통한 예측치로 구성(라벨과, 예측값의 차이)
    출력노드에서 출력된 값
    - 회귀 : 종속변수 값의 예측치 출력
    - 분류 : 종속변수가 특정한 값을 갖을 확률

📌 역전파

  • 계산된 오차는 출력층에서부터 입력층 방향으로 역전파 되어 각 가중치가 오차에 얼마나 기여하는지 계산
  • 체인룰을 사용해서 각각의 입력값이 상위의 출력값의 미분을 구한다.

  • 역전파 과정 (딥러닝 프로세스)

  1. 순전파
    • 순차적으로 계산되면서 결국에는 출력층에서 예측값 생성
  2. 손실계산
    • 예측값과 실제값(타깃) 사이의 오차 계산
    • 모델 성능을 수치적으로 평가
    • 위에서 배울 대로 손실함수를 사용
  3. 오류역전파
    • 손실 함수로부터 계산된 오차를 출력층에서부터 입력층 방향으로 역전파
  4. 가중치 업데이트
    • 각 가중치로 손실함수를 편미분한 값을 이용해서, 옵티마이저로 최적화 과정
    • 결국 손실함수 최소화 시도

📌 경사하강법


-> 손실함수에 대한 각가중치의 편미분 값에 학습률을 곱하여, 가중치의 오차를 줄여나감
-> 배치사이즈와 학습률에 영향을 받음

  • 학습률

    -> 학습률이 작으면 수렴까지 오래걸림. 에포크가 충분하지 못하면 수렴못한다.
    -> 학습률이 크면 진동이 심해서 발산할 수 있다.

  • 로컬미니멈, 안장지점
    피처가 하나 추가될때마다, 손실함수의 차원수가 1개씩 늘어난다.
    따라서 각각의 피처마다 편미분의 값이 최소점을 가지는데, 함수가 복잡하다면 로컬 미니멈에 빠질 수 있다.

📌 옵티마이저

  • 손실 함수의 기울기(gradient)를 계산, 이를 사용하여 모델의 가중치 업데이트

  • 종류

📖 흥미로운 점 / 새로 알게된 점

  • 손실함수(loss function) vs 비용함수(cost function)
    하나하나 말할때는 손실함수, 전체적으로 말할때는 비용함수
    -> 근데 거의 세미나에서나 구분짓지, 보통 정확하게 구분지어 말하지 않는다.

📖 어려운 부분

  • 바이어스는 활성화함수에 들어가는게 아닌지?

profile
설계엔지니어의 변신

0개의 댓글