2025-04-15 머신러닝 7
머신러닝 특강
분류
이진분류 (암진단) :성능 더 좋음
다중분류:선택지가 비슷한 것이 있을 때 성능 안좋아짐
분류 회귀 차이점
분류: 결정경계 학습
회귀 : 데이터를 가장 잘 설명하는 함수 학습
분류 알고리즘
로지스틱 회귀: 단순해서 과적합 위험 낮음, 대신 과소적합 위험있으, 이상치 민감, Standardscaler 하는게 좋음.
knn : z 스케일링 필수
SVM : StandardScaler 필수, 하이퍼파라미터에 따라 성능 차이가 크므로 GridSearchCV 하이파라미터 튜닝 추천
트리기반 모델
의사결정나무는 스케일링 필요 없고 결측치 처리가 필요 없음, 근데 과적합 위험이 있음 그래서 랜덤포레스트 탄생
랜덤 포레스트 :
그래디언트 부스팅도 결정나무 순차적으로 학습하는 것

분류 평가
정확도 Accuracy : 클래스간 비율이 균등할 때 사용
정밀도(스팸, 결제사기), 재현율(암 진단) : 불균등할 때 사용
모델 해석
특성 중요도 (Feature Importance) : 다중공선성이 있어도 판별 못함, 상관관계를 고려하지 않고 중요한 변수만 나타냄
기타 팁
테스트 사이즈는 0.2~0.3까지
테스트데이터는 마지막 평가하기 전, TRAIN 데이터랑 분리돼있는 상태에서 이상치, 결측치 처리하면 됨.
EDA는 데이터 분리 후 실행.
머신러닝 8강 차원축소
차원축소
이상치처리, 특성 스케일링 이후 사용
2차원 변형 뿐만 아니라 필요없는 컬럼들을 제거해줘서 노이즈 제거 효과가 있음
선형 차원축소: PCA
PCA: 데이터의 가장 큰 분산을 찾아서 그 부분을 사진찍듯이 보여줌(주성분을 찾는다)
비선형 차원축소: 구겨져있는 상태의 종이(3차원)을 피는 것(2차원)( t-SNE, UMAP)
t-SNE : 가까운 데이터는 더 가까이, 먼 데이터는 더 멀리 배치하는 차원축소,지역적 구조만 파악 -> 시각화에는 좋지만 왜곡 가능성
UMAP: t-SNE랑 비슷하지만 지역적 구조, 전체 구조 파악, 정보왜곡 가능성은 여전히 있음
# 2. PCA
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# 3. t-SNE
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, perplexity=30, random_state=42)
X_tsne = tsne.fit_transform(X)
# 4. UMAP
# (umap-learn 설치 필요할 수 있습니다 : pip install umap-learn)
from umap import UMAP
umap = UMAP(n_components=2, n_neighbors=15, random_state=42)
X_umap = umap.fit_transform(X)
# 5. 시각화 (PCA, t-SNE, UMAP 결과 비교)
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
axes[0].scatter(X_pca[:, 0], X_pca[:, 1], c=y)
axes[0].set_title("PCA (2D)")
axes[1].scatter(X_tsne[:, 0], X_tsne[:, 1], c=y)
axes[1].set_title("t-SNE (2D)")
axes[2].scatter(X_umap[:, 0], X_umap[:, 1], c=y)
axes[2].set_title("UMAP (2D)")
plt.tight_layout()
plt.show()
차원축소 실습문제
import numpy as np
import matplotlib.pyplot as plt
# 1. Wine 데이터셋 불러오기
from sklearn.datasets import load_wine
wine = load_wine()
X = wine.data
y = wine.target # 3가지 와인 품종(0, 1, 2)
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# 3. t-SNE
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, perplexity=30, random_state=42)
X_tsne = tsne.fit_transform(X)
# 4. UMAP
# (umap-learn 설치 필요할 수 있습니다 : pip install umap-learn)
from umap import UMAP
umap = UMAP(n_components=2, n_neighbors=15, random_state=42)
X_umap = umap.fit_transform(X)
# 5. 시각화 (PCA, t-SNE, UMAP 결과 비교)
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
axes[0].scatter(X_pca[:, 0], X_pca[:, 1], c=y)
axes[0].set_title("PCA (2D)")
axes[1].scatter(X_tsne[:, 0], X_tsne[:, 1], c=y)
axes[1].set_title("t-SNE (2D)")
axes[2].scatter(X_umap[:, 0], X_umap[:, 1], c=y)
axes[2].set_title("UMAP (2D)")
plt.tight_layout()
plt.show()

