Pythonで基礎から機械学習 「ロジスティック回帰分析」 의 번역본.
https://qiita.com/karaage0703/items/417934d82ac3c3c5f70e
Pythonで基礎から機械学習 「ロジスティック回帰分析」 - Qiita
はじめに この「Pythonで基礎から機械学習」シリーズの目的や、環境構築方法、シリーズの他の記事などは以下まとめページを最初にご覧下さい。 Pythonで基礎から機械学習まとめ 今回は
qiita.com
여러 수식을 표기하고 있기 때문에, 모바일 버전에서 보는 것보다, PC버전에서 보는 것이 적합합니다.
21(일) / PM 7:58 첫 작성
*오타, 오역, 의역 좀 있음*
*이산적 (離散的) - 서로 단절되는. 또는 그런 것. 연속되는 것과 반대되는 것으로 0, 1, 2, 3 따위와 같이 서로 단절되는 값들을 이르는 말이다.
시작하며
이 [Python으로 기초부터 기계학습] 시리즈의 목적이나, 환경 구축 방법, 시리즈의 다른 기사들은 아래의 모음집을 참고해주세요.
이번에는, Python으로 기초부터 기계학습 [단회귀 분석], Python으로 기초부터 기계학습 [중회귀 분석] 을 읽었다는 것을 전제로 한 내용입니다.
또, 본 게시글에서는, 초심자가 자습을 위해 개인적으로 모음집을 공개하고 있는 기사입니다.
따라서, 기사에 잘못된 표기, 오류가 있을 가능성이 높습니다.
미리 양해 부탁드립니다.
더 개선하고 싶기 때문에, 만약 실수를 알아채신 분들은, 편집 요청이나 코멘트를 주신다면 감사하겠습니다.
본 게시글의 코드는, Google Colaboratory에서 실행하는 걸 상정하고 있습니다.
본 기사를 사용한 Google Colab의 Notebook은 아래와 같습니다.
03_logistic_regression.ipynb (일본어)
로지스틱 회귀 분석이란
로지스틱 회귀는, 주로 확률의 문제나 분류 문제를 다룰 때 사용됩니다.
확률이나 분류는 0이나 1, 0%~100%인 일정한 범위에서 다뤄집니다.
예를 들어 강수확률은 0~100%으로 표현됩니다.
분류의 경우는, 컴퓨터에서는 이 사진이 고양이인지 아닌지, 이 사진이 개인지 아닌지는 0 or 1로 표현됩니다 (0.0~1.0의 확률로 표현하는 경우도 있습니다).
이 경우, 지금까지 배웠던 단회귀 분석, 중회귀 분석에서는 다루기 어렵기 때문에, 로지스틱 회귀라고 하는 것을 사용할 수 있습니다.
지금까지의 예측을 더해, 분류에서도 사용하기 쉬운 것이 포인트네요 (회귀라는 이름이 헷갈립니다만)
시그모이드 함수
제일 처음으로, 로지스틱 회귀에서 중요한 역할을 가진, 시그모이드 함수에 관해서 설명하겠습니다.
로지스틱 회귀에서는, 결과를 일정한 범위 (구체적으로는 0~1) 로 제한하기 위해, 시그모이드 함수 (로지스틱 함수라고도 불립니다) 를 사용합니다.
같은 함수인데도 다르게 부르는 역사적 경위 (사용되는 분야가 다르기 때문) 인 듯합니다.
시그모이드 함수는 아래와 같습니다.
$${f(x) = \frac{1}{1 + e^{-ax}}}$$
그래프로 가시화해보겠습니다.
import numpy as np
import matplotlib.pylab as plt
import seaborn as sns
def sigmoid(x):
return 1/(1 + np.exp(-x))
x = np.arange(-5.0, 5.0 , 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()
시그모이드 함수는, 아래의 사진과 같이, \(x\)에 어떠한 값을 입력해도, 결과가 0~1의 사이에 들어가는 매우 편한 함수입니다.
특히, 딥러닝에서의 계산은 0~1의 범위에서 결과를 얻을 수 있으면, 편리하기 때문에, 시그모이드 함수는 딥러닝에서도 활성화 함수라고 불립니다. (최근에는 계산량의 관계로 ReLU를 사용하는 일이 많습니다만).
로지스틱 회귀에서는, 이 시그모이드 함수의 \(ax\)에, 중회귀의 식을 넣은 아래의 식을 상정합니다.
$${p = \frac{1}{1 + e^{-(w_0 + w_1 x_1 + w_2 x_2 + \cdots + w_n x_n)}}}$$
보기 어렵기 때문에, 행렬을 사용하면 아래와 같이 표시할 수 있습니다.
$${p = \frac{1}{1 + e^{-{\boldsymbol w}^{\mathrm{T}} \boldsymbol x_n}}}$$
중회귀의 식은 좌변이 \(y\)였지만, 로지스틱 회귀에서는 0~1의 확률이 되기 때문에, \(p\)를 사용하는 것이 일반적입니다.
이 모델을 주어진 데이터에 적용해, 식의 \(w\) 즉 중회귀 분석을 할 때에 구해진 중회귀 계수와 절편 변회귀 (切片変回帰) 계수를 구하는 것이 로지스틱 회귀 분석입니다.
또, 상기식(上記式)은, 아래와 같이 변형 가능합니다.
$${\log (\frac{p}{1-p}) = \boldsymbol w^{\mathrm{T}} \boldsymbol x_n }$$
좌변의 \(\frac{p}{1-p}\)는, 오즈(odds)라고 불리는 확률용어 (갬블에서도 많이 쓰입니다) 이므로, 확률을 선형 합으로 표현한 것이라는 설명도 할 수 있습니다 (이쪽이 일반적일지도 모르겠습니다).
덧붙여서, 여기까지의 설명은 이진분류라고 불리는, 데이터를 두가지로 분류하는 경우 (예를 들면, 고양이인지 개인지) 의 이야기입니다만,
로지스틱 회귀는, 개, 고양이, 인간과 같이 두개 이상으로 분류하는 다항 분류의 문제를 푸는 것도 가능합니다.
그 경우는, 편회귀 계수의 벡터가 행렬로, 시그모이드 함수를 소프트맥스 함수로 바꿀 필요가 있습니다.
[딥러닝의 수학]이란 책에 자세히 써져 있습니다. 아래의 기사를 참조해 주세요.
연휴에 [딥러닝의 수학] 과 [친밀한 수학]과 [Google Colaboratory (Python)] 으로 차분히 수학을 복습했습니다. (일본어)
scikit-learn을 사용한 로지스틱 회귀 분석
그러면 scikit-learn을 사용한 로지스틱 회귀입니다만, 확률예측과 클래스 분류예 관해서 정말로 알기 쉽게 모아준 페이지가 있었으므로, 링크하겠습니다.
설명도 코드도 꼼꼼해 알기 쉽습니다. 그러므로 scikit-learn으로 분석에 관해서는 이 게시글에서는 생략합니다.
Scikit-learn으로 로지스틱 회귀 (확률예측편) (일본어)
Scikit-learn으로 로지스틱 회귀 (클래스 분류편) (한국어)
로지스틱 회귀 분석 방법
여기서, 지금까지와 같이 scikit-learn을 사용하지 않고, 실제로 계산해서 로지스틱 회귀 분석의 해를 구해보고 싶습니다.
그런데, 로지스틱 회귀의 경우, 특히 0,1의 이진분류의 경우, 단회귀나 중회귀로 했었던 것 처럼, 최소제곱법을 기초로 행렬계산으로 해석의 답을 구하는 것은 불가능한 것 같습니다.
그러므로, 답을 구하는 것은 경사 하강법등의 탐색 알고리즘으로, 임의의 값부터 수차계산을 해 나감으로써 해공간을 탐색해 근사값을 구하게 됩니다.
이런 탐색 알고리즘을 사용한 해의 탐색은, 사실은 딥러닝에서도 사용되는 수법입니다.
분류문제에 사용되는 알고리즘
로지스틱 회귀가 분류문제에도 사용될 수 있다는 이야기를 했습니다만, 로지스틱 회귀는 선형분류 모델이라고 불려, 풀 수 없는 분류문제가 있습니다. (대표적인 것은 XOR).
분류 문제에는, 로지스틱 회귀 이외에도, 여러 알고리즘이 있습니다. 대표적인 것은 아래와 같습니다.
- 결정 트리
- SVM
- 뉴럴 네트워크 (딥 러닝)
특히, SVM은 선형분류 모델입니다만, 커널 트릭이라고 하는 테크닉을 사용해 비선형인 분류문제도 풀 수 있는 수법입니다.
딥러닝이 화제가 되기 전에는, 분류문제라고 하면 SVM이였던 모양입니다.
SVM은 이전에 잠깐 해봤었기 때문에, 관심이 있으신 분은 아래의 게시글을 참고해주세요.
SVM (서포트 벡터 머신) 과 python으로 하늘의 사진으로 날씨의 판정해보자 (일본어)
또, 딥러닝을 포함한 뉴럴 네트워크도, 분류 문제를 풀 수 있습니다.
실은, 뉴럴 네트워크 중에서도 가장 단순한 퍼셉트론이라고 불리는 모델은 선형 분류입니다만, 복수층을 중첩하는 것으로 비선형 문제가 풀릴 수 있게 됩니다.
이 복수층을 겹친 뉴럴 네트워크가 딥러닝의 베이스가 되는 것입니다.
모음
간단하지만, 이번에는 이걸로 끝입니다. 의욕이 없는 것은 아닙니다. 조금 휴식하고 싶을 뿐입니다.
로지스틱 회귀까지 오면, 시그모이드 함수나 경사하강법 등이 나오기 때문에, 점점 딥러닝에 가까워진 기분이 드네요 (기분탓?)
분류문제의 결정 트리나 SVM도 정말로 관심있는 분야입니다만, 앞으로의 예정으로는 경사하강법 등의 알고리즘을 다룬 후에,
한번에 뉴럴 네트워크 (딥러닝) 로 가볼까 생각 중입니다.
코멘트
*원 작성자의 트위터에 올라온 글에 관련한 코멘트
로짓 (odds) (치역이 실수 전체)을 선형회귀로 구하려고 하면 로지스틱 회귀가 된다.
로그 선형 모델의 한 종류.
그러므로 분류가 아닌 회귀라고 이름이 붙는다.
선형 회귀에서의 값이 1보다 커지면, odds에서 분자 쪽이 크기 때문에, 결과적으로 분자측의 사건에 입력을 이산적*으로 할당하는 분류에 응용 가능하다.
덧붙여서, 분자측의 사건이 파라미터 \(p\)의 베르누이 분포에 따라간다고 가정할때, 최대가능도 방법 (最尤推定; 최대우도법)을 시도해보면 예의 교차 엔트로피라고 불리는 가능도(우도) 함수를 얻을 수 있다.
이런 의미로, 시그모이드 함수를 우변에 옮겼을 때의 출력 \(p\)는, 입력 데이터에 의존한 베르누이 분포의 파라미터가 된다.
참고 링크 (일본어)
ロジスティック回帰とは?理論からRでの実装!|スタビジ
当サイト【スタビジ】の本記事では、ロジスティック回帰についてRでの実装と共に見ていきます。ロジスティック回帰は2値分類問題において解釈がしやすく実務の場でもよく用いられてい
toukei-lab.com
Pythonではじめる機械学習 線形モデル - Qiita
はじめに 線形モデルによる回帰から,教師あり機械学習を見ていく 線形モデルによる回帰 線形モデルとは線型関数を用いて予測を行うものである。回帰問題では線型モデルによる予測式は
qiita.com
'전공' 카테고리의 다른 글
도쿄공업대학 기계학습 강좌 자료 (0) | 2021.12.17 |
---|---|
선린 소수전공 리버싱 과제 (0) | 2021.07.14 |
Scikit-learn으로 로지스틱 회귀 (클래스 분류편) (1) | 2021.01.25 |
Scikit-learn(사이킷런)으로 선형회귀 (0) | 2020.09.24 |