딥러닝

딥러닝의 이해

SodaCocoa 2024. 2. 13. 12:13

지도학습(x:원인, y:결과)

 예측: y값을 예측


 분류: y값이 어떤곳에 속해있는지를 선택(분류)

둘중하나(이항분류: 생존1,사망0) 결과값은 0또는 1의 값으로만 출력되어야만함

      네이버 영화평 긍정1,부정0

학습할떄는 y값으로 0또는 1값을 학습하지만

분류값으로 머신러닝이나 딥러닝한값은 0~1사이값이 출력이 되도록함,

0.5(임계값)보다 크면 1, 그렇지 않으면 0으로 최종값이 되게끔 계산

최소제곱법에서의 w,b값

 

기본식은 x*w+b 

대표적인 회귀분석 머신러닝f(x) 계산하는 방법이 고정이어서 오차계산 없음

이미 오차가 최소화되는 최소제곱법에 의해서 w,b가 계산이됨

 

딥러닝은 w,b를 무작위로 만들어서 계산한뒤(w*x+b), 오차계산하고 최소화 될 수 있게 경사하강(미분), 이과정 반복(사용자가 에포크지정한 횟수만큼)

 

x y f(x)=yhat 오차 = y-yhat 제곱
1 10 5 (10-5) = 25
2 5 6 (5-6) =1
3 5 2 (5-2)=9
4 5 2 (5-2)=9
      mse(제곱평균루트) 

  

오차를 최소화 시키는것

비지도학습 (x:원인)

예측, 분류

ex) 클러스터링,생성


 

훈련데이터 (w,b값에 관여하는데이터)

검증데이터(테스트데이터호 사용하기도함)

 =>훈련데이터의 w,b값이 잘되어 있는지 확인하는 데이터셋


고전적인 머신러닝은 이미공식이 만들어져 있기때문에 검증데이터 없어도 됨 

이미 만들어진 공식은 변경 불가능, 훈련데이터를 이용해서 w,b만 fit(계산)이 w,b좋은 값인지를 테스트데이터로 확인만(오차가 작은지, 일치확률) -모델검증 ---------------> 오차검증표

==> 좋은결과이면 이 모델 확정해서 새로운 데이터에 연동


딥러닝은 무작위로 w,b를 훈련에 넣음, 오차를 계산, 그 오차값을 0으로 만들기위한 경사하강(오차역전파)을 해서 무조건 훈련데이터는 오차가 작아지게 됨, 그럼 이 w,b가 좋은값이냐 확인용으로 검증데이터를 그때그때 넣어서 w,b를 넣어서 계산하고 y값의 오차를 확인함

====> 좋은케이스: 훈련데이터의 오차도 작아지고, 검증데이터의 오차도 점점줄어드는 상황이 좋음

====> 중단해야하는 경우(과적합): 훈련데이터의 오차는 작아지는데, 검증데이터의 오차는 커지는 지점

 

weight bias는 중간중간 저장하는게 좋음 -> 최종만 남기떄문

 

최종작업이 다끝나면 w,b가 생성이된 모델이 작성되면 이 모델을 테스트 데이터에 넣어서 모델검증 ------------->오차검증표

==> 좋은결과이면 이 모델 확정해서 새로운 데이터에 연동

 

**훈련데이터는 fit하지만, 테스트데이터는 fit하지 않는다!**

 

예시

max(5),min(1)   max(5),min(1)
훈련 훈련.fit_min_max()   테스트.Fit하지않음 계산만함 fit값은 훈련값으로 함 8(8-훈련데이터의min)/(훈련데이터max-훈련데이터의min)
2 0.25   8
3 0.5   7
1     6
5      

 

사이킷런 패키지의 이해 - 타이타닉 승객 생존여부 예측모델생성

필요한 패키지 import해주고, 데이터를 로드시켜줍니다

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import make_column_transformer
from sklearn.linear_model import LogisticRegression
import numpy as np
##########데이터 로드

train_df.head()

 

결과값

 

