본문 바로가기

데이터/머신러닝

2.4 로지스틱 회귀(Logistic Regression)

해당 글은 코드잇 강의를 참고하여 작성되었습니다.

- 분류문제

  • 선형 회귀로도 풀 수 있지만 예외적인 데이터의 변화에 민감하게 반응해서 잘 사용하지 않는다.

 

- 로지스틱 회귀

  • 일차 함수가 아닌 시그모이드 함수를 사용한다. 
  • 시그모이드 함수 : 0≤X≤1 
  • 가설 함수
    • 분류를 구별하는 경계선 = Decision Boundary
      위와 같은 의미의 함수

 

- 로지스틱 회귀 손실 함수

  • 로그 손실 사용
  • 로지스틱 회귀 손실 함수

 

- 로지스틱 회귀 경사 하강법

  • 선형회귀와 식이 같다! 단지 가설 함수 hθ​(x)가 시그모이드 함수일뿐

    import numpy as np
    
    def sigmoid(x):
        """시그모이드 함수"""
        return 1 / (1 + np.exp(-x))
        
        
    def prediction(X, theta):
        """로지스틱 회귀 가정 함수"""
        # 지난 과제에서 작성한 코드를 갖고 오세요
        return sigmoid(X @ theta)
    
    def gradient_descent(X, theta, y, iterations, alpha):
        """로지스틱 회귀 경사 하강 알고리즘"""
        m = len(X)  # 입력 변수 개수 저장
    
        for _ in range(iterations):
            # 코드를 쓰세요
            error = prediction(X, theta) - y
            theta = theta - alpha / m * (X.T @ error)
                
        return theta
        
        
    # 입력 변수
    hours_studied = np.array([0.2, 0.3, 0.7, 1, 1.3, 1.8, 2, 2.1, 2.2, 3, 4, 4.2, 4, 4.7, 5.0, 5.9])  # 공부 시간 (단위: 100시간)
    gpa_rank = np.array([0.9, 0.95, 0.8, 0.82, 0.7, 0.6, 0.55, 0.67, 0.4, 0.3, 0.2, 0.2, 0.15, 0.18, 0.15, 0.05]) # 학년 내신 (백분률)
    number_of_tries = np.array([1, 2, 2, 2, 4, 2, 2, 2, 3, 3, 3, 3, 2, 4, 1, 2])  # 시험 응시 횟수
    
    # 목표 변수
    passed = np.array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1])  # 시험 통과 여부 (0: 탈락, 1:통과)
    
    # 설계 행렬 X 정의
    X = np.array([
        np.ones(16),
        hours_studied,
        gpa_rank,
        number_of_tries
    ]).T
    
    # 입력 변수 y 정의
    y = passed
    
    theta = [0, 0, 0, 0]  # 파라미터 초기값 설정
    theta = gradient_descent(X, theta, y, 300, 0.1)  # 경사 하강법을 사용해서 최적의 파라미터를 찾는다
    theta​

- 분류가 3개 이상일 때 

  • 각각의 분류의 가설 함수를 계산해 가장 높은 확률로 분류

 

**로지스틱 회귀는 정규방정식으로 구할 수 없다. 단순히 미분만으로 convex를 구할 수 없기 때문

 

- scikit-learn으로 로지스틱 회귀 구현

# 필요한 라이브러리 import
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

import pandas as pd  

wine_data = datasets.load_wine()
""" 데이터 셋을 살펴보는 코드
print(wine_data.DESCR)
"""

# 입력 변수를 사용하기 편하게 pandas dataframe으로 변환
X = pd.DataFrame(wine_data.data, columns=wine_data.feature_names)

# 목표 변수를 사용하기 편하게 pandas dataframe으로 변환
y = pd.DataFrame(wine_data.target, columns=['Y/N'])

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=5)
y_train=y_train.values.ravel()
logistic_model=LogisticRegression(solver='saga', max_iter=7500)
logistic_model.fit(X_train, y_train)
y_test_predict=logistic_model.predict(X_test)

# 테스트 코드
score = logistic_model.score(X_test, y_test)
y_test_predict, score

'데이터 > 머신러닝' 카테고리의 다른 글

3.2 정규화  (0) 2021.07.24
3.1 데이터 전처리  (0) 2021.07.23
2.3 다항 회귀(Polynomial Regression)  (0) 2021.07.22
2.2 다중 선형 회귀(Multiple Linear Regression)  (0) 2021.07.22
2.1 선형 회귀(Linear Regression)  (0) 2021.07.21