본문 바로가기

Study/Introduction to ML with python - 한빛

[Book] 3. 비지도학습과 데이터 전처리 - (1)

Book Title : Introduction to Machine Learning with Python
- 파이썬 라이브러리를 활용한 머신러닝 -

 

지은이 : 안드레아스 뮐러, 세라 가이도

옮긴이 : 박해선

출판사 : 한빛미디어

 

코드 출처

https://github.com/rickiepark/introduction_to_ml_with_python

 

GitHub - rickiepark/introduction_to_ml_with_python: 도서 "[개정판] 파이썬 라이브러리를 활용한 머신 러닝"의

도서 "[개정판] 파이썬 라이브러리를 활용한 머신 러닝"의 주피터 노트북과 코드입니다. Contribute to rickiepark/introduction_to_ml_with_python development by creating an account on GitHub.

github.com


개요

책을 읽고 줄거리를 요약

이미 알고 있는 부분은 빨리 넘어가고 모르는 부분 위주로 요약


3.1 비지도 학습의 종류

비지도 변환

  • 데이터를 새롭게 표현하여 사람이나 다른 머신러닝 알고리즘이 원래 데이터보다 쉽게 해석할 수 있도록 만드는 알고리즘
  • 비지도 변환이 널리 사용되는 분야는 차원 축소(dimenstionality reduction)

군집 알고리즘

  • 데이터를 비슷한 것끼리 그룹으로 묶는 것

3.3.1 여러 가지 전처리 방법

  • RobustScaler : 특성들이 같은 스케일을 갖게 되지만 평균 대신 중앙값을 사용 ==> 극단값에 영향을 받지 않음
  • StandardScalar는 각 특성의 평균을 0, 분산을 1로 변경하여 모든 특성이 같은 크기를 가지게 함, 이 방법은 특성의 최솟값과 최댓값 크기를 제한하지 않음
  • MinMaxSclaer :  매우 다른 스케일의 범위를 0과 1사이로 변환
  • Nomalizer : 특성 벡터의 유클리디안 길이가 1이 되도록 데이터 포인트 조정, 길이 상관없고 데이터의 방향만이 중요할 때 많이 사용
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
cancer = load_breast_cancer()

X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state = 0)

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)

print("스케일 조정 전 특성별 최소값 :\n", X_train.min(axis = 0)[:3])
print("스케일 조정 전 특성별 최소값 :\n", X_train.max(axis = 0)[:3])
print("스케일 조정 전 특성별 최소값 :\n", X_train_scaled.min(axis = 0)[:3])
print("스케일 조정 전 특성별 최소값 :\n", X_train_scaled.max(axis = 0)[:3])

'''
스케일 조정 전 특성별 최소값 :
 [ 6.981  9.71  43.79 ]
스케일 조정 전 특성별 최소값 :
 [ 28.11  33.81 188.5 ]
스케일 조정 전 특성별 최소값 :
 [0. 0. 0.]
스케일 조정 전 특성별 최소값 :
 [1. 1. 1.]
 '''

 

3.3.3 QuantileTransformer 와 PowerTransformer

  • QuantileTransformer : 기본적으로 1000개의 분위를 사용하여 데이터를 균등하게 분포시킴

3.3.4 훈련 데이터와 테스트 데이터의 스케일을 같은 방법으로 조정

  • 지도 학습 모델에서 테스트 세트와 훈련 세트에는 같은 변환을 해줘야 함
  • 분포도가 동일해야 함
from sklearn.svm import SVC
from sklearn.preprocessing import MinMaxScaler
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state = 0)

# 전처리 전
svm = SVC(gamma='auto')
svm.fit(X_train, y_train)
print("정확도", svm.score(X_test, y_test))
# 정확도 0.6293706293706294



# 전처리 후
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)

svm.fit(X_train_scaled, y_train)
print("정확도", svm.score(X_test_scaled, y_test))
# 정확도 0.951048951048951