본문 바로가기
ADP로ML정리

4-2. 회귀 모델 - 분류를 위한 회귀 모델

by hits_gold 2024. 2. 19.
반응형

1. 로지스틱 회귀 Logistic Regression

  •  선형 모델을 분류에 사용해 데이터가 특정 클래스에 속할 확률을 추정하는데 사용할 수 있다.
  •  로지스틱 회귀는 선형 회귀 모델처럼 독립변수의 가중치 합으로 계산하지만 특정 범주에 속하는 확률을 나타내기 위해 새로운 접근이 필요하다.

 

  • 회귀 분석의 결과값이 0과 1사이의 값이 되도록 하는 시그모이드 함수를 사용한다.
  • 두 클래스에 대해 승산비(odds)에 로그를 취하고, 이를 확률변수로 정리하면 시그모이드 함수를 도출할 수 있다.

 

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

cancer = load_breast_cancer()
x = pd.DataFrame(cancer.data, columns = cancer.feature_names)
y = cancer.target

X_train, X_test, y_train, y_test = train_test_split(x, y, stratify=y, train_size = 0.7, random_state = 42)

logR = LogisticRegression()
logR.fit(X_train, y_train)

proba = pd.DataFrame(logR.predict_proba(X_train)) # 확률값
cs = logR.decision_function(X_train) # Confidence Score

df = pd.concat([proba, pd.DataFrame(cs)], axis = 1)
df.columns = ['Not 0', '0', 'decision_function']

df.sort_values(['decision_function'], inplace = True)
df.reset_index(inplace =True, drop = True)
df

plt.figure(figsize = (20, 12))

plt.axhline(y=0.5, linestyle='--', color='black', linewidth=1)
plt.axvline(x=0, linestyle='--', color='black', linewidth=1)

plt.plot(df['decision_function'], df['Not 0'], 'g--', label = 'Not 0')
plt.plot(df['decision_function'], df['Not 0'], 'g^')
plt.plot(df['decision_function'], df['0'], 'b--', label='0')
plt.plot(df['decision_function'], df['0'], 'b*')

plt.legend(loc = 'upper left', fontsize = 50)
plt.show()

from sklearn.metrics import confusion_matrix, accuracy_score
from sklearn.metrics import precision_score, recall_score, f1_score

pred = logR.predict(X_test)

test_cm = confusion_matrix(y_test, pred)
test_acc = accuracy_score(y_test, pred)
test_pre = precision_score(y_test, pred)
test_re = recall_score(y_test, pred)
test_f1 = f1_score(y_test, pred)

print(test_cm)
print('\n')
print(f'정확도 : {round(test_acc*100, 2)}%')
print(f'정밀도 : {round(test_pre*100, 2)}%')
print(f'재현율 : {round(test_re*100, 2)}%')
print(f'F1 score : {round(test_f1*100, 2)}%')

from sklearn.metrics import plot_roc_curve

plot_roc_curve(logR, X_test, y_test)
plt.show()

 

 

2. 소프트맥스 회귀 (다중 클래스 분류)

 로지스틱 회귀 모델을 2개 이상의 클래스인 다중 클래스를 분류하도록 일반화할 수 있다. 이 과정을 다항 로지스틱 회귀 또는 소프트맥스 회귀라고 한다. 소프트맥스 함수는 k개의 클래스를  분류할 때 k차원의 벡터를 입력받아 각 클래스에 대한 점수를 계산하고 그 점수에 소프트맥스 함수를 적용해 각 클래스의 확률을 추정한다.

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

iris_load = load_iris()
x = pd.DataFrame(iris_load.data, columns = iris_load.feature_names)
y = load_iris().target

X_train, X_test, y_train, y_test = train_test_split(x, y, stratify=y, train_size = 0.7, random_state = 42)

softm = LogisticRegression(multi_class = 'multinomial', solver = 'lbfgs', C=10)
softm.fit(X_train, y_train)


from sklearn.metrics import confusion_matrix, accuracy_score

pred = softm.predict(X_test)

test_cm = confusion_matrix(y_test, pred)
test_acc = accuracy_score(y_test, pred)

print(test_cm)
print('\n')
print(f'정확도 : {round(test_acc*100, 2)}%')

반응형