상세 컨텐츠

본문 제목

[Kaggle] Drug Classification 데이터셋을 이용한 KNN 분류 실습

Python

by 경밤 2022. 1. 16. 21:29

본문

반응형

https://www.kaggle.com/prathamtripathi/drug-classification

 

Drug Classification

This database contains information about certain drug types.

www.kaggle.com

위 사이트서 새 Kaggle Notebook을 만들면 아래와 같이 데이터셋을 쓸 수 있다.

path = "/kaggle/input/drug-classification/drug200.csv"
df = pd.read_csv(path)
header = df.columns

본문에서 유추할 수 있듯이 Drug label이 우리가 예측해야할 데이터다. 따라서, 데이터 프레임에서 Drug 부분을 Target으로 떼어내야 한다.

feature_names = ['Age','Sex','BP','Cholesterol','Na_to_K']
data = df[feature_names].to_numpy()
target = df[['Drug']].to_numpy()

다만 여기서 우리는 One-Hot-Encoding을 문자열 데이터에 적용하여 숫자 데이터로 바꾸어 주어야 한다. Scikit-Learn 모델에서 요구하기도 하고, 이것을 하는 이유에는 더 나은 표현성이 있다. 가령, 일반적인 문자가 어떤 계단적인 표현(low, normal, high 같은 것)이라면, 이것을 오름차순의 정수로 변환하면 그래프로 표기할때도 동일하게 그 언어의 표현이 적용된다.

one_hot_encoding_char = {"F":0, "M":1, "NORMAL":0, "HIGH":1,"LOW":2}
def one_hot_encode(arr, char):
    result = arr
    for i in range(0, arr.size):
        result[i] = char[arr[i]]
    return result
data[:,1] = one_hot_encode(data[:,1], one_hot_encoding_char)
data[:,2] = one_hot_encode(data[:,2], one_hot_encoding_char)
data[:,3] = one_hot_encode(data[:,3], one_hot_encoding_char)

Scikit learn의 train test split 메서드를 사용하여 훈련용 데이터셋과 예측 확인용 데이터셋으로 구분하자.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(data, target, random_state=0)

그리고 적당히 이웃수를 조정한 모델을 만들어 적용한다.

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)

이후 예측한 값과 실제 값이 같은지 비교하는 코드를 짜서 보자.

predicted = knn.predict(X_test)
score = 0 
for i in range(predicted.shape[0]):
    boolean = predicted[i]==y_test[i]
    print("{} == {} ? {}".format(predicted[i], y_test[i], boolean))
    if(boolean == True):
        score+=1
print("Score is {}%".format(score / predicted.shape[0] * 100))
반응형

관련글 더보기