TIL 48:論理回帰
18983 ワード
🙄 ろんりかいふく
ろんりかいふく
しんごうかんすう
🙄 仮定関数
仮定関数
次に,
gggで
θ\thetaθ = [θ0θ1θ2..θn]\begin{bmatrix}\theta_0\\\theta_1\\\theta_2\\.\\.\\\theta_n\end{bmatrix}⎣⎢⎢⎢⎢⎢⎢⎢⎡θ0θ1θ2..θn⎦⎥⎥⎥⎥⎥⎥⎥⎤
xxx = [1x1x2..xn]\begin{bmatrix}1\\x_1\\x_2\\.\\.\\x_n\end{bmatrix}⎣⎢⎢⎢⎢⎢⎢⎢⎡1x1x2..xn⎦⎥⎥⎥⎥⎥⎥⎥⎤
gθ(x)=θ0x0+θ1x1+θ2x2+...θnxng_\theta(x)=\theta_0x_0+\theta_1x_1+\theta_2x_2+...\theta_nx_ngθ(x)=θ0x0+θ1x1+θ2x2+...θnxn
gθ(x)=θTxg_\theta(x)=\theta^Txgθ(x)=θTx
hθ(x)=11+e−gθ(x)h_\theta(x)=\frac{1}{1+e^{-g_\theta(x)}}hθ(x)=1+e−gθ(x)1
hθ(x)=11+e−θTxh_\theta(x)=\frac{1}{1+e^{-\theta^Tx}}hθ(x)=1+e−θTx1
🙄 そんしつかんすう
ログロス(log-loss,クロスエントロピー)
ログ損失
logloss(hθ(x),y)={−log(hθ(x))y=1−log(1−hθ(x))y=0logloss(h_\theta(x), y) =\begin{cases} -\log(h_\theta(x)) &\text{y=1}\\-\log(1-h_\theta(x)) &\text{y=0}\end{cases}logloss(hθ(x),y)={−log(hθ(x))−log(1−hθ(x))y=1y=0
logloss(hθ(x),y)=−ylog(hθ(x))−(1−y)log(1−hθ(x))logloss(h_\theta(x),y)=-y\log(h_\theta(x))-(1-y)\log(1-h_\theta(x))logloss(hθ(x),y)=−ylog(hθ(x))−(1−y)log(1−hθ(x))
ログ損失は、実際のOutputyyyが1と0に分けられます.
yyyが1の場合、予測値が1に近づくほど損失は0に近づき、遠くなるほど損失は急峻になる
yyyが0の場合は正反対
ログ損失関数
🙄 けいしゃこうかほう
けいしゃこうかほう
θ0=θ0−α∂∂θ0J(θ)\theta_0=\theta_0-\alpha\frac{\partial}{\partial\theta_0}J(\theta)θ0=θ0−α∂θ0∂J(θ)
θ1=θ1−α∂∂θ1J(θ)\theta_1=\theta_1-\alpha\frac{\partial}{\partial\theta_1}J(\theta)θ1=θ1−α∂θ1∂J(θ)
θ2=θ2−α∂∂θ2J(θ)\theta_2=\theta_2-\alpha\frac{\partial}{\partial\theta_2}J(\theta)θ2=θ2−α∂θ2∂J(θ)
θj=θj−α1m∑i=1m(hθ(x(i))−y(i))∗xj(i)\theta_j=\theta_j-\alpha\frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})*x_j^{(i)}θj=θj−αm1∑i=1m(hθ(x(i))−y(i))∗xj(i)
簡略傾斜降下法
傾斜降下法の実施
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
# array([-1.35280508, 1.61640725, -1.83666046, -0.60286277])
🙄 せいそくほうていしき
正規方程式
🙄 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값 예측
y_test_predict = logistic_model.predict(X_test)
# 테스트 코드
score = logistic_model.score(X_test, y_test)
y_test_predict, score
# (array([0, 1, 0, 0, 2, 2, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0,
# 1, 1, 1, 0, 1, 2, 0, 1, 1, 0, 0, 0, 2]), 0.72222222222222221)
Reference
この問題について(TIL 48:論理回帰), 我々は、より多くの情報をここで見つけました https://velog.io/@wumusill/TIL49-로지스틱-회귀テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol