본문 바로가기

카테고리 없음

내일배움캠프 | 25일차 : 강의 학습 | 머신러닝 기초 2

01. 2주차 오늘 배울 것

1) 논리 회귀 : 머신러닝에서, 입력값과 범주 사이의 관계를 구하는 것

2) 전처리

 

 

논리 회귀(Logistic regression / sigmoid function)

선형 회귀로 풀기 힘든 문제 때문에 등장.

 

선형회귀인데 sigmoid를 사용해서 0~1 사이 값이 나오도록 만든것

 

출력값은 0~1 사이

0.8이면 80%확률이라고 봄

 

CroddEntropy함수: 논리 회귀의 손실 함수로서, 확률분포그래프의 차이를 줄여 주는 것

 

"결국 선형회귀와 같지만, 손실함수에서 나온 값을 최소화하는 방향으로 학습을 시켜야 하고,

논리 회귀에서는 확률분포그래프를 그릴 수 있는데 확률분포그래프의 차이를 줄이는 방향으로

학습을 시킨다. 그 차이를 줄이는 손실함수가 크로스엔트로피."

 

Keras에서 이진 논리 회귀의 경우 binary_crossentropy 손실 함수를 사용합니다!

 

sigmoid를 사용해서 값을 0~1 사이로 만들고 crossentropy를 이용해서 정답값과의 차이를 줄여줌

 

 

 

 

 

다항 논리 회귀 (Multinomial logistic regression)

ex.대학교 시험 전 날 공부한 시간을 가지고 해당 과목의 성적(A, B, C, D, F)을 예측하는 문제

 

원핫 인코딩: 컴퓨터가 이해하기 쉬운 형태로 만들어주는 방법으로서 다항 논리 회귀를 풀 때 필요한 것

0,1로만 표현

  1. 클래스(라벨)의 개수만큼 배열을 0으로 채운다.
  2. 각 클래스의 인덱스 위치를 정한다.
  3. 각 클래스에 해당하는 인덱스에 1을 넣는다.

항이 여러개이기 때문에 sigmoid가 아닌 softmax를 사용함

 

Softmax는 선형 모델에서 나온 결과(Logit)를 모두가 더하면 1이 되도록 만들어주는 함수

다 더하면 1이 되도록 만드는 이유는 예측의 결과를 확률(=Confidence)로 표현하기 위함

결과에 가중치를 부여하는 방법

 

 

결과값에 가중치를 부여해서 그래프를 그린 후 크로스앤트로피로 정답값과 차이를 최소화함

 

softmax를 사용해서 전체 클래스의 값의 합을 1 사이로 만들고 crossentropy를 이용해서 정답값과의 차이를 줄여줌

 

Keras에서 다항 논리 회귀의 경우 categorical_crossentropy 손실 함수를 사용합니다!

 

 

# 다양한 머신러닝 모델

Support vector machine (SVM) : 구분선을 잘 긋는 방법

 

구분하는 문제를 푸는 것은 분류 문제(Classification problem)이고 분류 문제를 푸는 모델을 분류기(Classifier)라고 부릅니다

어떻게 그려야 잘 구분할 수 있을까요? 그래서 우리는 이 선과 고양이, 강아지 간의 거리를 계산함

가장 각 고양이, 강아지 간의 거리가 최대가 되는 직선을 그림

그것이 svm

그린 선(벡터)를 Support vector라고 부릅니다. 그리고 그 벡터의 거리를 Margin이라고 부르죠. 우리는 Margin이 넓어지도록 이 모델을 학습시켜야함

예외상황 발생 시 Feature(특성)의 개수를 늘려서 학습(차원 업)

 

k-Nearest neighbors (KNN) : 개체(k)의 개수를 정해서 대상과 가장 가까운 k개의 피대상이 어느 속하는가로 확인하는 군집화 알고리즘

 

Decision tree (의사결정나무) : 스무고개와 같은 방식으로 예, 아니오를 반복하며 추론하는 방식

 

 

 

전처리(Preprocessing) : 넓은 범위의 데이터 정제 작업

- 필요없는 데이터를 지우고

- null 값이 있는 행을 삭제

- 정규화(Normalization)

- 표준화(Standardization) 등

 

