본문 바로가기

Machine Learning/머신러닝 온라인 강의

CH06_04. 음수 가능 여부 판단 (Python)

1  KNN으로 음수 가능 여부를 판단하기

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


np.random.seed(2022)

 

1.1  1. Data

이번 실습에서 사용할 데이터는 음수가 가능한지를 판단하는 데이터 입니다.

 

1.1.1  1.1 Data Load

water = pd.read_csv("water_potability.csv")

data = water.drop(["Potability"], axis=1)
label = water["Potability"]

 

 

1.1.2  1.2 Data EDA

데이터의 변수들을 확인하겠습니다. count를 확인하면 count들이 다른 것을 확인할 수 있습니다.

data.describe()

 

값이 비어있는 데이터의 개수를 확인해 보겠습니다.

 

data.isna()

 

data.isna().sum()

>>>
ph                 491
Hardness             0
Solids               0
Chloramines          0
Sulfate            781
Conductivity         0
Organic_carbon       0
Trihalomethanes    162
Turbidity            0

 

1.1.3  1.3 Data Preprocess

빈 데이터를 제거하는 전처리를 수행하려 합니다. 빈 데이터를 처리하는 방법은 row를 제거하는 법과 column을 제거하는 방법이 있습니다.

 

1.1.3.1  1.3.1 row를 제거하는 방법

axis가 1이면은 row에서 nan 값을 합산해준다.

data.isna().sum(axis=1)

>>>
    0       1
    1       1
    2       1
    3       0
    4       0
           ..
    3271    0
    3272    2
    3273    1
    3274    1
    3275    1
    Length: 3276, dtype: int64

 

na_cnt = data.isna().sum(axis=1)
na_cnt

>>>
0       1
1       1
2       1
3       0
4       0
       ..
3271    0
3272    2
3273    1
3274    1
3275    1
Length: 3276, dtype: int64

 

drop_idx = na_cnt.loc[na_cnt > 0].index

drop_idx
>>>
Int64Index([   0,    1,    2,    8,   11,   13,   14,   16,   18,   20,
            ...
            3247, 3252, 3258, 3259, 3260, 3266, 3272, 3273, 3274, 3275],
           dtype='int64', length=1265)
           
           
drop_row = data.drop(drop_idx, axis=0)


drop_row = data.drop(drop_idx, axis=0)

 

drop_row.shape
>>> (2011, 9)


data.shape
>>> (3276, 9)

 

1.1.3.2  1.3.2 column을 제거하는 방법

data.isna().sum()
>>>
ph                 491
Hardness             0
Solids               0
Chloramines          0
Sulfate            781
Conductivity         0
Organic_carbon       0
Trihalomethanes    162
Turbidity            0
dtype: int64



na_cnt = data.isna().sum()
drop_cols = na_cnt.loc[na_cnt > 0].index


drop_cols
>>> Index(['ph', 'Sulfate', 'Trihalomethanes'], dtype='object')


data = data.drop(drop_cols, axis=1)


data.isna().sum()
>>> 
Hardness          0
Solids            0
Chloramines       0
Conductivity      0
Organic_carbon    0
Turbidity         0
dtype: int64

이번 실습에서는 컬럼을 제거해서 이후 사용한다.

 

1.1.4  1.4 Data Split

데이터를 Train, Test로 나누겠습니다.

from sklearn.model_selection import train_test_split

train_data, test_data, train_label, test_label = train_test_split(
    data, label, train_size=0.7, random_state=2022
)

print(f"train_data size: {len(train_label)}, {len(train_label)/len(data):.2f}")
print(f"test_data size: {len(test_label)}, {len(test_label)/len(data):.2f}")

>>> 
train_data size: 2293, 0.70
test_data size: 983, 0.30

 

1.2  2. KNN

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()

 

1.2.1  2.1 Best Hyper Parameter

KNeighborsClassifier에서 탐색해야 할 argument들은 다음과 같습니다.

  • n_neighbors
    • 몇 개의 이웃으로 예측할 것 인지 정합니다.
  • p
    • 거리를 어떤 방식으로 계산할지 정합니다.
    • 1: manhattan distance
    • 2: euclidean distance

 

from sklearn.model_selection import GridSearchCV

 

1.2.1.1  2.1.1 탐색 범위 선정

