로지스틱 함수(Logistic function)의 이름을 땀
선형 회귀와 같지만 출력값에 로지스틱 함수를 붙임(0과 1 사이의 출력이 나오도록 만듦)
S-커브를 함수로 표현해낸 것이 바로 로지스틱 함수(Logistic function). 딥러닝에서는 시그모이드 함수(Sigmoid function)라고 불림.
로지스틱 함수(Logistic function=Sigmoid function)
선형 회귀보다 더 잘 예측할 수 있게 만들어 줌
출력값은 무조건 0과 1 사이(최소 0, 최대 1)
임계치(Threshold)
pass/fail을 가르는 기준
통과할 확률, 즉 pass가 중요한 경우 임계치를 높이기도 함
가설과 손실함수
실질적인 계산은 선형 회귀(가설: 1차 함수)와 같지만, 출력에 시그모이드 함수를 붙여 0에서 1사이의 출력값(확률)을 가지도록 함
가설
손실함수
손실함수를 최소화
선형이 아니고 확률분포로 이해
Keras에서 이진 논리 회귀의 경우 binary_crossentropy 손실 함수를 사용
다중 논리 회귀 (Multinomial logistic regression)
3개 이상의 클래스를 구분할 문제
One-hot encoding
다항 분류 (Multi-label classification) 문제를 풀 때 출력값을 확률분포 그래프로 예쁘게 표현(컴퓨터 친화적)할 수 있는 문제
여러개의 항을 0과 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)을 통해 최종 답을 결정
학습하기 전 준비 단계
가공되지 않은 데이터를 받았을 때, 머신러닝 모델이 잘 학습할 수 있도록 만들어 주는 과정
머신러닝에서 전처리 과정이 7~80% -> 정확도에 많은 영향을 줌
정규화(Normalization)
데이터를 0과 1사이의 범위를 가지도록 만듦
가장 작은 값: 0, 가장 큰 값: 1
표준화(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