일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- 프로그래머스bfs
- ML
- 프로그래머스 단어변환 bfs
- 머신러닝
- 프로그래머스 단어변환
- 분류
- BOJ 1931
- tensor
- TensorFlow
- 백준 잃어버린괄호
- 코테
- LogisticRegression
- 백준 1931 파이썬
- Machine Learning
- 로지스틱회귀
- BOJ 1541 파이썬
- 프로그래머스 게임맵최단거리 파이썬
- keras
- 프로그래머스 게임맵최단거리
- 코딩테스트
- 프로그래머스 단어변환 파이썬
- BFS
- classification
- BOJ 1541
- 백준 잃어버린괄호 파이썬
- 딥러닝
- 프로그래머스 BFS
- 백준 1541 파이썬
- BOJ 1931 파이썬
- 다중분류
Archives
- Today
- Total
그래도해야지어떡해
[분류 알고리즘] 로지스틱 회귀(Logistic Regression) - 다중분류(multi-class classification) 본문
ML
[분류 알고리즘] 로지스틱 회귀(Logistic Regression) - 다중분류(multi-class classification)
jerrry 2022. 2. 17. 16:01* 이진 분류와 다중 분류에서 로지스틱 회귀의 차이점
이진 분류에서는,
- 하나의 선형 방정식을 훈련
- 훈련된 방정식의 출력값을 시그모이드 함수에 통과시켜 0~1사이의 값 만들기(양성 클래스에 대한 확률)
다중 분류에서는,
- 클래스 개수만큼 방정식을 훈련
- 각 방정식의 출력값을 소프트맥스 함수를 통과시켜 전체 클래스에 대한 합이 항상 1이 되도록 만들기(= 각 클래스에 대한 확률)
* 실습 : 로지스틱 회귀로 다중 분류 수행하기
Logistic Regression을 이용하여 7개의 Class 분류하기
In [1]:
import numpy as np
import pandas as pd
fish = pd.read_csv('https://bit.ly/fish_csv')
In [2]:
fish.head()
Out[2]:
In [3]:
# class들 확인
print(pd.unique(fish['Species']))
In [4]:
# 데이터 프레임을 numpy 배열로 변환
fish_input = fish[['Weight', 'Length', 'Diagonal', 'Height', 'Width']].to_numpy()
np.shape(fish_input)
Out[4]:
In [5]:
print(fish_input[:5])
In [6]:
# 클래스(label)에 해당하는 데이터 프레임을 numpy 배열로 변환
fish_target = fish['Species'].to_numpy()
np.shape(fish_target)
Out[6]:
In [7]:
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(fish_input, fish_target, random_state=42)
In [8]:
np.shape(train_input)
Out[8]:
In [9]:
# 데이터 스케일링(데이터의 범위 조절)
from sklearn.preprocessing import StandardScaler
ss= StandardScaler()
ss.fit(train_input)
Out[9]:
In [10]:
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)
In [11]:
# 로지스틱 회귀는 기본적으로 반복적인 알고리즘 : 충분한 학습을 위해 max_iter=1000으로 설정
# Logistic regression은 기본적을 릿지 회귀와 같이 기본적으로 계수의 제곱을 규제함 -> 이걸 L2규제라고 부름
# 릿지에서의 alpha처럼 L2 규제에서는 C가 그 역할을 함 - 하지만, C는 alpha와는 반대로 값이 작을 수록 규제가 커짐(default 값은 1)
# 여기서는 규제 완화를 위해 20으로 설정
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=20, max_iter=1000)
lr.fit(train_scaled, train_target)
In [12]:
# 5개의 데이터가 어떤 클래스로 예측이 되었는지 확인
print(lr.predict(test_scaled[:5]))
Out[12]:
In [13]:
#5개의 데이터가 각 클래스가 정답이 될 확률 확인 (데이터는 5개, 클래스는 2개이므로 5x2배열 출력)
print(lr.predict_proba(test_scaled[:5]))
Out[13]:
In [14]:
# 위에서 출력된 값의 각 열이 어떤 클래스를 나타내는지 확인
print(lr.classes_)
# 0='Bream', 1='Smelt' - 음성=Bream, 양성=Smelt
Out[14]:
In [16]:
# 5개의 특성을 사용하기 때문에 coef의 배열의 열은 5개이다.
# 클래스가 7개이므로 행이 7이다. 즉, 다중분류는 클래스마다 z값을 하나씩 계산한다. -> 가장 높은 z값을 가지는 클래스가 예측 클래스가 됨
print(lr.coef_.shape, lr.intercept_.shape)
Out[16]:
In [18]:
#각 클래스에 대한 z값을 반환 : z1~z7값 구하기
decision = lr.decision_function(test_scaled[:5])
print(np.round(decision, decimals=2))
Out[18]:
In [19]:
# 사이파이 라이브러리에 있는 소프트맥스 함수를 사용하여 각 샘플(각 행)에 대해 소프트맥스 확률을 계산
from scipy.special import softmax
proba = softmax(decision, axis=1)
print(np.round(proba, decimals=3))
Out[19]:
'ML' 카테고리의 다른 글
하이퍼 파라미터(hyperparameter)란? (0) | 2022.02.21 |
---|---|
검증(Validation)/ 교차검증(cross validation/K-fold cross validation) (0) | 2022.02.21 |
[분류 알고리즘] 로지스틱 회귀(Logistic Regression) - 이진분류(binary classification) (0) | 2022.02.17 |
데이터 분석이란? (0) | 2021.12.14 |
스칼라(scalar), 벡터(Vector), 행렬(Matrix), 텐서(Tensor)란? (0) | 2021.12.11 |
Comments