로지스틱 회귀분석 (다항분류)

kangjuju·2023년 5월 15일
0

회귀분석

목록 보기
8/11

  • 소프트맥스 함수
    • 소프트맥스는 세 개 이상으로 분류하는 다중 클래스 분류에서 사용되는 활성화 함수다.
    • 소프트맥스 함수는 분류될 클래스가 n개라 할 때, n차원의 벡터를 입력받아, 각 클래스에 속할 확률을 추정한다.

✏️iris 다항분류

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression #다중클래스(레이블) 을 지원
from sklearn.preprocessing import StandardScaler

iris = datasets.load_iris()

x = iris.data[:,[2,3]] 
y = iris.target

# 과적합 방지를 목적으로 train(모델 학습용) / test(모델 검정용)로 데이터 분리 (7:3)
x_train,x_test, y_train,y_test = train_test_split(x,y,test_size=0.3, random_state=0)
  1. 사용된 종속,독립변수 : 'petal length (cm)', 'petal width (cm)'

1-1. 표준화 / 정규화

변수데이터 크기가 너무 크거나 제각각일 경우 기존 데이터의 성질을 유지한채 일정 범위 내로 정규화,표준화를 할 수 있다.
iris 는 넘겨도 되는 과정이지만, 데이터의 단위가 각기 다를 때 하면 좋다.

# 표준화 / 정규화
print(x_train[:3])
sc = StandardScaler()
sc.fit(x_train); sc.fit(x_test)
x_train = sc.transform(x_train)
x_test= sc.transform(x_test)
print(x_train[:3])

# 스케일링 원상복구
inver_x_train = sc.inverse_transform(x_train)
print(inver_x_train[:3])
  1. LogisticRegression 분류 모델 생성

데이터의 성능이 필요이상으로 좋을 경우 과적합을 우려할 수 있다. 그렇기 때문에 패널티과정을 거쳐 규제를 가하게 되는데, 이러한 과정은 위의 train_test_split 로도 했다.
이 외에도 규제방법은 다양한데, 아래 코드에서는 파라미터를 이용했다.
파라미터는 API를 참조하자

# 모델 생성
model = LogisticRegression(C=1.0,solver='lbfgs',max_iter=100,\
                        			   multi_class = 'auto',verbose=0)\
model.fit(x_train,y_train)
  1. 검정-예측 predict

x_test 값으로 검정. 예측된 y_pred 를 확인하자

# 분류 예측
y_pred = model.predict(x_test)
print('예측값 : ', y_pred) #2 1 0 2 0 2 0..
print('실제값 : ', y_test) #2 1 0 2 0 2 0..

print('총 갯수 : %d 에러 수 : %d'%(len(y_test),(y_test != y_pred).sum())) 

#분류정확도 확인법1 accuracy_score
print('분류정확도 : %.5f'%accuracy_score(y_test,y_pred))

#분류정확도 확인법2 pandas confusion matrix
con_mat = pd.crosstab(y_test,y_pred,rownames=['예측치'],colnames=['관측치'])
print(con_mat)

#분류정확도 확인법3
print('test : ',model.score(x_test,y_test))
print('train : ',model.score(x_train,y_train))

방법3 에서는 원본데이터만으로 확인했으며 predict를 사용하지않는다.
학습과 검정데이터는 패턴이 비슷한 데이터이다. model.score로 비교해보았을때 수치의 차이가 크면 문제가 있는것.

  1. result
# 1
총 갯수 : 45 에러 수 : 2
분류정확도 : 0.95556
# 2
관측치   0   1   2
예측치            
0    16   0   0
1     0  17   1
2     0   1  10
# 3
test :  0.955
train :  0.952
  1. 모델 save / load

매번 학습하는 일을 피하기위해 최적의 학습모델이 생성되었다면 저장한다.
저장한 모델 파일을 읽고, 새로운 데이터로 예측해보자

import pickle #저장
pickle.dump(model,open('logimodel.dat', 'wb')) #type : write binary
del model  #삭제

#모델 읽기
mymodel = pickle.load(open('logimodel.dat','rb'))

print('새로운 값으로 분류 예측')
new_data = np.array([[5.1,2.4],[4.,1.],[1.4,0.2],[1.,1.]])
new_pred = mymodel.predict(new_data)
print(new_pred) 
#예측 결과 값 : [2 2 1 2]
print('softmax 결과',mymodel.predict_proba(new_data))
  • 참고 : 데이터 표준화를 한 경우
    sc.fit(new_data); new_data=sc.transform(new_data)
    새로운 데이터 또한 표준화를 한다.

0개의 댓글

관련 채용 정보