본문 바로가기
카테고리 없음

230328_DB복습

by 보랏 2023. 3. 28.

안녕하세요. 보랏입니다.

 

오늘은 어제에 이어서 로지스틱 회귀와

vscode로 docker를 실행하는 방법을 배웠습니다.

 

바로 복습시작하겠습니다.

 

 

1. 로지스틱 회귀 - 럭키백의 확률

  • 럭키백에 들어갈 수 있는 생선은 7개 입니다.
  • 럭키백에 들어갈 생선의 크기, 무게 등이 주어졌을 때 7개 생선에 대한 확률을 출력해야 합니다.
  • 이번에는 길이, 높이, 두께 외에도 대각선 길이와 무게도 사용할 수 있습니다.

 

  • 데이터 준비하기
import pandas as pd

fish = pd.read_csv('https://bit.ly/fish_csv')
fish.head()

print(pd.unique(fish['Species']))

  • 타깃 데이터에는 7개의 생선의 종류가 들어 있습니다. 타깃이 2개 이상의 클래스가 포함된 문제를 다중 분류(multi class claasification)이라고 부릅니다.
print(fish_input[:5])

fish_target = fish['Species'].to_numpy()

### 분류 모델
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)
  • K- 최근접 이웃 분류기의 확률 예측
from sklearn.neighbors import KNeighborsClassifier

kn = KNeighborsClassifier(n_neighbors=3)
kn.fit(train_scaled, train_target)

print(kn.score(train_scaled, train_target))
print(kn.score(test_scaled, test_target))

  • predict_proba() 메서드로 클래스별 확률값을 확인할 수 있습니다. 테스트 세트에 있는 처음 5개의 샘플에 대한 확률을 출력해보겠습니다.
import numpy as np

proba = kn.predict_proba(test_scaled[:5])
# decimal은 소수점 이하 자리수를 의미 
print(np.round(proba, decimals=4))

  • 4번째 값의 최근접 이웃의 클래스를 출력해보겠습니다.
  • 참고 : 2차원으로 데이터를 넘기기 위해서 3:4 슬라이싱을 사용했음

 

2. 로지스틱 회귀

  • 로지스틱 회귀(logistic regression)는 이름은 회귀지만 분류 모델입니다.
  • 이 알고리즘은 선형 회귀와 동일하게 선형 방정식을 학습합니다.

  • 여기에서 a, b, c, d, e는 가중치 혹은 계수입니다.
  • 특성은 늘어났지만 다중 회귀를 위한 선형 방정식으로 볼수 있습니다.
  • z는 어떤 값도 가능합니다. 하지만 확률이 되려면 0 ~ 1 사이 값이 되어야 합니다.
  • z가 아주 큰 음수일 때 0이 되고, z가 아주 큰 양수일 때 1이 되도록 시그모이드 함수(sigmoid function) 또는 로지스틱 함수(logstic function)을 사용하면 가능합니다.

  • 왼쪽의 식이 시그모이드 함수입니다.
  • 선형 방정식의 출력 z의 음수를 사용해 자연 상수 e를 거듭제곱하고 1을 더한 값의 역수를 취합니다.
  • z가 무한하게 큰 음수일 경우 이 함수는 0에 가까워지고, z가 무한하게 큰 양수가 될 때는 1에 가까워집니다.
  • z가 0일 될 때는 0.5가 됩니다. z가 어떤 값이 되더라도 절대로 0 ~ 1 사이의 범위를 벗어날 수 없습니다.
import numpy as np
import matplotlib.pyplot as plt

z = np.arange(-5, 5, 0.1)
phi = 1 / (1 + np.exp(-z))

plt.plot(z, phi)
plt.show()

3. 로지스틱 회귀로 이진 분류 수행하기

  • 넘파이 배열은 True, False 값을 전달하여 행을 선택할 수 있습니다.
  • 이를 불리언 인덱싱(boolean indexing)이라고 합니다.
char_arr = np.array(['A', 'B', 'C', 'D', 'E'])
print(char_arr[[True, False, True, False, False]])

-> ['A' 'C']

 

