KNN(K-Nearset Neighbors)
- KNN은 ML 지도학습 일종으로 분류 모델에 쓰인다.
- K는 노드를 분류할 때 영향을 주는 이웃 노드의 수다
- K 값은 교차 검증 되어야 한다
K-최근접 이웃(K-Nearest Neighbors, KNN) 알고리즘은 지도 학습(Supervised Learning)으로 Classification과 Regression(회귀) 모델 문제를 해결하는 데 사용됩니다.
이 알고리즘은 "K"라는 사용자가 정의한 양의 정수를 통해 동작합니다.
이 "K"는 새로운 데이터 포인트가 어떤 분류에 속하는지를 결정하는 데 사용되는 가장 가까운 이웃의 수를 나타냅니다.
KNN의 큰 특징은 따로 훈련을 할 필요가 없습니다.
이를 KNN이 Lazy Model이라 표현합니다
K-최근접 이웃 알고리즘의 기본적인 프로세스
- K 값을 선택합니다.
- 새로운 데이터 포인트와 데이터셋의 각 포인트 사이의 거리를 계산합니다.
- 새로운 데이터 포인트에서 가장 가까운 'K’개의 이웃을 찾습니다.
- 분류 문제의 경우, 이 'K’개 이웃 중 가장 일반적인 클래스를 예측값으로 사용합니다.
K-최근접 이웃 알고리즘의 사용
K-최근접 이웃 알고리즘은 다양한 분야에서 적용될 수 있습니다.
예를 들어, 의료 분야에서는 환자의 진단을 돕기 위해 사용될 수 있습니다.
K-최근접 이웃 알고리즘은 특징들(예: 나이, 키, 체중, 질병의 유무 등)에 기반하여 환자를 특정 질병 그룹에 분류할 수 있습니다.
또 다른 예로, 금융 분야에서는 고객의 신용 점수 예측에 K-최근접 이웃 알고리즘을 사용할 수 있습니다.
이때, 고객의 신용 점수는 고객의 과거 신용 기록, 재무 상태, 채무 이행 능력 등에 기반하여 예측됩니다.
K 값 선택의 중요성
K 값의 선택은 K-최근접 이웃 알고리즘의 성능에 큰 영향을 미칩니다.
K 값이 너무 작으면 알고리즘은 훈련 데이터의 노이즈에 과적합 될 수 있습니다.
반면, K 값이 너무 크면 알고리즘은 과도하게 일반화될 수 있어, 분류의 정확성이 떨어질 수 있습니다.
일반적으로, K 값은 교차 검증을 통해 결정됩니다.
즉, 훈련 데이터를 여러 개의 하위 집합으로 나누고, 각 하위 집합에 대해 K 값이 얼마나 잘 예측하는지를 평가합니다.
그 후, 가장 좋은 예측 성능을 보인 K 값을 선택합니다.
이 과정은 K-최근접 이웃 알고리즘의 성능을 최적화하는 데 도움이 됩니다.
문제 풀이 : 준비 과정
한 통신 공급업체가 서비스 이용 패턴에 따라 고객들을 네 개의 그룹으로 분류했습니다.
인구통계 데이터를 사용하여 그룹 구성원을 예측할 수 있다면, 회사는 개별 잠재 고객에게 맞춤형 오퍼를 제공할 수 있습니다.
즉 Classification 문제입니다.
미리 정의된 레이블이 있는 데이터셋을 사용하여 새로운 또는 알려지지 않은 경우의 클래스를 예측하는 모델을 구축해야 합니다.
이 예시는 지역, 나이, 결혼 여부와 같은 인구통계 데이터를 사용하여 사용 패턴을 예측하는 데 초점을 맞춥니다.
custcat 라는 목표 필드는 네 가지 가능한 값으로, 다음과 같이 네 개의 고객 그룹에 해당합니다
- Basic Service
- E-Service
- Plus Service
- Total Service
우리의 목표는 알려지지 않은 경우의 클래스를 예측하기 위해 분류기를 구축하는 것입니다.
K 최근접 이웃(KNN)이라고 불리는 특정 유형의 분류 방법을 사용할 것입니다.
Dataframe 생성
df = pd.read_csv('teleCust1000t.csv')
df.head()
제공된 csv에서 데이터 프레임을 생성하고 출력 합니다
데이터 시각화 및 분석
먼저 얼마나 많은 클래스가 우리 데이터 set에 있는지 확인해봅시다
df['custcat'].value_counts()
value_counts()
는 category 필드의 갯수를 알 수 있습니다.
또는, hist()
로 시각화도 할 수 있습니다
df.hist(column='income', bins=50)
Feature Set : 모델이 학습하는데 사용되는 데이터 속성
df.colums
데이터 프레임의 아래와 같은 필드들이 있음을 확인 할 수 있습니다
Scikit-learn을 사용하기 위해, 우리는 Pandas 데이터 프레임을 Numpy 배열로 변경해야 합니다
Pandas 데이터프레임에서 속성을 선택하여 feature set X를 정의하는 것이죠
X = df[['region', 'tenure','age', 'marital', 'address', 'income', 'ed', 'employ','retire', 'gender', 'reside']] .values #.astype(float)
X[0:5]
그 다음으로, 'custcat’열을 타겟 레이블 y로 지정합니다.
이는 우리가 예측하고자 하는 레이블이며, KNN 알고리즘이 이 레이블을 예측하는 방법을 학습합니다.
y = df['custcat'].values
y[0:5]
위의 결과는 array([1, 4, 3, 1, 3], dtype=int64)
로 나옵니다
훈련 데이터와 테스트 데이터 분할
샘플 외 정확도(Out of Sample Accuracy)는 모델이 훈련에 사용되지 않은 데이터에서 얼마나 정확하게 예측하는지를 나타내는 지표입니다.
모든 모델의 목적은 물론 알려지지 않은 데이터에서 올바르게 예측하는 것이므로, 모델이 높은 샘플 외 정확도를 가져야 합니다.
이를 위해 훈련 테스트 분할(Train Test Split)을 사용합니다
테스트 데이터셋은 모델 훈련에 사용된 데이터셋의 일부가 아니기 때문에, 이 방법은 샘플 외 정확도에 대해 더 정확한 평가를 제공합니다.
이는 실세계 문제에 대해 더 현실적인 결과를 제공합니다.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=4)
print ('훈련 세트:', X_train.shape, y_train.shape)
print ('테스트 세트:', X_test.shape, y_test.shape)
위 코드는 scikit-learn의 train_test_split
함수를 사용하여 데이터를 훈련 세트와 테스트 세트로 분할하는 과정입니다.
test_size=0.2
는 전체 데이터의 20%를 테스트 데이터로 사용하겠다는 것을 의미하며,
random_state
는 분할을 수행할 때 사용되는 난수 seed 값을 설정합니다.
Normalize Data : 데이터 표준화
데이터 표준화는 데이터에 제로 평균과 단위 분산을 부여하는 과정으로,
데이터 포인트의 거리에 기반한 알고리즘(예 : KNN(K-Nearset Neighbors))을 사용할 때 좋은 습관입니다.
from sklearn import preprocessing
scaler = preprocessing.StandardScaler().fit(X_train)
X_train_norm = scaler.transform(X_train.astype(float))
X_train_norm[0:5]
위 코드는 StandardScaler
를 사용하여 훈련 데이터를 표준화하는 과정입니다.
StandardScaler
는 데이터에서 평균을 빼고 표준 편차로 나눔으로써 표준화를 수행합니다.
결과적으로 표준화된 데이터는 평균이 0이고 분산이 1인 통계적 분포를 갖게 됩니다.
이는 특히 거리 기반 알고리즘에서 중요하며, 모든 특성이 동일한 스케일을 갖도록 보장하여 알고리즘이 올바르게 작동하도록 합니다.
문제 풀이 : KNN 문제 풀이
from sklearn.neighbors import KNeighborsClassifier
k = 4
#Train Model and Predict
neigh = KNeighborsClassifier(n_neighbors = k).fit(X_train_norm,y_train)
neigh
X_test_norm = scaler.transform(X_test.astype(float))
X_test_norm[0:5]
예측
yhat = neigh.predict(X_test_norm)
yhat[0:5]
결과는 array([1, 1, 3, 2, 4], dtype=int64)
이렇게 나왔다
다중 라벨 분류에서 정확도 분류 점수 는 부분 집합의 정확도를 계산하는 함수입니다.
이 함수는 jaccard_score 함수와 동일합니다.
본질적으로, 이것은 테스트 세트에서 실제 레이블과 예측 레이블이 얼마나 밀접하게 일치하는지를 계산합니다.
from sklearn import metrics
print("Train set Accuracy: ", metrics.accuracy_score(y_train, neigh.predict(X_train_norm)))
print("Test set Accuracy: ", metrics.accuracy_score(y_test, yhat))
위의 코드에서는, 먼저 훈련 세트에서의 정확도를 계산하고, 이를 출력합니다.
여기서 'neigh.predict(X_train_norm)'은 모델 'neigh’를 사용하여 훈련 데이터 'X_train_norm’에 대한 예측값을 생성합니다.
다음으로, 테스트 세트에서의 정확도를 계산하고 이를 출력합니다.
'y_test’는 테스트 세트의 실제 레이블을, 'yhat’는 테스트 데이터에 대한 모델의 예측 레이블을 나타냅니다.
이 두 값이 얼마나 잘 일치하는지를 ‘metrics.accuracy_score’ 함수를 사용하여 평가하고, 이 결과를 출력합니다.
이 값이 높을수록 모델의 성능이 좋다는 것을 의미합니다.
레퍼런스
- Data를 Normalize하는 이유
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'AI' 카테고리의 다른 글
Machine Learning (0) | 2023.07.10 |
---|---|
AutoGPT 설치 방법 (0) | 2023.07.08 |
Classification (0) | 2023.07.07 |
Non-Linear Regression 실습 (0) | 2023.07.06 |
Polynomial Regression 실습 (0) | 2023.07.06 |