🔥알림🔥
① 테디노트 유튜브 -
구경하러 가기!
② LangChain 한국어 튜토리얼
바로가기 👀
③ 랭체인 노트 무료 전자책(wikidocs)
바로가기 🙌
④ RAG 비법노트 LangChain 강의오픈
바로가기 🙌
⑤ 서울대 PyTorch 딥러닝 강의
바로가기 🙌
로지스틱회귀(Logistic Regression)와 분류 평가 지표 (Precision, Recall, F1 Score)
Logistic Regression은 선형 알고리즘에 Sigmoid
Function 이 결합된 분류 알고리즘 입니다. 알고리즘 이름 뒷부분에 Regression 이 붙기 때문에 흔하게 회귀 알고리즘으로 착각할 수 있지만 분류 알고리즘 입니다.
이번에는 Logistic Regression 알고리즘의 분류 원리에 대해 알아보고 랜덤 Generated 된 데이터 셋을 이용하여 분류 알고리즘을 활용한 예측까지 해보도록 하겠습니다.
더불어, 이 실습 코드의 후반부에는 분류 알고리즘에 대한 평가 지표인 Precision, Recall, 그리고 F1 Score 까지 나옵니다.
단순 정확도인 Accuracy 뿐만아니라, 다른 Metric의 공식에 대하여 알아보고 평가 방법까지 알아보도록 하겠습니다.
코드
from IPython.display import Math
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (10, 7)
Logistic Regression
- 선형 회귀 방식을 이용한 이진 분류 알고리즘
- 분류 레이블 : 0 or 1
- 0~1 범위를 예측 결과로 갖는 모델 필요
- 가설 결과에 Sigmoid 함수 적용
- Logistic, sigmoid 함수
- S자 모양의 함수
$\displaystyle s(z) = \frac{1}{1+e^{-z}}$
$z$ 값을 0과 1사이의 값으로 바꾸는 함수
Sigmoid 함수 원리
$\frac{1}{1} = 1$인데, 분모 1에다 0보다 크거나 같은 어떤 수를 더 하면 그 결과는 1 보다 클수 없다.
분모에 더 할 값은 $e^{-z}$, 이 값은 어떤 $z$가 주어져도 0보다 작아 지지 않는다.
$e^{-z}$는 $z$의 값이 크면 클 수록 0에 가까운 작은 수가 되고 $z$값이 작으면 무한대에 가까운 큰 수가 된다
따라서 $z$의 값이 크면 $e^{-z}$의 값이 작아져서 $\frac{1}{1+e^{-z}}$의 값은 1에 가까워 지고 그 반대는 0에 가까워 진다.
- sklearn API
sklearn.linear_model.LogisticRegression
Sigmoid 함수 그리기
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(z):
return 1/(1+np.exp(-z))
plt.figure(figsize=(10, 7))
x = np.arange(-10, 10)
y = sigmoid(x)
plt.plot(x, y)
plt.show()
로지스틱 회귀 실습: 랜덤수 분류
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 샘플 생성
ma, mb = 50, 50
m = ma + mb
Xa = np.random.randint(-50,0, (ma, 2))
Xb = np.random.randint(0,50, (mb, 2))
x = np.concatenate((Xa, Xb), axis=0).astype(np.float32)/100
y = np.zeros((m,), dtype=np.float32)
y[mb:] = 1
plt.plot(x[y==0][:,0],x[y==0][:,1], 'r1')
plt.plot(x[y==1][:,0],x[y==1][:,1], 'b1')
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# logistic regression
lr_clf = LogisticRegression()
lr_clf.fit(x, y)
predict = lr_clf.predict(x)
# accruracy_score (정확도 측정)
accuracy_score(y, predict)
plt.plot(x[y==0][:,0],x[y==0][:,1], 'r1')
plt.plot(x[y==1][:,0],x[y==1][:,1], 'b1')
plt.plot(x[predict==0][:,0],x[predict==0][:,1], 'rs', alpha=0.3)
plt.plot(x[predict==1][:,0],x[predict==1][:,1], 'bs', alpha=0.3)
로지스틱 회귀 실습: 위스콘신 유방암 환자
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_breast_cancer
# 데이터 셋 로드
cancer = load_breast_cancer()
# 데이터 프레임 만들기
df = pd.DataFrame(cancer['data'], columns=cancer['feature_names'])
df['target'] = cancer['target']
df.head()
# standardization
scaler = StandardScaler()
scaled = scaler.fit_transform(df.drop('target', axis=1))
# train_test_split
x_train, x_valid, y_train, y_valid = train_test_split(scaled, df['target'], random_state=10)
# logistic regression
lr_clf = LogisticRegression()
lr_clf.fit(x_train, y_train)
pred = lr_clf.predict(x_valid)
# 정확도 측정
accuracy_score(y_valid, pred)
오차 행렬 (Confision Matrix)
from sklearn.metrics import confusion_matrix
from IPython.display import Image
Image('https://skappal7.files.wordpress.com/2018/08/confusion-matrix.jpg', width=700)
cm = confusion_matrix(y_valid, pred)
cm
import seaborn as sns
sns.heatmap(cm, annot=True, annot_kws={"size": 20}, cmap='YlOrBr')
plt.xlabel('Predicted', fontsize=20)
plt.ylabel('Actual', fontsize=20)
TN, FP, FN, TP = cm.ravel()
정밀도 (Precision)
Positive로 예측한 전체 건수에서 옳게 예측한 건수의 비율
- 중요 사례: 스팸 분류 (스팸으로 분류한 메일 중에서 중요 메일이 있는 경우
tn, fp, fn, tp = confusion_matrix([0, 1, 0, 1], [1, 1, 1, 0]).ravel()
precision = TP / (FP + TP)
precision
from sklearn.metrics import precision_score
precision_score(y_valid, pred)
재현율 (Recall), 민감도
실제 Positive인 전체 건수에서 옳게 예측한 건수의 비율
- 중요 사례: 암 진단 (암 환자를 건강으로 분류하는 경우)
- TPR (True Positive Rate)
recall = TP / (FN + TP)
recall
from sklearn.metrics import recall_score
recall_score(y_valid, pred)
F1 Score
재현율과 정밀도의 균형을 나타내는 수치
${F1 Score}=2*\: \frac{precision\:*\: recall}{precision+recall}$
2 * (precision * recall) / (precision + recall)
from sklearn.metrics import f1_score
f1_score(y_valid, pred)
댓글남기기