미니프로젝트

K-NN을 통해 구매 가능성이 있는 고객 분류하기

728x90

라이브러리 import

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import confusion_matrix

csv파일 불러오기

df = pd.read_csv('Social_Network_Ads.csv')
df.head()

자료의 형태, 타입, NaN데이터 확인

df.info()
df.isna().sum()
df.describe()

X로 Age와 EstimatedSalary 컬럼을 설정

X = df.iloc[:, [2,3]]
X.head()

y의 값으로 구매 여부인 df['Purchased']를 설정

y = df['Purchased']

값을 스케일링해준다.

sc = StandardScaler()
X = sc.fit_transform(X)
X

Standard Scaler은 feature의 평균을 0, 분산을 1로 변경하여 모든 특성들이 같은 스케일을 갖게 한다.



 

데이터를 테스트 세트와 트레이닝세트로 나눠준다.

X_train, X_test, y_train,y_test = train_test_split(X,y,test_size = 0.2, random_state = 0 )
X.shape
X_train.shape
X_test.shape

#(400, 2)
#(320, 2)
#(80, 2)

 

KNN을 여기서 사용하여 분류해 준다.

 

classifier = KNeighborsClassifier(n_neighbors=5, metric = 'minkowski')
classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)
y_pred

y_test

 

test셋의 X를 이용하여 예측한 것과 테스트셋의 y값을 비교하여 얼마나 적중률이 높은지 확인해본다.

 

cm = confusion_matrix(y_test, y_pred)
cm

정확도는 (55+21)/cm.sum()인 0.95, 95퍼센트이다.

 

sb.heatmap(cm, annot = True , cmap = 'RdPu', linewidths=0.5)
plt.show()

히트맵으로 봐도 정확도가 상당히 높다.

 

 

 

 

 

 

 

 

*알지 못하지만 유용하여 쓰는 코드

# Visualising the Test set results
from matplotlib.colors import ListedColormap
X_set, y_set = X_test, y_test
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, 
                               stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1, 
                               stop = X_set[:, 1].max() + 1, step = 0.01))
plt.figure(figsize=[10,7])
plt.contourf(X1, X2, classifier.predict(
            np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('Classifier (Test set)')
plt.legend()
plt.show()

이걸로 위의 데이터를 계산하면  아래와 같은 표가 나온다.

 

728x90