labels = ['사망', '생존'] # 0,1
##########survival EDA후 아래작업 실행
##########데이터 전처리
x_train = train_df.drop(['name', 'ticket', 'survival'], axis=1)
x_test = test_df.drop(['name', 'ticket', 'survival'], axis=1)

 

머신러닝에 들어가는 x데이터는 문자데이터는 안됨
벡터데이터야함
성별은 male은 0 Female은 1은 1
embarked를 0,1,2,3,....4 로 줬을때 이 값이 순서대로 값의 크기가 의미가 있는가를 고민
문자를 단순하게 숫자 0,1,2,3,..로 작성을 하지 않음. --> 원핫인코딩작업을 실행
x데이터는 더미변수화, y변수는 원핫인코딩

 

print(x_train.columns)

로 컬럼들을 살펴보면

Index(['pclass', 'sex', 'age', 'sibsp', 'parch', 'fare', 'embarked'], dtype='object')

 

transformer = make_column_transformer(
    (OneHotEncoder(), ['pclass', 'sex', 'embarked']),
    remainder='passthrough')
transformer.fit(x_train)
x_train = transformer.transform(x_train)
x_test = transformer.transform(x_test)

OneHotEncoder(): 범주형 변수를 원-핫 인코딩 방식으로 변환합니다.

원-핫 인코딩은 범주형 변수의 각 범주를 새로운 더미(dummy) 변수로 변환하는 방식으로, 각 범주는 고유한 더미 변수에 해당하며 해당 범주에 속하는 관측치는 1, 그렇지 않은 경우는 0의 값을 갖습니다.

 

.fit(x_train): 변환기를 훈련 데이터셋 x_train에 맞게 적합시킵니다.

이 단계에서는 각 범주형 변수에 대한 원-핫 인코딩을 위한 매핑(어떤 범주가 있는지, 각 범주에 대한 더미 변수 인덱스 등)을 학습합니다.

 

x_train[0]
#array([ 0.,  1.,  0.,  1.,  0.,  1.,  0.,  0., 17.,  0.,  0., 12.])

여기서 17, 12와 같은 수는 나이,요금 같은 원핫인코딩을 시키지 않아서 나온값이다.

 

##########모델 생성
model = LogisticRegression()
##########모델 학습
model.fit(x_train, y_train)

로지스틱회귀분석을 이용하여 모델을 생성

 

로지스틱 회귀분석이란?

데이터가 어떤 범주에 속할 확률을 0에서 1사이의 값으로 예측하고 그 확률에 따라 가능성이 더 높은 범주에 속하는 것으로 분류해주는 지도 학습 알고리즘이다.

스펨 메일 분류기 같은 예시를 생각하면 쉬운데, 어떤 메일을 받았을 때 그 메일이 스팸일 확률이 0.5이상이면 스팸으로 분류하고, 메일이 스팸일 확률이 0.5보다 낮으면 일반 메일로 분류하는 것이다. 이렇게 데이터가 2개의 범주 중 하나에 속하도록 결정하는 것을 Binary Classification (2진 분류)라고 한다.

 

##########모델 검증
print(model.score(x_train, y_train)) #0.7945205479452054
print(model.score(x_test, y_test)) #0.7795527156549521

 

model.predict(x_test) # 위에있는 77%는 이 결과값의 1,0,0 값하고 y_train값하고의 일치율이 77%이다.

출력 화면

array([1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
       1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
       0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0,
       0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0,
       0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
       0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0,
       1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0,
       0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1,
       1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0,
       0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1,
       1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1,
       1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0,
       0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1,
       1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0,
       1, 0, 1, 1, 0])

 

newx_test = [
    [2, 'Female', 21, 0, 1, 21.00, 'S']
]
newx_test = pd.DataFrame(newx_test, columns=['pclass', 'sex', 'age', 'sibsp', 'parch', 'fare', 'embarked'])
newx_test = transformer.transform(newx_test)
y_predict = model.predict(newx_test)
label = labels[y_predict[0]]
y_predict = model.predict_proba(x_test)
confidence = y_predict[0][y_predict[0].argmax()]
print(label, confidence)

 

newx_test로 새로운 변수를 지정

결과값이 생존 0.867532641303584로 나왔다.