머신 러닝 기초2

hyelog·2022년 5월 17일
0

TIL

목록 보기
14/20
post-thumbnail

머신 러닝 기초

논리 회귀(Logistic regression)

로지스틱 함수(Logistic function)의 이름을 땀
선형 회귀와 같지만 출력값에 로지스틱 함수를 붙임(0과 1 사이의 출력이 나오도록 만듦)


S-커브를 함수로 표현해낸 것이 바로 로지스틱 함수(Logistic function). 딥러닝에서는 시그모이드 함수(Sigmoid function)라고 불림.


로지스틱 함수(Logistic function=Sigmoid function)
선형 회귀보다 더 잘 예측할 수 있게 만들어 줌
출력값은 무조건 0과 1 사이(최소 0, 최대 1)

임계치(Threshold)
pass/fail을 가르는 기준
통과할 확률, 즉 pass가 중요한 경우 임계치를 높이기도 함

가설과 손실함수
실질적인 계산은 선형 회귀(가설: 1차 함수)와 같지만, 출력에 시그모이드 함수를 붙여 0에서 1사이의 출력값(확률)을 가지도록 함

  1. 가설

  2. 손실함수
    손실함수를 최소화
    선형이 아니고 확률분포로 이해

  • Crossentropy 함수
    확률 분포 그래프의 차이를 비교(차이를 줄여줌)

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




다항 논리 회귀 (Multinomial logistic regression)

다중 논리 회귀 (Multinomial logistic regression)
3개 이상의 클래스를 구분할 문제

One-hot encoding
다항 분류 (Multi-label classification) 문제를 풀 때 출력값을 확률분포 그래프로 예쁘게 표현(컴퓨터 친화적)할 수 있는 문제
여러개의 항을 0과 1로만 구분해서 표현

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


Softmax 함수와 손실함수

선형모델 → Softmax 함수 통과 → One-hot encoding
선형 모델에서 나온 결과(Logit)를 모두 더하면 1이 되도록 만들어주는 함수
예측의 결과를 확률(=Confidence)로 표현하기 위함
One-hot encoding 라벨의 값을 전부 더하면 1(100%)이 됨

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



다양한 머신러닝 모델

분류기(Classifier): 분류 문제를 푸는 모델



Support vector machine (SVM)

Margin이 넓어지도록 모델을 학습
Feature(특성)의 개수를 늘려서 학습 → 성능(정확도)가 좋아짐

k-Nearest neighbors (KNN)
비슷한 특성을 가진 개체끼리 군집화하는 알고리즘

의사결정나무(Decision tree)
예, 아니오를 반복하며 추론하는 방식
성능이 좋다


Random forest
각각의 의사결정나무들이 결정을 하고 마지막에 투표(Majority voting)을 통해 최종 답을 결정





전처리(Preprocessing)

학습하기 전 준비 단계
가공되지 않은 데이터를 받았을 때, 머신러닝 모델이 잘 학습할 수 있도록 만들어 주는 과정
머신러닝에서 전처리 과정이 7~80% -> 정확도에 많은 영향을 줌

  1. 정규화(Normalization)
    데이터를 0과 1사이의 범위를 가지도록 만듦
    가장 작은 값: 0, 가장 큰 값: 1

  2. 표준화(Standardization)
    데이터의 분포를 정규분포로 변환
    데이터의 평균 0, 표준편차 1

학습 속도(최저점 수렴 속도)가 빠르고, Local minima에 빠질 가능성이 적다


📜 연령, 혈압, 인슐린 수치 등을 통해 당뇨병을 진단
df = pd.read_csv('diabetes2.csv') # 데이터 읽기

sns.countplot(x=df['Outcome']) # 생존율 보기

print(df.isnull().sum()) # 빠진값 체크

x_data = df.drop(columns=['Outcome'], axis=1) # 생존여부 'Outcome'만 제외(drop)하기
x_data = x_data.astype(np.float32) # x_data type 정의

y_data = df[['Outcome']] # y데이터 정의:'Outcome'
y_data = y_data.astype(np.float32)

scaler = StandardScaler() # scaler에 StandardScaler 정의
x_data_scaled = scaler.fit_transform(x_data) # fit_transform 메소드 호출(x_data)
# x_data 단위가 다 다르기 때문에 x_data 값만 표준화 하면 됨

x_train, x_val, y_train, y_val = train_test_split(x_data, y_data, test_size=0.2, random_state=2021)

print(x_train.shape, x_val.shape)
print(y_train.shape, y_val.shape)

model = Sequential([ # 선형 모델
  Dense(1, activation='sigmoid') # 시그모이드 함수 사용
])

model.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.02), metrics=['acc'])
# binary_crossentrop 이진 논리 회귀(0이냐 1이냐) 
# metrics: loss 값만 보고는 얼마나 학습되었는지 알기 힘들기 때문에 사용
# acc(accuracy): 분류 문제에 사용됨, 정확도(0에서 1사이로 나타내주는 지표, 1에 가까울수록 100%)

model.fit(
    x_train,
    y_train,
    validation_data=(x_val, y_val), # 검증 데이터를 넣어주면 한 epoch이 끝날때마다 자동으로 검증
    epochs=50 # epochs 복수형으로 쓰기!
    
Epoch 50/50
20/20 [==============================] - 0s 4ms/step - loss: 0.6187 - acc: 0.6857 - val_loss: 0.5767 - val_acc: 0.7078
profile
다 놓치고 있습니다

0개의 댓글