Python 데이터 분석

Logistic Regression(로지스틱 회귀분석) 예제(당뇨 데이터), 로지스틱 회귀분석 후 저장 후 불러쓰기

코딩탕탕 2022. 11. 18. 10:58

 

# pima-indians-diabetes dataset으로 당뇨병 유무 분류 모델
import pandas as pd
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression

url = "https://raw.githubusercontent.com/pykwon/python/master/testdata_utf8/pima-indians-diabetes.data.csv"
names = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome']
df = pd.read_csv(url, names = names, header = None)
print(df.head(3), df.shape) # (768, 9)

array = df.values #matrix로 호출
print(array)
x = array[:, 0:8] # 2차원
y = array[:, 8]   # 1차원
print(x.shape, y.shape) # (768, 8) (768,)

x_train, x_test, y_train, y_test = model_selection.train_test_split(x, y, test_size = 0.3, random_state = 7)
print(x_train.shape, x_test.shape) # (537, 8) (231, 8)

model = LogisticRegression()
model.fit(x_train, y_train)
print('예측값 :', model.predict(x_test[:10]))
print('실제값 :', y_test[:10])
print((model.predict(x_test) != y_test).sum()) # 57
print('test로 검정한 분류 정확도 :', model.score(x_test, y_test))    # 0.75324
print('train로 확인한 분류 정확도 :', model.score(x_train, y_train)) # 0.78212 둘의 차이가 크면 좋지 않다.

from sklearn.metrics import accuracy_score
pred = model.predict(x_test)
print('분류 정확도 :', accuracy_score(y_test, pred)) 

import joblib
import pickle

# 학습이 끝난 모델은 저장 후 읽어 사용하도록 한다.
# joblib.dump(model, 'pima_model.sav')
pickle.dump(model, open('pima_model.sav', 'wb'))

# mymodel = joblib.load('pima_model.sav')
mymodel = pickle.load(open('pima_model.sav', 'rb'))
print('test로 검정한 분류 정확도 :', mymodel.score(x_test, y_test))    # 0.75324

# 새로운 값으로 예측
print(x_test[:1])
print(mymodel.predict([[1., 90., 62., 12., 43., 27.2, 0.58, 24.]]))




<console>
   Pregnancies  Glucose  BloodPressure  ...  DiabetesPedigreeFunction  Age  Outcome
0            6      148             72  ...                     0.627   50        1
1            1       85             66  ...                     0.351   31        0
2            8      183             64  ...                     0.672   32        1

[3 rows x 9 columns] (768, 9)
[[  6.    148.     72.    ...   0.627  50.      1.   ]
 [  1.     85.     66.    ...   0.351  31.      0.   ]
 [  8.    183.     64.    ...   0.672  32.      1.   ]
 ...
 [  5.    121.     72.    ...   0.245  30.      0.   ]
 [  1.    126.     60.    ...   0.349  47.      1.   ]
 [  1.     93.     70.    ...   0.315  23.      0.   ]]
(768, 8) (768,)
(537, 8) (231, 8)

예측값 : [0. 1. 1. 0. 0. 0. 0. 0. 1. 0.]
실제값 : [0. 1. 1. 0. 1. 1. 0. 1. 0. 0.]
57
test로 검정한 분류 정확도 : 0.7532467532467533
train로 확인한 분류 정확도 : 0.7821229050279329
분류 정확도 : 0.7532467532467533
test로 검정한 분류 정확도 : 0.7532467532467533
[[ 1.   90.   62.   12.   43.   27.2   0.58 24.  ]]
[0.]

로지스틱 회귀분석을 한 뒤에는 프로젝트에서 사용할 경우 저장한 뒤에 불러서 사용한다. 그 이유는 화면이 로딩될 때마다 학습되기 때문에 효율이 안 좋기 때문이다.