2 분 소요

분류 모델 실습

pima-indians-diabetes.csv 파일을 읽어서, 당뇨병을 분류하는 모델을 만드시오.

컬럼 정보 :

Preg=no. of pregnancy

Plas=Plasma

Pres=blood pressure

skin=skin thickness

test=insulin test

mass=body mass

pedi=diabetes pedigree function

age=age

class=target(diabetes of not, 1:diabetic, 0:not diabetic)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb

%matplotlib inline

import platform

from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False

if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    path = "c:/Windows/Fonts/malgun.ttf"
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family=font_name)
else:
    print('Unknown system... sorry~~~~')
df = pd.read_csv('pima-indians-diabetes.csv')
df
Preg Plas Pres skin test mass pedi age class
0 6 148 72 35 0 33.6 0.627 50 1
1 1 85 66 29 0 26.6 0.351 31 0
2 8 183 64 0 0 23.3 0.672 32 1
3 1 89 66 23 94 28.1 0.167 21 0
4 0 137 40 35 168 43.1 2.288 33 1
... ... ... ... ... ... ... ... ... ...
763 10 101 76 48 180 32.9 0.171 63 0
764 2 122 70 27 0 36.8 0.340 27 0
765 5 121 72 23 112 26.2 0.245 30 0
766 1 126 60 0 0 30.1 0.349 47 1
767 1 93 70 31 0 30.4 0.315 23 0

768 rows × 9 columns

df.isna().sum()
Preg     0
Plas     0
Pres     0
skin     0
test     0
mass     0
pedi     0
age      0
class    0
dtype: int64
sb.countplot(data=df,x='class')
plt.show()

12

X = df.iloc[:,:8]
y= df['class']
# preg 컬럼은 0이 들어가도 된다.
# 이 컬럼을 제외한 나머지 컬럼들에 0이 있으면 모두 np.nan으로 변경
X.iloc[:,1:] = X.iloc[:,1:].replace(0,np.nan)
X.describe()
Preg Plas Pres skin test mass pedi age
count 768.000000 763.000000 733.000000 541.000000 394.000000 757.000000 768.000000 768.000000
mean 3.845052 121.686763 72.405184 29.153420 155.548223 32.457464 0.471876 33.240885
std 3.369578 30.535641 12.382158 10.476982 118.775855 6.924988 0.331329 11.760232
min 0.000000 44.000000 24.000000 7.000000 14.000000 18.200000 0.078000 21.000000
25% 1.000000 99.000000 64.000000 22.000000 76.250000 27.500000 0.243750 24.000000
50% 3.000000 117.000000 72.000000 29.000000 125.000000 32.300000 0.372500 29.000000
75% 6.000000 141.000000 80.000000 36.000000 190.000000 36.600000 0.626250 41.000000
max 17.000000 199.000000 122.000000 99.000000 846.000000 67.100000 2.420000 81.000000
X.isna().sum()
Preg      0
Plas      5
Pres     35
skin    227
test    374
mass     11
pedi      0
age       0
dtype: int64
# 현재 X 와 y로 분리한 상태에서 0을 NaN으로 바꿨다.
# 따라서 Nan을 삭제할 경우! y 도 함께 처리해줘야 하는데, 어렵다.
# 그러므로 NaN 을 삭제하고 싶으면, X와 y 분리 전에 해줘야 한다.
# 이 예에서는, Nan을 각 컬럼의 평균값으로 채우는 전략을 사용한다.
X = X.fillna(X.mean())
X.isna().sum()
Preg    0
Plas    0
Pres    0
skin    0
test    0
mass    0
pedi    0
age     0
dtype: int64
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 학습용 데이터와 테스트용 데이터.
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state= 10)
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression(random_state=10)
classifier.fit(X_train,y_train)
LogisticRegression(random_state=10)
y_pred = classifier.predict(X_test)
from sklearn.metrics import confusion_matrix
cm=confusion_matrix(y_test,y_pred)
cm
array([[84, 11],
       [29, 30]], dtype=int64)
from sklearn.metrics import classification_report
print(classification_report(y_test,y_pred))
              precision    recall  f1-score   support

           0       0.74      0.88      0.81        95
           1       0.73      0.51      0.60        59

    accuracy                           0.74       154
   macro avg       0.74      0.70      0.70       154
weighted avg       0.74      0.74      0.73       154
# 컨퓨전 메트릭스를, 히트맵으로 그려서 보기
sb.heatmap(data=cm,annot=True, cmap='RdPu',linewidths=5)
plt.show()

12

댓글남기기