일반적으로 선형 회귀 분석은 연속형 값을 예측하기에 적합하지만 범주형(분류)으로 예측하기에는 적합하지 않습니다.
선형 회귀 분석은 타겟 데이터의 범위가 무한대이기 때문입니다. 범위가 무한대라는 것은 만일 피처 데이터를 입력으로 두 개의 class(0, 1)로 분류해야 할 때 예측값이 0 또는 1로 제한되어 있다면 가능하지만, 3이라는 값으로 예측하게 된다면 이것은 0과 1로 분류하기는 어렵다는 것을 의미합니다.
이러한 문제를 해결하기 위한 방법 중 하나가 바로 로지스틱 회귀입니다.
로지스틱 회귀는 일반적인 선형 회귀 분석에서 출력값에 시그모이드 함수를 사용하여 0과 1사이의 값으로 변환시키는 방법으로, 이진 분류 방법입니다. (다중 분류일 경우에는 소프트맥스 함수를 사용해야 합니다.)
z는 선형 회귀 모델의 출력입니다.
사이킷런의 LogisticRegression을 사용해 보겠습니다.
LogisticRegression의 predict()는 0~1사이로 예측된 값을 0 또는 1로 분류한 결과입니다.
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, confusion_matrix, classification_report
raw_cancer = datasets.load_breast_cancer()
X = raw_cancer.data
y = raw_cancer.target
# X.shape, y.shape: (569, 30) (569,)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# X_train.shape, X_test.shape, y_train.shape, y_test.shape: (426, 30) (143, 13) (426,) (143,)
std_scaler = StandardScaler()
X_train = std_scaler.fit_transform(X_train)
X_test = std_scaler.transform(X_test)
clf_logistic_l2 = LogisticRegression(penalty='l2')
clf_logistic_l2.fit(X_train, y_train)
pred_logistic = clf_logistic_l2.predict(X_test)
# [0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1
# 0 1 0 0 1 0 1 1 0 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0
# 0 1 1 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 0 0 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1
# 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 0]
pred_prob_logistic = clf_logistic_l2.predict_proba(X_test)
# [[9.98638613e-01 1.36138656e-03]
# [3.95544804e-02 9.60445520e-01]
# [1.30896362e-03 9.98691036e-01]
# [1.24473354e-02 9.87552665e-01]
# ...
# [8.41453252e-05 9.99915855e-01]
# [1.58701592e-03 9.98412984e-01]
# [1.26424968e-03 9.98735750e-01]
# [9.99999994e-01 5.81805301e-09]]
precision = precision_score(y_test, pred_logistic)
# 0.9666666666666667
conf_matrix = confusion_matrix(y_test, pred_logistic)
# [[50 3]
# [ 3 87]]
class_report = classification_report(y_test, pred_logistic)
# precision recall f1-score support
#
# 0 0.94 0.94 0.94 53
# 1 0.97 0.97 0.97 90
#
# accuracy 0.96 143
# macro avg 0.96 0.96 0.96 143
# weighted avg 0.96 0.96 0.96 143
LogisticRegression의 파라미터 penalty는 제약으로서, 'l1', l2' 등을 사용할 수 있습니다.
predict()는 피처 데이터를 0 또는 1로 분류한 결과이고, predict_prob()는 0과 1에 대한 확률입니다.
두 값을 합치면 1입니다.
'AI > Machine Learning' 카테고리의 다른 글
[Machine Learning] 의사결정나무 (Decision Tree) (0) | 2023.05.25 |
---|---|
[Machine Learning] 나이브 베이즈 (Naive Bayes) (0) | 2023.05.24 |
[Machine Learning] 라쏘, 릿지, 엘라스틱넷 (Ridge, Lasso, ElasticNet) (0) | 2022.09.28 |
[Machine Learning] 선형 회귀 (Linear Regression) (0) | 2022.09.28 |
[Machine Learning] K-최근접 이웃 알고리즘 (KNN) (0) | 2022.09.28 |