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 |