params = {
    "n_neighbors": [i for i in range(1, 12, 2)],
    "p": [1, 2]
}

 

params
>>>
{'n_neighbors': [1, 3, 5, 7, 9, 11], 'p': [1, 2]}

 

1.2.1.2  2.1.2 탐색

grid_cv = GridSearchCV(knn, param_grid=params, cv=3, n_jobs=-1)
grid_cv.fit(train_data, train_label)

>>>
GridSearchCV(cv=3, estimator=KNeighborsClassifier(), n_jobs=-1,
             param_grid={'n_neighbors': [1, 3, 5, 7, 9, 11], 'p': [1, 2]})

 

 

1.2.1.3  2.1.3 결과

print(f"Best score of paramter search is: {grid_cv.best_score_:.4f}")
>>> Best score of paramter search is: 0.5652

grid_cv.best_params_
>>> {'n_neighbors': 11, 'p': 1}

print("Best parameter of best score is")
print(f"\t n_neighbors: {grid_cv.best_params_['n_neighbors']}")
print(f"\t p: {grid_cv.best_params_['p']}")

>>>
Best parameter of best score is
	 n_neighbors: 11
	 p: 1

 

1.2.1.4  2.1.4 예측

train_pred = grid_cv.best_estimator_.predict(train_data)
test_pred = grid_cv.best_estimator_.predict(test_data)

 

1.2.1.5  2.1.5 평가

from sklearn.metrics import accuracy_score

train_acc = accuracy_score(train_label, train_pred)
test_acc = accuracy_score(test_label, test_pred)

print(f"train accuracy is {train_acc:.4f}")
print(f"test accuracy is {test_acc:.4f}")

>>>
train accuracy is 0.6520
test accuracy is 0.5595

 

 

1.3  3. Scaling을 할 경우

1.3.1  3.1 Data Scaling

KNN은 거리를 기반으로 하는 알고리즘이기 때문에 데이터의 크기에 영향을 받습니다.
Scaling을 진행해 크기를 맞춰줍니다.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

scaler.fit(train_data)

scaled_train_data = scaler.transform(train_data)
scaled_test_data = scaler.transform(test_data)
scaled_train_data.shape
>>> 
(2293, 6)

scaled_test_data.shape
>>>
(983, 6)

 

 

1.3.2  3.2 탐색

scaling_knn = KNeighborsClassifier()
scaling_grid_cv = GridSearchCV(scaling_knn, param_grid=params, n_jobs=-1)

scaling_grid_cv.fit(scaled_train_data, train_label)
>>>
GridSearchCV(estimator=KNeighborsClassifier(), n_jobs=-1,
             param_grid={'n_neighbors': [1, 3, 5, 7, 9, 11], 'p': [1, 2]})

 

scaling_grid_cv.best_score_
>>> 0.587011825593896

scaling_grid_cv.best_params_
>>> {'n_neighbors': 9, 'p': 1}

 

1.3.3  3.3 평가

 

scaling_train_pred = scaling_grid_cv.best_estimator_.predict(scaled_train_data)
scaling_test_pred = scaling_grid_cv.best_estimator_.predict(scaled_test_data)


scaling_train_acc = accuracy_score(train_label, scaling_train_pred)
scaling_test_acc = accuracy_score(test_label, scaling_test_pred)


print(f"Scaled data train accuracy is {scaling_train_acc:.4f}")
print(f"Scaled data test accuracy is {scaling_test_acc:.4f}")

>>>
Scaled data train accuracy is 0.6829
Scaled data test accuracy is 0.5799

 

 

1.4  4. 마무리

 

print(f"test accuracy is {test_acc:.4f}")
print(f"Scaled data test accuracy is {scaling_test_acc:.4f}")

>>>
test accuracy is 0.5595
Scaled data test accuracy is 0.5799

'Machine Learning > 머신러닝 온라인 강의' 카테고리의 다른 글

CH07_02. SVM 커널 실습 (Python)  (0) 2022.10.18
CH07_01. SVM  (0) 2022.10.12
CH06_02. KNN 실습 (Python)  (0) 2022.10.11
CH06_01. KNN  (0) 2022.10.11
CH05_02. 스팸 메세지 분류 (Python)  (0) 2022.10.11