25.05.19 코딩 공부 시작

코딩 척척석박사 분들 피드백 환영합니다.

공대생이 코딩에서 살아남기

강의자료/머신러닝의 이해와 라이브러리 활용

3강. 로지스틱회귀(범주/카테고리 분류)(06.26,27)

코딩 아가 2025. 6. 30. 19:13

로지스틱회귀란?

  • 범주형 데이터 분류 분석
  • 선형회귀(숫자)와 반대 개념

이론

X가 연속형 함수일 때, 범주형 Y에서 선형함수의 한계 >> S자 형태의 함수 적용 후 설명

오즈비에 log를 붙여 값 낮추기

해석: XX값이 w_1만큼 증가하면 오즈비는 (e^w1)만큼 증가한다.

ex. 타이타닉

import pandas as pd
import seaborn as sns

titanic_df = pd.read_csv('C:/Users/2552y/OneDrive/바탕 화면/내일배움캠프/강의 자료/titanic/train.csv', encoding='utf-8')
titanic_df.head(3)

 

가설1: 비상상황 특성상 여성을 배려해서 여성이 남성보다 생존율이 높을 것이다.

  • pivot table 만들어 확인
pd.pivot_table(titanic_df, index = 'Sex', columns = 'Survived', aggfunc = 'size')

  • 그래프 통해서 확인
sns.countplot(titanic_df, x = 'Sex', hue = 'Survived')

분류 평가 지표

1. 정확도와 F1-Score

혼동행렬

  • TP: 실제로 양성(암 환자)이면서 양성(암 환자) 올바르게 분류된 수
  • FP: 실제로 음성(정상인)이지만 양성(암 환자)로 잘못 분류된 수
  • FN: 실제로 양성(암 환자)이지만 음성(정상인)로 잘못 분류된 수
  • TN: 실제로 음성(정상인)이면서 음성(정상인)로 올바르게 분류된 수
  1. 정밀도(Precision)         
  2. 재현율(Recall)             
  3. F1-Score                     
  4. 정확도(Accuracy)         

로지스틱회귀 실습(타이타닉)

자주쓰는 함수

sklearn.linear_model.LogisticRegression : 로지스틱회귀 모델 클래스

  • 속성
    1. classes_: 클래스(Y)의 종류
    2. n_features_in_ : 들어간 독립변수(X) 개수
    3. feature_names_in_: 들어간 독립변수(X)의 이름
    4. coef_: 가중치
    5. intercept_: 바이어스
  • 메소드
    1. fit: 데이터 학습
    2. predict: 데이터 예측
    3. predict_proba: 데이터가 Y = 1일 확률을 예측

sklearn.metrics.accuracy: 정확도

sklearn.metrics.f1_socre: f1_score

단일회귀

#Y(Survived)
#X(수치형): Fare

[훈련하기]

1. 라이브러리 설치 및 적용

import numpy as np
import matplotlib.pyplot as plt
import sklearn
import pandas as pd
import seaborn as sns

2. 변수 지정

X_1 = titanic_df[['Fare']]
y_true = titanic_df[['Survived']]

3. 산점도 확인하기

sns.scatterplot(titanic_df, x = 'Fare', y = 'Survived')

4. 머신러닝 베이스 생성 및 학습

from sklearn.linear_model import LogisticRegression
model_lor = LogisticRegression()
model_lor.fit(X_1, y_true)

5. 모델 넣고 확인하기

def get_att(X):
    #X모델을 넣기
    print('클래스 종류', X.classes_)
    print('독립변수 개수', X.n_features_in_)
    print('들어간 독립변수(X)의 이름', X.feature_names_in_)
    print('가중치(회귀계수)', X.coef_)
    print('바이어스(절편)', X.intercept_)
    
get_att(model_lor)
#클래스 종류 [0 1]
#독립변수 개수 1
#들어간 독립변수(X)의 이름 ['Fare']
#가중치(회귀계수) [[0.01519617]]
#바이어스(절편) [-0.94129222]

[평가하기]

1. 정확도 및 f1 score 모델 넣기

from sklearn.metrics import accuracy_score, f1_score
def get_metrics(true, pred):
    print('정확도:', accuracy_score(true, pred))
    print('F1 score:', f1_score(true, pred))

2. 예측값 보기(권장X)(생략)

model_lor.predict(X_1)

 

3. 전체 예측값 확인하기

y_pred_1 = model_lor.predict(X_1)
get_metrics(y_true, y_pred_1)
#정확도: 0.6655443322109988
#F1 score: 0.354978354978355

다중회귀

#Y(Survived)
#X(수치형): Fare
#X(범주형): Plcass, Sex

1. Sex 수치형으로 바꾸기(인코딩)

def get_sex(X):
    if X == 'female':
        return 0
    else:
        return 1
titanic_df['Sex_en'] = titanic_df['Sex'].apply(get_sex)

2. 변수 지정

X_2 = titanic_df[['Fare', 'Pclass', 'Sex_en']]
y_true_2 = titanic_df[['Survived']]

3. 모델 학습

model_lor_2 = LogisticRegression()
model_lor_2.fit(X_2, y_true_2)

4. 모델 확인하기

get_att(model_lor_2)
#클래스 종류 [0 1]
#독립변수 개수 3
#들어간 독립변수(X)의 이름 ['Fare' 'Pclass' 'Sex_en']
#가중치(회귀계수) [[ 1.64019087e-03 -8.88331324e-01 -2.53993425e+00]]
#바이어스(절편) [3.02004403]

5. 예측값 넣고 확인하기

y_pred_2 = model_lor_2.predict(X_2)
get_metrics(y_true_2, y_pred_2)
#정확도: 0.7867564534231201
#F1 score: 0.7121212121212122

6. 특정 상황 넣어보기

# 각 데이터별 Y=1인 확률 뽑아내기(생존할 확률)
model_lor_2.predict_proba(X_2)

비교하기

#단일회귀
get_metrics(y_true, y_pred_1)
#정확도: 0.6655443322109988
#F1 score: 0.354978354978355

#다중회귀
get_metrics(y_true_2, y_pred_2)
#정확도: 0.7867564534231201
#F1 score: 0.7121212121212122