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로만 표현
- 클래스(라벨)의 개수만큼 배열을 0으로 채운다.
- 각 클래스의 인덱스 위치를 정한다.
- 각 클래스에 해당하는 인덱스에 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 복수형으로 쓰기!
)