제5장 배움과 요령 훈련(3) 관련 이미지

제5장 배움과 요령 훈련(3)

– 로지스틱 회귀의 규칙 적용

1. 그래디언트 업데이트 공식에 페널티 항목 반영

def __init__(self, learning_rate=0.1, l1=0, l2=0):
  self.w = None
  self.b = None
  self.losses = ()
  self.val_losses = ()
  self.w_history = ()
  self.lr = learning_rate
  self.l1 = l1
  self.l2 = l2

2. fit() 메서드에서 역 계산을 수행할 때 그래디언트에 페널티 항의 도함수를 추가합니다.

def fit(self, x, y, epochs=100, x_val=None, y_val=None):
  self.w = np.ones(x.shape(1))               # 가중치를 초기화합니다.
  self.b = 0                                 # 절편을 초기화합니다.
  self.w_history.append(self.w.copy())       # 가중치를 기록합니다.
  np.random.seed(42)                         # 랜덤 시드를 지정합니다.
  for i in range(epochs):                    # epochs만큼 반복합니다.
      loss = 0
      # 인덱스를 섞습니다
      indexes = np.random.permutation(np.arange(len(x)))
      for i in indexes:                      # 모든 샘플에 대해 반복합니다
          z = self.forpass(x(i))             # 정방향 계산
          a = self.activation(z)             # 활성화 함수 적용
          err = -(y(i) - a)                  # 오차 계산
          w_grad, b_grad = self.backprop(x(i), err) # 역방향 계산
          # 그래디언트에서 페널티 항의 미분 값을 더합니다
          w_grad += self.l1 * np.sign(self.w) + self.l2 * self.w
          self.w -= self.lr * w_grad         # 가중치 업데이트
          self.b -= self.lr * b_grad         # 절편 업데이트
          # 가중치를 기록합니다.
          self.w_history.append(self.w.copy())
          # 안전한 로그 계산을 위해 클리핑한 후 손실을 누적합니다
          a = np.clip(a, 1e-10, 1-1e-10)
          loss += -(y(i)*np.log(a)+(1-y(i))*np.log(1-a))
      # 에포크마다 평균 손실을 저장합니다
      self.losses.append(loss/len(y) + self.reg_loss())
      # 검증 세트에 대한 손실을 계산합니다
      self.update_val_loss(x_val, y_val)

3. 로지스틱 손실 함수 계산에 페널티 항 추가

def reg_loss(self):
  return self.l1 * np.sum(np.abs(self.w)) + self.l2 / 2 * np.sum(self.w**2)

4. 검증 세트의 손실을 계산하는 update_val_loss() 메서드에서 reg_loss()를 호출하도록 수정

def update_val_loss(self, x_val, y_val):
  if x_val is None:
      return
  val_loss = 0
  for i in range(len(x_val)):
      z = self.forpass(x_val(i))     # 정방향 계산
      a = self.activation(z)         # 활성화 함수 적용
      a = np.clip(a, 1e-10, 1-1e-10)
      val_loss += -(y_val(i)*np.log(a)+(1-y_val(i))*np.log(1-a))
  self.val_losses.append(val_loss/len(y_val) + self.reg_loss())

5. L1 규칙을 암 데이터세트에 적용

l1_list = (0.0001, 0.001, 0.01)

for l1 in l1_list:
    lyr = SingleLayer(l1=l1)
    lyr.fit(x_train_scaled, y_train, x_val=x_val_scaled, y_val=y_val)
    
    plt.plot(lyr.losses)
    plt.plot(lyr.val_losses)
    plt.title('Learning Curve (l1={})'.format(l1))
    plt.ylabel('loss')
    plt.xlabel('epoch')
    plt.legend(('train_loss', 'val_loss'))
    plt.ylim(0, 0.3)
    plt.show()
    
    plt.plot(lyr.w, 'bo')
    plt.title('Weight (l1={})'.format(l1))
    plt.ylabel('value')
    plt.xlabel('weight')
    plt.ylim(-4, 4)
    plt.show()


