ML (MachineLearning)

Logistic Regression (로지스틱 회귀)

567Rabbit 2024. 4. 15. 12:18

머신러닝의 지도학습에 속하는

Classfication(분류)

- Logistic Regression (로지스틱 회귀)

- KNN(K nearest neighbor) 알고리즘, 

- SVC(Support Vector Machine) 알고리즘,

- DT(Decision Tree) 알고리즘

 

네 가지 방법 중에 정확도가 더 높은 방법으로 알고리즘을 선택하여 사용한다


로지스틱 회귀란 ? 

분류 문제를 해결하는것을 목표로 합니다
- 연속적인 결과를 예측하는 선형회귀와 다르게 범주형 결과를 예측하여 이를 수행합니다
- 가장 간단한 방법이 이항이라고 불리는 두가지 결과가 있는데 그 예로 암이 악성인지 양성인지 예측하는 것입니다

 

 

Confusion Matrix

 

대부분의 경우, C가 더 중요하다

오탐지의 경우 맞은것을 못찾은 것이지만

미탐지의 경우 틀린것을 못찾은 것이므로,

틀린것을 못찾은 것이 대부분 문제를 더 많이 발생시키고 손실을 더 많이 가져오기 때문이다

 

 

 

 

예제

# 나이와 연봉으로 분석해서, 물건을 구매할지 안할지를 분류하자   (구매하면 1, 구매하지 않으면 0)

 

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

import seaborn as sb

 

 

df

  User ID Gender Age Estimated Salary Purchased
0 15624510 Male 19 19000 0
1 15810944 Male 35 20000 0
2 15668575 Female 26 43000 0
3 15603246 Female 27 57000 0
4 15804002 Male 19 76000 0
... ... ... ... ... ...
395 15691863 Female 46 41000 1
396 15706071 Male 51 23000 1
397 15654296 Female 50 20000 1
398 15755018 Male 36 33000 0
399 15594041 Female 49 36000 1

 

 

공백 없애기

df.isna().sum()

User ID            0
Gender             0
Age                0
EstimatedSalary    0
Purchased          0
dtype: int64

 

 

 

 

특성열과 대상열로 나누기

 

특성 열(X)은 데이터셋에서 각각의 관측치에 대한 설명변수를 나타낸다
대상 열(y)은 예측하려는 값이 포함된 열이다

 

y = df['Purchased']

X = df.iloc[ : ,2:3+1]

 

 

 

 

피쳐스케일링 하기

로지스틱 리그레션은 피쳐스케일링을 해야한다

 

from sklearn.preprocessing import StandardScaler, MinMaxScaler  (첫번째 게시글에 자세히 나와있다.)

 

X_scaler = StandardScaler()
X = X_scaler.fit_transform( X )

 

y      # 0과 1로만 이루어져있으므로 따로 피쳐스케일링을 할 필요가 없다

 

 

 

train과 test로 나누기

from sklearn.model_selection import train_test_split

 

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=1)

 

 

 

 

모델링하기

from sklearn.linear_model import LogisticRegression

 

classifier = LogisticRegression()

 

classifier.fit(X_train, y_train)

 

classifier.predict(X_test) # X_test 예측하기

classifier.predict_proba(X_test) # 확률로 볼 수 있다

 

y_pred = classifier.predict(X_test)

df_test = y_test.to_frame()

df_test['y_pred'] = y_pred

df_test

 

Purchased y_pred
0 0
0 0
1 1
1 1
0 0
... ...
1 1
1 1
1 0
0 0
0 0

 

 

 

 

Confusion Matrix 

from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_test, y_pred)

 

 

cm

array([[52,  6],
       [11, 31]], dtype=int64)

 

 

# 정확도 계산 : accuracy
(52+31) / cm.sum()

0.83

 

 

from sklearn.metrics import accuracy_score

accuracy_score(y_test, y_pred)

0.83

 

 

 

report 나타내기

- 분류 모델의 성능을 평가하기 위해 사용된다

- 주로 모델의 정확도, 정밀도, 재현율, F1 점수 등과 같은 여러 지표를 제공하여

- 모델의 성능을 이해하고 비교하는 데 도움을 준다

 

 

from sklearn.metrics import classification_report

print(classification_report(y_test, y_pred))

 

              precision    recall  f1-score   support

           0       0.83      0.90      0.86        58
           1       0.84      0.74      0.78        42

    accuracy                           0.83       100
   macro avg       0.83      0.82      0.82       100
weighted avg       0.83      0.83      0.83       100

 

 

  • precision: 예측된 양성 중 실제 양성의 비율을 나타낸다. 즉, 모델이 양성으로 예측한 것 중에서 실제로 양성인 것의 비율이다. 여기서 0과 1 클래스에 대한 precision은 각각 0.83과 0.84이다. 이는 모델이 클래스 0을 83%의 정밀도로, 클래스 1을 84%의 정밀도로 예측한다는 것을 의미한다
  • recall: 실제 양성 중에서 모델이 양성으로 예측한 비율을 나타낸다. 즉, 모델이 실제 양성 중에서 얼마나 많은 것을 식별할 수 있는지를 보여준다. 여기서 0과 1 클래스에 대한 recall은 각각 0.90과 0.74이다. 이는 클래스 0의 경우 90%의 재현율로 실제 양성 중 대부분을 잘 식별한다는 것을 의미하며, 클래스 1의 경우 74%의 재현율로 양성을 놓치는 비율이 상대적으로 높다는 것을 의미한다.
  • f1-score: precision과 recall의 조화 평균이다. 모델의 정밀도와 재현율을 모두 고려하여 계산된다. 따라서 불균형한 클래스 크기에 대해 더 안정적인 성능 측정을 제공한다. 여기서 0과 1 클래스에 대한 f1-score는 각각 0.86과 0.78이다.
  • support: 각 클래스의 샘플 수를 나타낸다. 여기서 클래스 0과 1에 대한 샘플 수는 각각 58과 42이다.
  • accuracy: 모델이 올바르게 분류한 전체 샘플의 비율이다. 여기서 정확도는 0.83이다.
  • macro avg: 클래스별 지표의 평균값을 계산한 것으로, 단순 평균을 취한다.
  • weighted avg: 클래스별 지표의 가중 평균을 계산한 것으로, 각 클래스의 지지도를 가중치로 사용하여 평균을 계산함

 

 

 

 

confusion matrix을 히트맵으로 보기

 

sb.heatmap(data=cm, cmap='RdPu',annot=True) 

plt.show()

 

# annot은 도표 안의 주석(데이터를 숫자로 표현)을 나타낸다