4. LogisticRegression 클래스

  • 훈련한 모델을 사용해 train_bream_smelt에 있는 처음 5개 샘플을 추출
  • predict_proba() 메서드를 사용하여 5개의 확률을 출력해 보겠습니다.
    • 어떤 클래스 값이 양성인지 확인
    • Bream -> 0
    • Smelt -> 1
print(lr.predict_proba(train_bream_smelt[:5]))

  • 로지스틱 회귀 모델이 학습한 방정식은 아래와 같습니다.

print(lr.coef_, lr.intercept_)

-> [[-0.4037798  -0.57620209 -0.66280298 -1.01290277 -0.73168947]] [-2.16155132]

 

5. 로지스틱 회귀로 다중 분류 수행하기

  • 다중 분류도 LogisticRegression 클래스를 기본적으로 반복적인 알고리즘을 사용합니다.
  • max_iter 매개변수에서 반복 횟수를 지정하며 기본값은 100입니다.
  • 반복 횟수가 부족하면 경고가 발생합니다.
  • LogisticRegression은 기본적으로 릿지 회귀와 같이 계수의 제곱을 규제합니다.
  • 이런 규제를 L2 규제라고 합니다.
  • 릿지 회귀에서는 alpha 매개변수로 규제의 양을 조절했습니다. alpha가 커지면 규제도 커집니다.
  • LogisticRegression에서 규제를 제어하는 매개변수는 C입니다. 하지만 C는 alpha와 반대로 작을수록 규제가 커집니다.
  • C의 기본값은 1입니다. 여기서는 규제를 조금 완화하기 위해 20으로 늘리겠습니다.
lr = LogisticRegression(C=20, max_iter=1000)
lr.fit(train_scaled, train_target)

print(lr.score(train_scaled, train_target)) --> 0.9327731092436975
print(lr.score(test_scaled, test_target)) --> 0.925
proba = lr.predict_proba(test_scaled[:5])
print(np.round(proba, decimals=3))

  • 다중분류일 경우 선형 방정식
lr.coef_

lr.intercept_

  • 다중 분류 클래스마다 z 값을 하나씩 계산합니다. 당연히 가장 높은 z 값을 출력하는 클래스가 예측 클래스가 됩니다.
  • 다중 분류는 소프트맥스(softmax) 함수를 사용하여 7개의 z값을 확률로 변환합니다.

  • decision_function() 메서드로 z1 ~ z7까지의 값을 구한 다음 소프트맥스 함수를 사용하여 확률로 변환하겠습니다.
decision = lr.decision_function(test_scaled[:5])
print(np.round(decision, decimals=2))

  • scipy는 소프트맥스 함수도 제공합니다.
  • axis=1로 지정하여 각 행, 즉 각 샘플에 대해 소프트맥스를 계산합니다.
  • 만약 axis 매개변수를 지정하지 않으면 배열 전체에 대해 소프트맥스를 계산합니다.
from scipy.special import softmax

proba = softmax(decision, axis=1)
print(np.round(proba, decimals=3))

6. docker 컨테이너 관리

  • sudo docker ps -a : 모든 컨테이너 출력
  • sudo docker ps -a -q : 모든 컨테이너 아이디 출력

  • sudo docker stop $(sudo docker ps -a -q) : 도커 스탑 후 변수로 지정

  • sudo docker rm $(sudo docker ps -a -q) : 도커 스탑 후 삭제

  • df -h : 현재 저장공간 확인

  • docker rmi ubuntu:22.04 : ubuntu22.04 이미지 파일 삭제

  • import subprocess - subprocess.call(["docker", "images"]) : 값을 저장할 수 있도록 사용

 

 

7. vscode에서 docker 실행환경 구축

  • vscode확장자에서 wsl를 설치후 mysql, docker 설치
  • vscode 새파일 열기 후 WSL : connect to wsl 확인 누르면 vscode에서 docker 연결
  • 터미널에서 새 터미널을 통해 docker환경에서 작업 가능
  • 탐색기에서 폴더열기에서 확인 누르면 현재 폴더에서 작업 진행

 

 

오늘은 이렇게 복습을 마무리하겠습니다.

당분간 공모전 준비로 인해 또 바빠질 거 같습니다.

 

감사합니다.