AI/ML/DL (14) - Binary classification

xsldihsl·2024년 5월 20일
0

AI/ML/DL

목록 보기
14/25

Contents

  1. Binary classification
  2. Logistic regression
  3. Decision function "z"
  4. Sigmoid function

1. Binary classification

실제로 logistic regression 을 이용해 우리의 채소들 중 오이와 양상추에 대한 이진분류를 실행해보자. 그렇다면 비교 연산자로 오이와 양상추 데이터들만을 뽑아낸 후 True 인 행들만을 출력해야 할 것이다.

indices = (train_target == 'Cucumber') | (train_target == 'Lettuce')
print(train_scaled.shape) # (119, 5)
print(indices.shape) # (119,)
train_binary = train_scaled[indices]
target_binary = train_target[indices]

만약 indices 와 train_binary 를 출력해본다면 다음과 같은 결과를 얻는다. 즉, index 가 boolean 으로 나타내질 때에는 train_scaled[True] 인 값들만이 유효하다.


2. Logistic regression

이제 로지스틱 회귀를 생성하고 계수들을 확인해 선형 함수의 방정식을 얻도록 하자. 분명 logistic regression 도 선형모델이므로 linear_model 아래에 존재한다.

from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()
lr.fit(train_binary, train_target)

print(lr.predict(train_binary[:5]))
# ['Lettuce' 'Cucumber' 'Cucumber' 'Cucumber' 'Cucumber']

print(lr.predict_proba(train_binary[:5]))
# [[0.02935627 0.97064373]
   [0.98308158 0.01691842]
   [0.99482069 0.00517931]
   [0.99304714 0.00695286]
   [0.9829023  0.0170977 ]]

print(lr.coef_, lr.intercept_) 
# [[-0.45936714 -0.62057336 -0.70370281 -0.96211517 -0.71958572]] [-2.30326335]

3. Decision function "z"

앞서 출력한 계수와 절편을 통해 얻은 binary classification 의 선형함수는 다음과 같다.

z = - 0.46 x Weight - 0.62 x Length - 0.70 x Diagonal - 0.96 x Height - 0.72 x Width - 2.30

대부분의 분류 모델들은 .decision_function() 이라는 함수를 제공한다. 지금까지 사용해 온 .predict_proba() 가 확률을 계산한다면, .decision_function() 은 logistic regression 의 decision function 인 z 값을 계산한다. 그렇다면 z 값을 sigmoid 함수에 넣어 이전과 동일한 확률을 얻는지 확인해보자.

decisions = lr.decision_function(train_binary[:5])
print(decisions)
# [3.49845346 -4.06228931 -5.25789118 -4.9616252 -4.05156551]

4. Sigmoid function

Sigmoid 를 적용하기 위해 SciPy 에서 제공하는 expit method 를 사용할 것이다.

expit(x) = 1/(1+exp(-x))

이는 expit 함수의 정의를 나타낸 것으로, logit function 의 inverse 이며 우리가 배운 sigmoid 함수와 동일한 것을 알 수 있다.

from scipy.special import expit
print(expit(decisions))
# [0.97064373 0.01691842 0.00517931 0.00695286 0.0170977]

이를 proba 와 비교해보면 오직 양성 class (1, Lettuce) 에 대한 z 를 계산하는 것을 알 수 있다. 하지만 이진분류의 특성상 1 에서 양성 class 의 z 값을 빼주면 음성 class (0, Cucumber) 에 대한 값도 확인이 가능하므로 이진분류일 때에는 굳이 두 개의 함수를 각각 구하지 않는 것이다.


0개의 댓글