제5장 배움과 요령 훈련 관련 대표 이미지


제5장 배움과 요령 훈련 관련 이미지


제5장 배움과 요령 훈련 관련 이미지

layer5 = SingleLayer(l1=0.001)
layer5.fit(x_train_scaled, y_train, epochs=20)
layer5.score(x_val_scaled, y_val)

##출력: 0.989010989010989

6. L2 규칙을 암 데이터세트에 적용

l2_list = (0.0001, 0.001, 0.01)

for l2 in l2_list:
    lyr = SingleLayer(l2=l2)
    lyr.fit(x_train_scaled, y_train, x_val=x_val_scaled, y_val=y_val)
    
    plt.plot(lyr.losses)
    plt.plot(lyr.val_losses)
    plt.title('Learning Curve (l2={})'.format(l2))
    plt.ylabel('loss')
    plt.xlabel('epoch')
    plt.legend(('train_loss', 'val_loss'))
    plt.ylim(0, 0.3)
    plt.show()
    
    plt.plot(lyr.w, 'bo')
    plt.title('Weight (l2={})'.format(l2))
    plt.ylabel('value')
    plt.xlabel('weight')
    plt.ylim(-4, 4)
    plt.show()


제5장 배움과 요령 훈련 관련 이미지


제5장 배움과 요령 훈련 관련 이미지


제5장 배움과 요령 훈련 관련 이미지

layer6 = SingleLayer(l2=0.01)
layer6.fit(x_train_scaled, y_train, epochs=50)
layer6.score(x_val_scaled, y_val)


##출력: 0.989010989010989

7. SGDClassifier에서 규칙 사용

sgd = SGDClassifier(loss="log", penalty='l2', alpha=0.001, random_state=42)
sgd.fit(x_train_scaled, y_train)
sgd.score(x_val_scaled, y_val)


##출력: 0.978021978021978
반응형


5-4 교차 검증, Scikit-Learn으로 해보세요

– 교차 검증의 원리


제5장 배움과 요령 훈련 관련 이미지


제5장 배움과 요령 훈련 관련 이미지

– k-겹 교차 검증 구현

훈련 세트를 동일한 크기의 k개의 접기로 나누고 각 접기를 검증 세트로 사용하고 나머지 접기를 훈련 세트로 사용하는 과정을 k번 반복하여 모델을 구축하고 평가합니다.

1. 트레이닝 세트 사용

validation_scores = ()

2. k-겹 교차 검증 구현

k = 10
bins = len(x_train_all) // k

for i in range(k):
    start = i*bins
    end = (i+1)*bins
    val_fold = x_train_all(start:end)
    val_target = y_train_all(start:end)
    
    train_index = list(range(0, start))+list(range(end, len(x_train_all)))
    train_fold = x_train_all(train_index)
    train_target = y_train_all(train_index)
    
    train_mean = np.mean(train_fold, axis=0)
    train_std = np.std(train_fold, axis=0)
    train_fold_scaled = (train_fold - train_mean) / train_std
    val_fold_scaled = (val_fold - train_mean) / train_std
    
    lyr = SingleLayer(l2=0.01)
    lyr.fit(train_fold_scaled, train_target, epochs=50)
    score = lyr.score(val_fold_scaled, val_target)
    validation_scores.append(score)

print(np.mean(validation_scores))


##출력: 0.9777777777777779

훈련 데이터의 정규화 전처리는 분할 및 폴딩 후에 수행됩니다. -> 폴드를 분할하기 전에 전체 교육 데이터를 전처리하면 유효성 검사 폴드에서 정보가 누출됩니다.


제5장 배움과 요령 훈련 관련 이미지

– Scikit-Learn을 통한 교차 검증

1. cross_validate() 함수로 교차 검증 점수 계산

from sklearn.model_selection import cross_validate
sgd = SGDClassifier(loss="log", penalty='l2', alpha=0.001, random_state=42)
scores = cross_validate(sgd, x_train_all, y_train_all, cv=10)
print(np.mean(scores('test_score')))

