실제로 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] 인 값들만이 유효하다.

이제 로지스틱 회귀를 생성하고 계수들을 확인해 선형 함수의 방정식을 얻도록 하자. 분명 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]
앞서 출력한 계수와 절편을 통해 얻은 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]
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) 에 대한 값도 확인이 가능하므로 이진분류일 때에는 굳이 두 개의 함수를 각각 구하지 않는 것이다.