working_helen
[ Week 3-2 ] Discretisation, Naive Bayes with continuous variable 본문
[ Week 3-2 ] Discretisation, Naive Bayes with continuous variable
HaeWon_Seo 2024. 3. 22. 12:07Lecture : Machine Learning
Date : week 3, 2024/03/14
Topic : Naive Bayes with continuous variable
1. Discretisation
1) Discretisation 이산화
2) 이산화의 장단점
3) 이산화 방법
2. Naive Bayes with continuous variable
1. Discretisation
1) Discretisation 이산화
continuous numeric attributes → discrete nominal attributes
연속형(수치형) 변수를 이산형(범주형) 변수로 변환하는 과정
- nominal valeu(interval)의 개수를 정하고, 그 개수만큼 boundaries를 선정한다.
- 기존의 연속형 변수는 각 boundaries에 할당되어 이산형 변수로 변환된다.
2) 이산화의 장단점
- Naive Bayes, Decision tree 등 회귀/분류 모델은 입력값이 nominal attributes임을 가정하기 때문에 이산형 변수를 사용할때 모델 학습 속도가 빨라지고 성능이 개선된다.
- 데이터를 더 단순하고 직관적으로 만들어 이해하기 쉬워진다.
- 하지만 간격을 결정하고 데이터를 할당하는 과정에서 정보 손실이 발생할 수 있다.
==> 정보 손실을 최소화하는 boundaries를 잘 결정하는 것이 핵심 과제
3) 이산화 방법
: 어떻게 boundaries를 결정하느냐에 따라 방법이 구분된다.
① Equal–width discretization (등폭 이산화)
- 연속형 변수값의 범위를 동일한 크기 간격으로 나누는 방법
- 각 범주에 해당하는 값의 범위(길이)가 동일하도록 boundaries를 설정하는 방법
- k개의 범주로 나누는 경우, width = (max−min)/k
- 기존 변수의 분포를 극적으로 변화시키지 않기 때문에 편향된 분포에 민감하다는 단점이 있다.
② Equal-frequency discretization (등빈도 이산화)
- 동일한 수의 관측값을 갖는 간격으로 나누는 방법
- 각 범주에 포함되는 관측값의 빈도가 동일하도록 boundaries를 설정하는 방법
- k개의 범주로 나누는 경우, 관측값의 k분위수가 각 경계값
- 관측치를 서로 다른 범주로 균등하게 나누기 때문에 기존에 편향된 분포였던 경우 유용하다.
③ K-means clustering 활용
- 관측값에 대해 k-means 군집화를 수행해 범주를 나누는 방법
- 데이터가 이미 가지고 있는 자연스러운 군집을 찾아내는 방법
- 이상치에 민감하며, 등폭/등빈도 이산화에 비해 복잡하다는 단점이 있다.
2. Naive Bayes with continuous variable
: Naive Bayes Model에서 attribute 값 X(x1, x2,,,)가 연속형 변수인 경우 likelihood P(X|C) 계산 방법
- 연속형 변수 → 범주형 변수 변환하여 Likelihood 계산 (encoding, discretisation 등등)
- 각 given C에서 X의 conditional pdf(probabilitt density function)를 가정하여 Likelihood 계산
Jupyter Notebook
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
X, y = fetch_california_housing(return_X_y=True, as_frame=True)
X
MedInc | HouseAge | AveRooms | AveBedrms | Population | AveOccup | Latitude | Longitude | |
---|---|---|---|---|---|---|---|---|
0 | 8.3252 | 41.0 | 6.984127 | 1.023810 | 322.0 | 2.555556 | 37.88 | -122.23 |
1 | 8.3014 | 21.0 | 6.238137 | 0.971880 | 2401.0 | 2.109842 | 37.86 | -122.22 |
2 | 7.2574 | 52.0 | 8.288136 | 1.073446 | 496.0 | 2.802260 | 37.85 | -122.24 |
3 | 5.6431 | 52.0 | 5.817352 | 1.073059 | 558.0 | 2.547945 | 37.85 | -122.25 |
4 | 3.8462 | 52.0 | 6.281853 | 1.081081 | 565.0 | 2.181467 | 37.85 | -122.25 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
20635 | 1.5603 | 25.0 | 5.045455 | 1.133333 | 845.0 | 2.560606 | 39.48 | -121.09 |
20636 | 2.5568 | 18.0 | 6.114035 | 1.315789 | 356.0 | 3.122807 | 39.49 | -121.21 |
20637 | 1.7000 | 17.0 | 5.205543 | 1.120092 | 1007.0 | 2.325635 | 39.43 | -121.22 |
20638 | 1.8672 | 18.0 | 5.329513 | 1.171920 | 741.0 | 2.123209 | 39.43 | -121.32 |
20639 | 2.3886 | 16.0 | 5.254717 | 1.162264 | 1387.0 | 2.616981 | 39.37 | -121.24 |
20640 rows × 8 columns
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
1) Equal–width discretization
from feature_engine.discretisation import EqualWidthDiscretiser
disc = EqualWidthDiscretiser(bins=8, variables=['MedInc'], return_boundaries=True)
disc.fit(X_train)
train_t = disc.transform(X_train)
test_t = disc.transform(X_test)
train_t['MedInc'].value_counts()
(2.312, 4.125] 6494
(4.125, 5.937] 3534
(-inf, 2.312] 2734
(5.937, 7.75] 1132
(7.75, 9.563] 318
(9.563, 11.375] 143
(11.375, 13.188] 49
(13.188, inf] 44
Name: MedInc, dtype: int64
print((max(X_train['MedInc']) - min(X_train['MedInc']))/8)
print(4.125-2.312)
1.812525
1.8130000000000002
plt.figure(figsize=(6, 4))
plt.hist(X_train['MedInc'])
for val in [2.312, 4.125, 5.937, 7.75, 9.563, 11.375, 13.188]:
plt.axvline(val, color='green', linestyle='dashed', linewidth=1)
plt.show()
2) Equal-frequency discretization
참고 : KBinsDiscretizer는 fit과 trainsform 시 입력 데이터로 2차원 배열이나 데이터프레임을 사용해야함
from sklearn.preprocessing import KBinsDiscretizer
variables = variables = ['MedInc', 'HouseAge']
disc = KBinsDiscretizer(n_bins=10, encode='ordinal', strategy='quantile')
disc.fit(X_train[variables])
train_t = X_train.copy()
test_t = X_test.copy()
train_t[variables] = disc.transform(X_train[variables])
test_t[variables] = disc.transform(X_test[variables])
train_t['MedInc'].value_counts()
1.0 1447
7.0 1447
6.0 1446
9.0 1445
8.0 1445
3.0 1445
4.0 1444
2.0 1444
0.0 1443
5.0 1442
Name: MedInc, dtype: int64
plt.figure(figsize=(6, 4))
plt.hist(X_train['MedInc'])
for val in train_t['MedInc'].unique():
plt.axvline(val, color='green', linestyle='dashed', linewidth=1)
plt.show()
'교내 수업 > Machine Learning' 카테고리의 다른 글
[ Week 7-1 ] Classifier combination (1) | 2024.04.20 |
---|---|
[ Week 4-2 ] Decision Tree, ID3 algorithm (0) | 2024.03.25 |
[ Week 3-1 ] Instance-based Learning KNN (0) | 2024.03.18 |
[ Week 2-2 ] Naive Bayes Model (0) | 2024.03.17 |
[ Week 2-1 ] types of attribute / probability / Entropy (3) | 2024.03.17 |