<jupyter_start><jupyter_text>KNN 분류KNN은 K - Nearest - Neighbors의 약칭새로운 관측값이 주어지면 기존 데이터 중에서 가장 속성이 비슷환 K개의 이웃을 먼저 찾음  가까운 이웃들이 갖고 있는 목표 값과 같은 값으로 분류하여 예측K의 값에 따라 예측의 정확도가 달라지므로 적절한 K값을 찾는 것이 매우 중요  Import library & data<jupyter_code>import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics 
df = sns.load_dataset('titanic')
df.head()<jupyter_output><empty_output><jupyter_text>EDA<jupyter_code>df.info()
df.isna().sum()
df.describe()<jupyter_output><empty_output><jupyter_text>NaN값이 많은 deck 열을 삭제, embarked와 내용이 겹치는 embark_town 열을 삭제<jupyter_code>rdf = df.drop(['deck', 'embark_town'], axis=1)  
print(rdf.columns.values)<jupyter_output>['survived' 'pclass' 'sex' 'age' 'sibsp' 'parch' 'fare' 'embarked' 'class'
 'who' 'adult_male' 'alive' 'alone']<jupyter_text>age 열에 나이 데이터가 없는 모든 행을 삭제 - age 열(891개 중 177개의 NaN 값)<jupyter_code>rdf = rdf.dropna(subset=['age'], how='any', axis=0)  
print(len(rdf))<jupyter_output>714<jupyter_text>embarked 열의 NaN값을 승선도시 중에서 가장 많이 출현한 값으로 치환<jupyter_code>most_freq = rdf['embarked'].value_counts(dropna=True).idxmax()   
print(most_freq)
rdf['embarked'].fillna(most_freq, inplace=True)
rdf.describe(include='all')
rdf.isna().sum()
rdf['sex'].unique()
rdf['embarked'].unique()
plt.figure(figsize=(15,15))
sns.heatmap(data = rdf.corr(), annot=True, 
fmt = '.2f', linewidths=.5, cmap='Blues')
features = rdf[['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'embarked']]
features.info()
sns.pairplot(features)  
plt.show()<jupyter_output><empty_output><jupyter_text>원핫인코딩 - 범주형 데이터를 모델이 인식할 수 있도록 숫자형으로 변환 성별에 대한 원핫인코딩<jupyter_code>features['sex']
onehot_sex = pd.get_dummies(features['sex'])
onehot_sex
features
features = pd.concat([features, onehot_sex], axis=1)
features
features.isna().sum()<jupyter_output><empty_output><jupyter_text>embarked에 대한 원핫인코딩<jupyter_code>onehot_embarked = pd.get_dummies(features['embarked'], prefix='town')
features = pd.concat([features, onehot_embarked], axis=1)
onehot_embarked
features<jupyter_output><empty_output><jupyter_text>원핫인코딩 전의 기존 칼럼 제거<jupyter_code>features.drop(['sex', 'embarked'], axis=1, inplace=True)
features.head()<jupyter_output><empty_output><jupyter_text>Modeling<jupyter_code>X=features[['pclass', 'age', 'sibsp', 'parch', 'female', 'male', 'town_C', 'town_Q', 'town_S']]  #독립 변수 X
y=features['survived']                      #종속 변수 Y
X<jupyter_output><empty_output><jupyter_text>독립 변수 데이터를 정규화(normalization)<jupyter_code>X = preprocessing.StandardScaler().fit(X).transform(X)
X<jupyter_output><empty_output><jupyter_text>train data 와 test data로 구분<jupyter_code>X_train, X_test, y_train, y_test = train_test_split(X, 
                                                    y, 
                                                    test_size=0.2, 
                                                    random_state=20) 
print('train data 개수: ', X_train.shape)
print('test data 개수: ', X_test.shape)<jupyter_output>train data 개수:  (571, 9)
test data 개수:  (143, 9)<jupyter_text>모델 객체 생성 (k=5로 설정)<jupyter_code>knn = KNeighborsClassifier(n_neighbors=10)<jupyter_output><empty_output><jupyter_text>train data를 가지고 모형 학습<jupyter_code>knn.fit(X_train, y_train)<jupyter_output><empty_output><jupyter_text>test data를 가지고 y_hat을 예측 (분류)<jupyter_code>y_hat = knn.predict(X_test)
print(y_hat[0:10])
print(y_test.values[0:10])<jupyter_output>[0 0 1 0 0 0 1 0 0 0]
[0 0 1 0 0 1 1 1 0 0]<jupyter_text>모델 성능 평가confusion matrix & classification report<jupyter_code>r_square = knn.score(X_test, y_test)
print(r_square)
knn_matrix = metrics.confusion_matrix(y_test, y_hat)  
print(knn_matrix)
knn_report = metrics.classification_report(y_test, y_hat)            
print(knn_report)<jupyter_output>precision    recall  f1-score   support

           0       0.81      0.87      0.84       125
           1       0.80      0.72      0.76        90

    accuracy                           0.81       215
   macro avg       0.81      0.80      0.80       215
weighted avg       0.81      0.81      0.81       215
{'fraction_non_alphanumeric': 0.12878423834694858, 'fraction_numerical': 0.028111484863046612, 'mean_word_length': 4.289707750952986, 'pattern_counts': {'":': 0, '<': 56, '<?xml version=': 0, '>': 56, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 12, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '15', 'dir': 'jupyter-structured-clean-dedup', 'id': '86210', 'license': 'MIT', 'n_tokens_mistral': 1972, 'n_tokens_neox': 2053, 'n_words': 323, 'path': 'AI_Class/005/.ipynb_checkpoints/knn_classification-checkpoint.ipynb', 'repo_name': 'CodmingOut/AI_Mentoring', 'size': '4162'}