njs03332 / ml_study

3 stars 0 forks source link

2022/09/23~2022/09/28 #44

Open njs03332 opened 1 year ago

njs03332 commented 1 year ago
스크린샷 2022-09-22 오후 11 02 33
njs03332 commented 1 year ago

9.1.4 군집을 사용한 전처리

X_digits, y_digits = load_digits(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split(X_digits, y_digits)

로지스틱 회귀 모델을 훈련하여 정확도 평가

from sklearn.linear_model import LogisticRegression

log_reg = LogisticRegression() log_reg.fit(X_train, y_train) log_reg.score(X_test, y_test)

0.9688888889


- k-평균을 전처리 단계로 사용하면 더 좋아지는지 확인
  - 파이프라인을 만들어 먼저 훈련 세트를 50개의 클러스터로 모아 이미지를 50개 클러스터까지의 거리로 바꿈
  - 그 후 로지스틱 회귀 모델을 적용
- 숫자가 10개이므로 클러스터 개수를 10개로 지정할 수 있지만, 숫자를 쓴 방식이 저마다 다르므로 50처럼 클러스터 개수를 더 크게 하는 것이 좋음

```python
from sklearn.pipeline import Pipeline

pipeline = Pipeline([
    ("kmenas", KMeans(n_clusters=50)),
    ("log_reg", LogisticRegression()),
])
pipeline.fit(X_train, y_train)

pipeline.score(X_test, y_test)
# 0.977777777777
from sklearn.model_selection import GridSearchCV

param_grid = dict(kmeans__n_clusters=range(2, 100))
grid_clf = GridSerachCV(pipeline, param_grid, cv=3, verbose=2)
grid_clf.fit(X_train, y_train)

grid_clf.best_params_
# {'kmeans__n_clusters': 99}
grid_clf.score(X_test, y_test)
# 0.9822222222222
danbi5228 commented 1 year ago

9.1.5 군집을 사용한 준지도 학습

step 1. 대표 이미지를 찾아 수동으로 레이블링 후 학습

테스트 세트에서 성능 확인

log_reg.score(X_test, y_test) # 0.8333.. ; 전체 데이터셋을 사용했을 때 보다 낮은 정확도

- 성능 개선을 위해 훈련 세트를 50개의 클러스터로 모아, 각 클러스터의 센트로이드에 가장 가까운 이미지 즉, 대표이미지 찾기
```python
k = 50
kmeans - KMeans(n_clusters=k)
X_digits_dist = kmeans.fit_transform(X_train)
representative_digit_idx = np.argmin(X_digits_dist, axis=0)
X_representative_digits = X_train[representative_digit_idx]

log_reg.score(X_test, y_test) # 0.922222...

- 전문가가 모든 샘플에 수동으로 레이블링 하는 것은 비용이 많이 들고 어려우므로, 무작위 샘플 대신 대표 샘플에 레이블을 할당하는 것이 좋음

#### step 2. 레이블 전파  label propagation
- 동일한 클러스터에 있는 모든 샘플에 레이블을 전파 후 성능 확인
```python
y_train_propagated = np.empty(len(X_train), dtype=np.int32)
for i in range(k):
   y_train_propagated[kmeans.labels_ == i] = y_representative_digits[i]

log_reg = LogisticRegression()
log_reg.fit(X_train, y_train_propagated)
log_reg.score(X_test, y_test) # 0.933333 ;

X_cluster_dist = X_digits_dist[np.arange(len(Xtrain)), kmeans.labels]

for i in range(k): incluster = (kmeans.labels == i) cluster_dist = X_cluster_dist[in_cluster] cutoff_distance = np.percentile(cluster_dist, percentile_closet) above_cutoff = (X_cluster_dist > cutoff_distnace) X_cluster_dist[in_cluster & above_cutoff] = -1

partially_propagated = (X_cluster_dist != -1) X_train_partially_propagated = X_trainppartially_propagated] y_train_partially_propagated = y_trainppartially_propagated]

log_reg = LogisticRegression() log_reg.fit(X_train_partially_propagated, y_train_partially_propagated) log_reg.score(X_test, y_test) # 0.94


- 레이블된 샘플 50개로 94% 정확도를 얻어냄

#### 능동 학습
- 모델과 훈련 세트를 지속적으로 향상하기 위해 능동 학습 active learning 을 몇 번 반복할 수 있음
- 이 방법은 전문가가 학습 알고리즘과 상호작용하여 알고리즘이 요청할 때 특정 샘플의 레이블을 제공
- 여러 전략 중 **불확실성 샘플링 uncertainty sampling**이 가장 널리 사용됨
  - 수집한 레이블된 샘플에서 모델 훈련 후, 해당 모델로 레이블되지 않은 모든 샘플에 대한 예측 생성
  - 가장 불확실하게 예측한 샘플 (추정 확률이 가장 낮은 샘플)을 전문가에게 보내 레이블을 붙임
  - 레이블을 부여하는 노력만큼의 성능 향상이 되지 않을 때까지 반복
- 다른 전략은 추청 확률이 가장 낮은 샘플이 아닌 다른 샘플에 대해 레이블 부여 요청
  - 가장 크게 바꾸는 샘플이나 모델의 검증 점수를 가장 크게 떨어뜨리는 샘플
  - 여러개의 모델 (예를 들면 SVM, 랜덤 포레스트)이 동일한 예측을 내지 않는 샘플
givitallugot commented 1 year ago

9.1.3 군집을 이용한 이미지 분할