다항 로지스틱 회귀
다항 로지스틱 회귀
다항 로지스틱 회귀분석은 예측자 변수 세트의 값에 따라 개체를 분류할 때 유용하다.
다항 로지스틱 회귀분석은 종속변수가 두 개의 이상의 범주가 가능하여 로지스틱 회귀분석보다 일반적으로 사용할 수 있다.
1. 라이브러리 생성
import tensorflow as tf
import numpy as np
라이브러리 tensorflow, numpy 사용
tensorflow 는 2점대 버전이 아닌 1.15를 사용했음
2점대의 코딩 방식이 다르기 때문에 모두의 딥러닝 시즌1은 tensorflow 1.15를 사용함
# 2. 실행 시 같은 결과 출력을 위한 seed 값 설정
seed = 0
np.random.seed(seed)
tf.set_random_seed(seed)
실행 시 같은 결과를 출력하기 위해 seed 값을 0으로 설정하여 고정한다.
seed 값을 설정하지 않으면, 다른 랜덤값이 나와 같은 결과가 나오지 않는다.
# 3. 데이터 설정하기
x_data = np.array([[2, 0], [4,0], [6, 0], [8,1], [10,1], [12,1], [14,1]])
y_data = np.array([0, 0, 0, 1, 1, 1, 1]).reshape(7,1)
# 4. tf.placeholder로 데이터 담아주기
# tf.placeholder = 입력값을 저장하는 그릇, tf.placeholder(dtype, shape, name)
X = tf.placeholder(tf.float64, shape=[None, 2])
Y = tf.placeholder(tf.float64, shape=[None, 1])
데이터는 numpy.array를 이용하여 x_data와 y_data를 설정한다.
[2,0] = [공부한 시간, 합격여부]
tf.placeholder()를 이용해 데이터타입, 정렬, 이름을 저장한다.
tf.placeholder = 입력값을 저장하는 그릇 = tf.placeholder(dtype, shape, name)
# 5. 기울기a, y절편 b 임의값 설정
# x1(단순) -> x1, x2(다중)로 변수 추가
# 변수 증가 -> 기울기 각각 계산
# ax -> a1x1 + a2x2
a = tf.Variable(tf.random.uniform([2,1], dtype=tf.float64)) #[2,1] 의미 : 들어오는 값은 2개 나가는 값은 1개 (변수가 2개) #shape=(2,1) -> dtype = float32 만 가능
b = tf.Variable(tf.random.uniform([1], dtype=tf.float64))
다중 로지스틱 회귀이기에 변수가 1개가 아닌 2개로 설정했다.
변수 2개는 기울기 2개를 계산해야 하므로
ax -> a1x1 + a2x2 로 변경된다
기울기 a
# 6. sigmoid 함수 사용
# tensorflow는 matmul()을 이용해 행렬곱 적용
y = tf.sigmoid(tf.matmul(X, a) +b)
tf.matmul()함수를 이용해서 행렬곱으로 (X, a)를 곱한다.
# 7. 오차 구하기
# 오차 = -평균(y*logh + (1-y)log(1-h)) 방정식 구현
loss = -tf.reduce_mean(y * tf.log(y) + (1-Y)*tf.log(1-y))
오차(loss) 방정식
오차 = -평균(y*logh + (1-y)log(1-h))를 구현한다.
# 8. 학습률 설정
learning_rate = 0.05
# 9. 오차 최소값 찾기
# tf.cast() 조건에 따른 True, False 판단 기준에 따라 True=1, False=0으로 반환한다.
# tf.equal() 두 값이 동일하면 True, 다르면 False로 반환하는 함수이다.
gradient_decent = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
predicted = tf.cast(y > 0.5, dtype=tf.float64)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float64))
학습률 learn_rate = 0.05 움직이는 값을 설정한다.
오차 최소값을 경사하강법(GradientDescentOptimizer)에 학습률을 적용하고, 최소한의 오차(loss)를 구한다.
predicted = y값이 0.5이상이라면 True로 반환한다.
accuracy = predicted와 Y값이 같다면 True=1로 반환, predicted와 Y값이 다르면 False=0로 반환한 값의 평균을 구함.
# 10. 학습 및 결론 도출
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) #변수값 초기화
for i in range(3001): # 3001번 돌려서 300번 돌릴때마다 기울기 a1, a2, y절편 b, loss값 구하기
a_, b_, loss_, _ = sess.run([a, b, loss, gradient_decent], feed_dict={X: x_data, Y: y_data})
if(i + 1) % 300 == 0:
print("step=%d, a1=%.4f, a2=%.4f, b=%.4f, loss=%.4f" % (i+1, a_[0], a_[1], b_, loss_))
# 11. 실제 데이터 적용하기
# (7,6) = 7,6은 공부한 시간과 과외 수업 횟수
# feed_dict = placeholder에 new_x 데이터를 하나씩 읽고 실행함.
new_x = np.array([7,6]).reshape(1,2)
new_y = sess.run(y, feed_dict={X: new_x})
print("공부한시간: %d, 과외 수업 횟수: %d" % (new_x[:,0], new_x[:,1]))
print("합격 가능성 : %6.2f %%" % (new_y*100))
feed_dict = placeholder에 new_x 데이터를 하나씩 읽고 실행함.
결과 값
모르는 용어
tf.cast() = 조건에 따른 True, False 판단 기준에 따라 True=1, False =0으로 반환한다.
'머신러닝딥러닝 > 딥러닝' 카테고리의 다른 글
딥러닝(Deeping Learning) #7 - 오차 역전파/신경망 (0) | 2022.04.12 |
---|---|
딥러닝(Deep Learning) #6 - 퍼셉트론 (0) | 2022.04.12 |
딥러닝(deeplearning) #4 - 로지스틱 회귀(logistic regression) (0) | 2022.04.12 |
딥러닝(deeplearning) #3 - 경사하강법 (0) | 2022.04.11 |
딥러닝(deeplearning) #2 - 선형회귀(MSE, RMSE) (0) | 2022.04.11 |
댓글