머신러닝에서 7~80%를 차지할 정도도 중요

 

 

기존

정규화 (Normalization): 비교가 가능하도록 데이터를 0과 1사이의 범위를 가지도록 만듭니다.

 

표준화(Standardization): 데이터의 분포를 정규분포로 바꿔줍, 데이터의 평균이 0이 되도록하고 표준편차가 1이 되도록 만들어줌, Local minima에 빠질 확률을 낮춰줌

 

이진 논리함수 실습

 

준비

데이터 다운로드/압축해제(리눅스)

임포트(추가)

from sklearn.preprocessing import StandardScaler # 전처리

 

데이터셋 로드 (사용하는 컬럼만 추출)

df = pd.read_csv('train_and_test2.csv', usecols=[
  'Age', # 나이
  'Fare', # 승차 요금
  'Sex', # 성별
  'sibsp', # 타이타닉에 탑승한 형제자매, 배우자의 수
  'Parch', # 타이타니게 탑승한 부모, 자식의 수
  'Pclass', # 티켓 등급 (1, 2, 3등석)
  'Embarked', # 탑승국
  '2urvived' # 생존 여부 (0: 사망, 1: 생존)
])

df.head(5)

간단하게 데이터셋 미리보기

정답 라벨의 개수 확인

 

 

전처리

 

빈 행 확인 후 삭제

print(df.isnull().sum())

df = df.dropna() # null인 데이터를 삭제

 

데이터 분할: x

x_data = df.drop(columns=['2urvived'], axis=1) # 정답값을 제외한 나머지 데이터
x_data = x_data.astype(np.float32)

데이터 분할: y

y_data = df[['2urvived']] # 정답값
y_data = y_data.astype(np.float32)

 

 

데이터 표준화: x

scaler = StandardScaler()
x_data_scaled = scaler.fit_transform(x_data) # 단위가 다른 x데이터만 표준화

print(x_data.values[0]) # [22.    7.25  0.    1.    0.    3.    2.  ]
print(x_data_scaled[0]) # [-0.58026063 -0.5018386  -0.74189967  0.48027176 -0.44540733  0.8404475 0.6229398 ]

 

데이터셋 분할

 

모델 학습

model = Sequential([
  Dense(1, activation='sigmoid') # sigmoid function 사용
])

# 이진 논리회귀의 경우, loss 손실함수는 binary_crossentropy를 사용
# metrics: loss만 봐서는 얼마나 잘 학습되었는지 판단이 어렵기에 정확도(확률)을 측정함

model.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.01), metrics=['acc'])

model.fit(
    x_train,
    y_train,
    validation_data=(x_val, y_val), # 검증 데이터를 넣어주면 한 epoch이 끝날때마다 자동으로 검증
    epochs=20 # epochs 복수형으로 쓰기!

 

https://colab.research.google.com/drive/1uP5FDpuibTCGFN5blshkayG5vVT9Beed#scrollTo=DdFgm6wP01vi

 

 

다항 논리회귀 실습

 

 

준비

데이터 다운로드/압축해제(리눅스)

임포트

from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import OneHotEncoder # onwhotencoding에 사용

데이터셋 로드 (사용하는 컬럼만 추출)

간단하게 데이터셋 미리보기

정답 라벨의 개수 확인

전처리

빈 행 확인 후 삭제

데이터 분할: x, y

데이터 표준화

onehotencoding

encoder = OneHotEncoder()
y_data_encoded = encoder.fit_transform(y_data).toarray() # 결과값인 y데이터는 onehotencoding

print(y_data.values[0]) # [1.]
print(y_data_encoded[0]) # [1. 0. 0.]

 

데이터셋 분할

모델 학습

model = Sequential([
  Dense(3, activation='softmax') # softmax function 사용
])

# 다항 논리회귀의 경우, loss 손실함수는 categorical_crossentropy를 사용
# metrics: loss만 봐서는 얼마나 잘 학습되었는지 판단이 어렵기에 정확도(확률)을 측정함

model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.02), metrics=['acc'])

model.fit(
    x_train,
    y_train,
    validation_data=(x_val, y_val), # 검증 데이터를 넣어주면 한 epoch이 끝날때마다 자동으로 검증
    epochs=20 # epochs 복수형으로 쓰기!
)