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)
'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])
데이터의 성능이 필요이상으로 좋을 경우 과적합을 우려할 수 있다. 그렇기 때문에 패널티과정을 거쳐 규제를 가하게 되는데, 이러한 과정은 위의 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)
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
총 갯수 : 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
매번 학습하는 일을 피하기위해 최적의 학습모델이 생성되었다면 저장한다.
저장한 모델 파일을 읽고, 새로운 데이터로 예측해보자
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)