이전 포스팅의 경우는 SVM, Random Forest, Logistic regression을 이용하여 분석을 해보았습니다.
앞선 방법 모두 최적화를 시키지 않는 상태입니다.
추후에 최적화 방법을 시키고 적용을 시켜보도록 하겠습니다. 그리고 tensorflow까지도 해보도록 하겠습니다.
Kaggle - Breast Cancer Detection with SVM (Explanation, 설명)
본 코드는 Kaggle에서 code를 따온 다음 설명 형식으로 풀어서 공부한 것을 공유하고자 하였습니다. www.kaggle.com/mihirjhaveri/breast-cancer-detection-with-svm Breast Cancer Detection with SVM Explore an..
predictiongeek.tistory.com
Breast Cancer Detection with Ramdom Forest Classification
오늘 포스팅 주제는 저번 포스팅한 데이터를 이용하여 Random forest classification을 돌려보고자 합니다. predictiongeek.tistory.com/2 Kaggle - Breast Cancer Detection with SVM (Explanation, 설명) 본 코..
predictiongeek.tistory.com
Breast Cancer Detection with Logistic regression
이전 포스팅에서는 SVM, Random Forest를 이용한 Classification을 진행하였습니다. predictiongeek.tistory.com/2 Kaggle - Breast Cancer Detection with SVM (Explanation, 설명) 본 코드는 Kaggle에서 code를..
predictiongeek.tistory.com
이번에는 KNN에 대해서 진행해보도록 하겠습니다.
KNN은 Kmeans와는 다르다는 것을 알아두셔야 합니다. K-means는 그냥 단순 주변가까운 변수들끼리의 클러스터링을 보여주는 방법이고, KNN의 경우 classification을 해주는 방법입니다.
데이터를 불러오는 부분은 중복되는 부분이지만, 처음 들어오신 분들을 위하여 다시 작성하도록 하겠습니다.
1. module import
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> import pandas as pd
>>> import seaborn as sns
>>> from pandas.plotting import scatter_matrix
>>> from sklearn.linear_model import LogisticRegression
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.metrics import accuracy_score
>>> from sklearn.metrics import confusion_matrix
>>>
2. data preprocessing
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data"
names = ['id', 'clump_thickness', 'uniform_cell_size', 'uniform_cell_shape','marginal_adhesion', 'single_epithelial_size', 'bare_nuclei','bland_chromatin', 'normal_nucleoli', 'mitoses', 'class']
df=pd.read_table(url,sep=',',names=names)
df.drop(['id'],1,inplace=True)
df.replace('?','-2',inplace=True)
데이터 읽어왔습니다. 그리고 데이터들 사이의 분포를 보는데 이전과는 다른게 몇몇 변수들에 대해서 뽑아 보는 방법도 알려드리겠습니다.
sns.pairplot(df,hue='class',markers=['o','s'],height=3,aspect=0.2)
sns.pairplot(df,hue='class',markers=['o','s'],vars=['uniform_cell_size','uniform_cell_shape','single_epithelial_size'])
plt.show()
3. train set, test set 만들기
X=np.array(df.drop(['class'],1))
y=np.array(df['class'])
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=7054)
4. 모델 생성 및 검정
모델 생성
KNN_model=KNeighborsClassifier(n_neighbors=2)
KNN_model.fit(X_train,y_train)
모델 검정
오늘의 경우 모델검정의 다양한 version들을 올리도록 하겠습니다.
첫번째 방법
train_prediction=KNN_model.predict(X_train)
test_prediction=KNN_model.predict(X_test)
accuracy_score(train_prediction,y_train)
accuracy_score(test_prediction,y_test)
>>> train_prediction=KNN_model.predict(X_train)
>>> test_prediction=KNN_model.predict(X_test)
>>> accuracy_score(train_prediction,y_train)
0.9790076335877863
>>> accuracy_score(test_prediction,y_test)
0.96
>>>
두번째 방법
KNN_model.score(X_train,y_train)
KNN_model.score(X_test,y_test)
>>> KNN_model.score(X_train,y_train)
0.9790076335877863
>>> KNN_model.score(X_test,y_test)
0.96
>>>
결과 값이 같은 것을 확인할 수가 있습니다. 간단하게 보려면 두번째 방법, 그래프를 그리려면 첫번째 방법을 사용하는 것이 좋습니다.
그래프 그리기 (두번째 방법 이용)
cm=pd.DataFrame(confusion_matrix(y_test,test_prediction),columns=['2','4'],index=['2','4'])
sns.heatmap(cm,annot=True)
plt.show()
뭔가 logistic regression과 비슷하게 나온듯합니다.
추가적으로 검정을 진행할때 주로 사용되는 방법이 Cross validation입니다.
이것의 경우 저번 포스팅에서도 나왔습니다.
kfold = model_selection.KFold(n_splits=10, random_state = 5)
cv_results=model_selection.cross_val_score(KNN_model,X_train,y_train,cv=kfold,scoring='accuracy')
msg = "%s: %f (%f)" % ("KNN", cv_results.mean(), cv_results.std())
print(msg)
cv_results=model_selection.cross_val_score(KNN_model,X_test,y_test,cv=kfold,scoring='accuracy')
msg = "%s: %f (%f)" % ("KNN", cv_results.mean(), cv_results.std())
print(msg)
>>> kfold=model_selection.KFold(n_splits=10,random_state=7054)
>>> cv_results=model_selection.cross_val_score(KNN_model,X_train,y_train,cv=kfold,scoring='accuracy')
>>> msg = "%s: %f (%f)" % ("KNN", cv_results.mean(), cv_results.std())
>>> print(msg)
KNN: 0.935160 (0.030896)
>>>
>>> cv_results=model_selection.cross_val_score(KNN_model,X_test,y_test,cv=kfold,scoring='accuracy')
>>> msg = "%s: %f (%f)" % ("KNN", cv_results.mean(), cv_results.std())
>>> print(msg)
KNN: 0.926797 (0.060862)
>>>
cross validation의 경우에는 결과값을 보게되면 n_splits만한 결과가 나옵니다. (위 코딩에서는 10개)
10개가 나온 이유는 cross validation을 하는 이유가 data set을 n개(여기선 10개)로 나누어 모델을 적용시켜보는 것입니다.
cross validation이라는 개념은 데이터 셑을 나누고, 모델을 만들고, 적용시키고를 10회를 한다는 것입니다.
그렇기 때문에 dataset이 크기가 커야지 유의미할뿐더러, 결과값들이 dataset전체 값에 대한 모델 결과값이 만들어집니다.
>>> cv_results
array([0.94444444, 0.77777778, 0.94444444, 0.88888889, 0.88888889,
1. , 0.94117647, 0.94117647, 1. , 0.94117647])
>>>
위에서의 cv_results의 값들은 test set에 대한 결과 값이기 때문에 잘맞춰보이는 것이지만, 실제로는 내부 샘플의 개수가 적어서 저런 결과가 나왔을 확률이 큽니다. (accuracy range가 최소가 0.777 최대가 1이기때문에 변동폭이 큽니다.)
결과들을 정리해보자면 다음과 같습니다.
Not-k fold result | train set | test set |
SVM | 0.9427 | 0.9428 |
Random forest | 1 | 0.97 |
Logistic regression | 0.973 | 0.96 |
KNN (K-Nearest neighbors) | 0.979 | 0.96 |
지금까지 K-nearest neighbors (KNN)에 대한 포스팅을 하였습니다. 다음에도 classification관련 모델을 찾아서 포스팅 하도록 하겠습니다.
어떤 모델이든 간에 classification 모델을 만들고나서 최적화방법을 포스팅 해보도록 하겠습니다.
데이터는 많고, 모델도 많으니 되는데로 다 해보겠습니다.
'python > Machine learning' 카테고리의 다른 글
SVM 최적화 시키기 (0) | 2020.07.21 |
---|---|
Breast Cancer Detection with Decision tree (0) | 2020.07.17 |
Breast Cancer Detection with Logistic regression (0) | 2020.07.15 |
Breast Cancer Detection with Ramdom Forest Classification (0) | 2020.07.14 |
Kaggle - Breast Cancer Detection with SVM (Explanation, 설명) (0) | 2020.07.13 |
댓글