✅ perplexity=30
- t-SNE에서 로컬 구조(근처 이웃)를 얼마나 고려할지 정하는 하이퍼파라미터. 5~50이 적당함
✅ n_neighbors=15
- UMAP에서 한 점이 몇 개의 이웃과 관계를 맺는다고 볼 것인가?를 정하는 값
- 이게 클수록 더 전체적인(글로벌) 구조를 많이 고려하고,
- 작을수록 더 지역적인(로컬) 구조에 집중함
머신러닝 9강 - 이상탐지
이상탐지
비지도학습
test, train 데이터 분리 안해도 됨
fit_predict 가능
이상치와 다른 점
이상치 탐지는 단순히 통계적으로 이상치 판단
이상탐지는 시계열 데이터와 주변 데이터를 모두 포함하여 이상을 탐지하는 기법
ONE - CLASS -SVM
원 안에 들어가면 정상, 안들어가면 비정상으로 판단
oc_svm = OneClassSVM(nu=0.05) # 5% 이상치 예상
oc_svm.fit(X_2d)
# 예측: 1(정상), -1(이상치)
y_pred_oc = oc_svm.predict(X_2d)
Isolation Forest
랜덤 포레스트랑 비슷함
의사결정에서 가장 첫번째 트리에서 빠져나가는 걸 이상치로 판단
iso_forest = IsolationForest(contamination=0.05, random_state=42) #5% 이상치 예상
iso_forest.fit(X_2d)
# 예측: 1(정상), -1(이상치)
y_pred_if = iso_forest.predict(X_2d)
Local outlier Factor(LOF)
한 데이터 포인터가 주변 데이터들과 얼마나 외각져있는지
밀도가 낮으면 이상 가능성
from sklearn.neighbors import LocalOutlierFactor
lof LocalOutlierFactor(n_neighbors=20, contamination=0.01
pred_lof = lof.fit_predict(data_2d)
lof_outliers = data[pred_lof == 1
print(f"LOF로 탐지된 이상치 개수: {len(lof_outliers)}")
print(lof_outliers)
이상탐지 평가
만약 정답 레이블이 조그이라도 있다면
재현율, 정밀도, roc 로 평가 가능
이상탐지 실습문제
import numpy as np
import matplotlib.pyplot as plt
# 1. Wine 데이터셋 로드
from sklearn.datasets import load_wine
wine = load_wine()
X = wine.data
y = wine.target
# 변수 2개만 선택 (예: 컬럼 0, 1)
X_2d = X[:, :2] # shape: (178, 2)
# 2. One-Class SVM
from sklearn.svm import OneClassSVM
oc_svm = OneClassSVM(nu=0.05) # 예시 파라미터
oc_svm.fit(X_2d)
# 예측: 1(정상), -1(이상치)
y_pred_oc = oc_svm.predict(X_2d)
# 3. Isolation Forest
from sklearn.ensemble import IsolationForest
iso_forest = IsolationForest(contamination=0.05, random_state=42)
iso_forest.fit(X_2d)
# 예측: 1(정상), -1(이상치)
y_pred_if = iso_forest.predict(X_2d)
# 4. 이상치로 예측된 샘플 인덱스 추출
outliers_oc = np.where(y_pred_oc == -1)[0] # One-Class SVM이 예측한 이상치
outliers_if = np.where(y_pred_if == -1)[0] # Isolation Forest가 예측한 이상치
print("=== One-Class SVM ===")
print("이상치로 탐지된 샘플 개수:", len(outliers_oc))
print("이상치 인덱스:", outliers_oc)
print("\n=== Isolation Forest ===")
print("이상치로 탐지된 샘플 개수:", len(outliers_if))
print("이상치 인덱스:", outliers_if)
# 5. 시각화
# 2차원 특성 공간에서 이상치로 판별된 점들을 빨간색으로 표시
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
axes[0].scatter(X_2d[:, 0], X_2d[:, 1], label='Normal')
axes[0].scatter(X_2d[outliers_oc, 0], X_2d[outliers_oc, 1],
color='red', edgecolors='k', label='Outliers')
axes[0].set_title("One-Class SVM")
axes[0].set_xlabel(wine.feature_names[0])
axes[0].set_ylabel(wine.feature_names[1])
axes[0].legend()
axes[1].scatter(X_2d[:, 0], X_2d[:, 1], label='Normal')
axes[1].scatter(X_2d[outliers_if, 0], X_2d[outliers_if, 1],
color='red', edgecolors='k', label='Outliers')
axes[1].set_title("Isolation Forest")
axes[1].set_xlabel(wine.feature_names[0])
axes[1].set_ylabel(wine.feature_names[1])
axes[1].legend()
plt.tight_layout()
plt.show()

머신러닝 10강 딥러닝
단층 퍼셉트론 -> 다층 퍼셉트론 -> 딥러닝
딥러닝 특징
계층적 특징 학습 : 첫 신경망은 선을 따고 그 다음 신경망은 눈 코 입 위치 따고 그 다음은 얼굴형 따고 이런식으로
비선형변환을 반복학습: 비선형관계를 파악하기 위해서 각층마다 비선형 함수를 학습함
오차 역전파: 실제값과 예측값의 차이를 거꾸로 가중치 업데이트
아키텍처
CNN: 이미지나 영상 처리에 특화된 딥러닝 모델로, 합성곱 연산을 통해 특징을 추출하며, 필터를 사용해 입력 이미지를 점점 더 작은 특징 맵으로 축소하면서 계층적으로 학습한다.
- 합성곱 레이어
- 필터(또는 커널)을 이용해 이미지(특징 맵)을 스캔하며 특징을 추출
- 풀링(Pooling) 레이어
- 특징 맵의 크기를 줄이고 주요 특징만 요약
- 완전연결(FC, Fully Connected) 레이어
- 추출된 특징 기반으로 신경망 다 연결해서 분류나 회귀 수행
RNN : 순차적으로 진행하는 딥러닝, 문장과 음성처럼 시간이 있는 시퀀스 데이터에 적합, 장기메모리 문제 발생(LSTM,GRU사용)
Transformers: 인코더와 디코더가 있음, 어텐션 기능이 핵심, 병렬처리인데도 RNN없이도 순차데이터 처리 가능, 자연어 처리뿐 아니라 영상, 음성 등 멀티모달(음성 영상 등 같이 있는 거)에도 응용 가능
attention: 집중해야하는 데이터가 있으면 다른 데이터에 가중치를 부여하여 가장 관련이 깊은 것 찾아냄, ,
Hugging face(파이썬 패키지, 딥러닝을 손쉽게 활용)
머신러닝과 차이점: 머신러닝은 사람이 개입하여 특징 추출, 딥러닝은 스스로 추출 학습