##출력: 0.850096618357488

– 전처리 단계를 포함한 교차 검증 수행

Pipeline 클래스를 사용하여 교차 검증 수행

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
pipe = make_pipeline(StandardScaler(), sgd)
scores = cross_validate(pipe, x_train_all, y_train_all, cv=10, return_train_score=True)
print(np.mean(scores('test_score')))


##출력: 0.9694202898550724
print(np.mean(scores('train_score')))


##출력: 0.9875478561631581

내용을 학습하고 정리하는 내용입니다.

Similar Posts

  • “근로시간 보완은 MZ 의견 반영”…”주 52시간 안주하고 일해야”

    주 아이젠 기자 | 조권형 기자 | 전주영 기자 입장 2023-03-17 03:002023-03-17 03:20에 업데이트됨 정부, 주 50시간 초과근무 요구고용노동부 ‘상한선까지 다 볼 것’MZ노조 ‘무료야근 허용하는 회사와 문제’민주노총, ‘개혁안 전면 폐지’ 촉구 15일 여당 국회 환경노동위원회 린쯔쯔(林子子) 간사장(왼쪽)이 서울 영등포구 국회의사당에서 MZ노조 간부들과 간담회를 갖고 관련 논의를 하고 있다. 근로시간 개편안. 유준환 위원장과 송시영 노동위원회 부위원장이…

  • 변경 이유 및 방법

    변화는 삶의 불가피한 부분입니다. 개인 생활, 경력 또는 주변 세계의 변화에 ​​관계없이 조정이 어려울 수 있습니다. 그러나 변화를 수용하는 법을 배우는 것은 개인의 성장과 성공으로 이어질 수 있습니다. 이 블로그 게시물에서는 변화를 수용해야 하는 이유와 변화를 실현하는 방법을 살펴봅니다. 변화를 통해 지금 고민하고 있는 질문에 대한 답을 찾을 수 있습니다. 변화를 수용해야 하는 이유 개인적…

  • 반차오 맛집 추천 – 맛있는 커피 데켄트 (동반차오 백현동 커피거리)

    Banqiao에는 레스토랑과 카페가 생겨나고 있습니다.반차오 현대백화점이 문을 열면서 한때 부진했던 주변 상권이 회복되기 시작했다. 카카오, 네이버, 삼성sds 등 많은 기업들이 속속 입주했기 때문일 것이다. 오늘은 집에서 가까운 판교동 백현동에 위치한 판교에 새로 오픈한 카페를 소개할게요. 카페 이름은 De Kent입니다. 반차오 백현 카페거리 끝자락에 새롭게 오픈한 카페입니다.아들과 산책하다가 발견하고 오픈하자마자 방문했습니다.이제 정식 오픈해서 많은 고객님들께서 찾아주시고…

  • 머위의 10가지 이점

    머위는 국화과의 다년생 식물로 보통 봄에 꽃이 피고 어린잎이 나오기 시작합니다. 버터버는 다양한 용도로 사용되며 한국에서는 전통적으로 야채 요리나 랩의 토핑으로 사용됩니다. 이 기사에서는 머위의 다양한 이점과 섭취 방법에 대해 알아봅니다. 머위효과 1. 식이요법 머위는 칼로리가 낮고 식이섬유가 풍부하여 체중 감량에 도움이 됩니다. 머위의 유효성분인 폴리페놀은 체지방을 분해하고 신진대사를 촉진하여 효과적으로 체중을 감소시킵니다. 머위 효과…

  • 2023년 3월 16일

    35 등 35 삼두근 특별한 일을 하는 것 같지는 않은데도 요즘은 시간이 꽤 잘 가는 것 같다. 내가 다른 일을 많이 해서 그런가? 아무리 바빠도 이 운동은 계속 할 것이다. 정신을 차리려고 노력하고 있는데 시간이 점점 짧아지고 있습니다. 심리적인 편안함도 있는데 한 포즈에 70번 정도 하고 그다음에 두 포즈로 나눠서 하는 게 가장 큰 영향을…