2장 사이킷런으로 시작하는 머신러닝
01 사이킷런 소개와 특징
사이킷런 : 파이썬 머신러닝 라이브러리 중 가장 많이 사용되는 라이브러리
#입력
pip install scikit-learn==1.0.2
#출력 (오류)
Collecting scikit-learn==1.0.2
Using cached scikit-learn-1.0.2.tar.gz (6.7 MB)
Installing build dependencies ... done
Getting requirements to build wheel ... error
error: subprocess-exited-with-error
#입력 (코드 수정)
!pip install scikit-learn
#입력
import sklearn
print(sklearn.__version__)
#출력
1.5.2
02 첫 번째 머신러닝 만들어 보기 - 붓꽃 품종 예측하기
붓꽃 데이터 세트 : 꽃잎의 길이와 너비, 꽃받침의 길이와 너비
해당 피처(Feature)를 기반으로 꽃의 품종을 예측
사이킷런에서 사용할 모듈을 임포트
- sklearn.datasets : 사이킷런에서 자체적으로 제옥하는 데이터 세트를 생성하는 모듈의 모임
- sklearn.tree : 트리 기반 ML 알고리즘을 구현한 클래스의 모임
- sklearn.model_selection : 학습 데이터와 검증 데이터, 예측 데이터로 데이터를 분리하거나 최적의 하이퍼 파라미터로 평가하기 위한 다양한 모듈의 모임
load_iris() : scikit-learn 라이브러리에서 제공하는 유명한 Iris(아이리스) 데이터셋을 불러오는 함수. Iris 데이터셋은 머신러닝에서 많이 사용되는 샘플 데이터셋 중 하나로, 붓꽃(아이리스)의 3가지 품종에 대해 각각 4개의 특성(꽃잎 길이, 꽃잎 너비, 꽃받침 길이, 꽃받침 너비)을 측정한 데이터
DecisionTreeClassifier : scikit-learn 라이브러리에서 제공하는 결정 트리(Decision Tree) 기반의 분류 모델. 결정 트리는 데이터의 특성을 기반으로 의사 결정을 나무처럼 분기하여 데이터를 분류하는 알고리즘.
train_test_split() : scikit-learn 라이브러리에서 제공하는 함수로, 데이터셋을 학습용 데이터(train set)와 테스트용 데이터(test set)로 분할하는 데 사용. 머신러닝 모델을 학습하고 평가할 때, 데이터를 두 그룹으로 나누는 것이 일반적인데, 학습 데이터는 모델을 훈련하는 데 사용되고, 테스트 데이터는 모델의 성능을 평가하는 데 사용.
1. load_iris() 함수를 이용해 붓꽃 데이터 세트를 로딩한 후, 피처들과 데이터 값이 어떻게 구성돼 있는지 확인하기 위해 DataFrame으로 변환해본다
#입력
import pandas as pd
# 붓꽃 데이터 세트를 로딩합니다.
iris = load_iris()
# iris.data는 Iris 데이터 세트에서 피처(feature)만으로 된 데이터를 numpy로 가지고 있습니다.
iris_data = iris.data
# iris.target은 붓꽃 데이터 세트에서 레이블(결정 값) 데이터를 numpy로 가지고 있습니다.
iris_label = iris.target
print('iris target값:', iris_label)
print('iris target명:', iris.target_names)
# 붓꽃 데이터 세트를 자세히 보기 위해 DataFrame으로 변환합니다.
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
iris_df['label'] = iris.target
iris_df.head(3)
#출력
iris target값: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]

피처 : sepal length, sepal width, petal length, petal width
레이블(결정값) : 0(Setosa 품종), 1(versicolor 품종) ,2(virginica 품종)
2. 학습용 데이터와 테스트용 데이터를 분리한다
X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label, test_size=0.2, random_state=11)
text_size=0.2로 입력 파라미터를 설정하면 전체 데이터 중 테스트 데이터가 20%, 학습 데이터가 80%로 데이터를 분할한다
iris_data : 첫 번째 파라미터, 피처 데이터 세트
iris_label : 두 번째 파라미터, 레이블 데이터 세트
test_size=0.2 : 전체 데이터 세트 중 테스트 데이터 세트의 비율
random_state : 호출할 때마다 같은 학습/테스트 용 데이터 세트를 생성하기 위해 주어지는 난수 발생 값
3. 의사 결정 트리를 이용해 학습과 예측을 수행
# DecisionTreeClassifier 객체 생성
dt_clf = DecisionTreeClassifier(random_state=11)
# 학습 수행
dt_clf.fit(X_train, y_train)
# 학습이 완료된 DecisionTreeClassifier 객체에서 테스트 데이터 세트로 예측 수행.
pred = dt_clf.predict(X_test)
4. 예측 결과를 기반으로 의사 결정 트리 기반의 예측 성능을 평가
#입력
from sklearn.metrics import accuracy_score
print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test,pred)))
#출력
예측 정확도: 0.9333
데이터 세트 분리 : 데이터를 학습 데이터와 테스트 데이터로 분리
모델 학습 : 학습 데이터를 기반으로 ML 알고리즘을 적용해 모델을 학습
예측 수행 : 학습된 ML 모델을 이용해 테스트 데이터의 분류(즉, 붓꽃 종류)를 예측
평가 : 이렇게 예측된 결과값과 테스트 데이터의 실제 결과값을 비교해 ML 모델 성능을 평가
03 사이킷런의 기반 프레임워크 익히기
사이킷런에서는 분류 알고리즘을 구현한 클래스를 Classifier로, 회귀 알고리즘을 구현한 클래스를 Regressor로 지칭. 이들을 합쳐서 Estimator 클래스라고 부른다.
fit() : 머신러닝과 딥러닝 라이브러리에서 모델을 학습시킬 때 사용되는 함수. fit() 함수는 모델이 주어진 훈련 데이터를 바탕으로 학습을 진행할 수 있도록 데이터를 모델에 전달하는 역할을 한다.
predict() 메서드 : 머신러닝 모델이나 딥러닝 모델이 학습을 마친 후, 새로운 데이터에 대한 예측을 수행할 때 사용되는 함수. 모델이 학습된 데이터를 바탕으로 주어진 입력 데이터에 대한 결과를 예측하는 역할을 한다.
#붓꽃 데이터 세트 생성
from sklearn.datasets import load_iris
iris_data = load_iris()
print(type(iris_data))
#출력
<class 'sklearn.utils._bunch.Bunch'>
Bunch 클래스는 파이썬 딕셔너리 자료형과 유사
#딕셔너리 형태이므로 load_iris() 데이터 세트의 key 값을 확인
keys = iris_data.keys()
print('붓꽃 데이터 세트의 키들:', keys)
04 Model Selection 모듈 소개
학습/테스트 데이터 세트 분리 - train_test_split()
- test_size : 전체 데이터에서 데이터 세트 크기를 얼마로 샘플링할 것인가 (디폴트는 25%)
- train_size : 전체 데이터에서 학습용 데이터 세트 크기를 얼마로 샘플링 할 것인가
- shuffle : 데이터를 분리하기 전에 데이터를 미리 섞을지를 결정 (디폴트는 True)
- random_state : 호출할 때마다 동일한 학습/테스트용 데이터 세트를 생성하기 위해 주어지는 난수 값
#입력
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
dt_clf = DecisionTreeClassifier( )
iris_data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target,
test_size=0.3, random_state=121)
#입력
dt_clf.fit(X_train, y_train)
pred = dt_clf.predict(X_test)
print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test,pred)))
#출력
예측 정확도: 0.9556
<교차 검증>
본고사를 치르기 전에 모의고사를 여러 번 보는 것. 즉, 본고사가 테스트 데이터 세트에 대해 평가하는 거라면 모의고사는 교차 검증에서 많은 학습과 검증 세트에서 알고리즘 학습과 평가를 수행하는 것.
K 폴드 교차 검증 : 가장 보편적으로 사용되는 교차 검증 기법. 먼저 K개의 데이터 폴드 세트를 만들어서 K번만큼 각 폴트 세트에 학습과 검증 평가를 반복적으로 수행하는 방법
Stratified K 폴드 : 불균형한 분포도를 가진 레이블 데이터 집합을 위한 K 폴드 방식.
cross_val_score()
- 폴드 세트를 설정하고
- for 루프에서 반복으로 학습 및 테스트 데이터의 인덱스를 추출한 뒤
- 반복적으로 학습과 예측을 수행하고 예측 성능을 반환하는 일련의 과정을 한꺼번에 수행해주는 API
GridSearchCV API
- Classifier나 Regressor와 같은 알고리즘에 사용되는 하이퍼 파라미터를 순차적으로 입력하면서 편리하게 최적의 파라미터를 도출할 수 있는 방안을 제공
05 데이터 전처리
데이터 인코딩
- 레이블 인코딩 : 카테고리 피처를 코드형 숫자 값으로 변환하는 것
- 원-핫 인코딩 : 피처 값의 유형에 따라 새로운 피처를 추가해 고유 값에 해당하는 칼럼에만 1을 표시하고 나머지 칼럼에는 0을 표시하는 방식
피처 스케일링과 정규화
- 표준화 : 데이터의 피처 각각이 평균이 0이고 분산이 1인 가우시안 정규 분포를 가진 값으로 변환하는 것을 의미
- 정규화 : 서로 다른 피처의 크기를 통일하기 위해 크기를 변환해주는 개념
StandardScaler : 표준화를 쉽게 지원하기 위한 클래스
개별 피처를 평균이 0이고, 분산이 1인 값으로 변환
#입력
from sklearn.datasets import load_iris
import pandas as pd
# 붓꽃 데이터 셋을 로딩하고 DataFrame으로 변환합니다.
iris = load_iris()
iris_data = iris.data
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
print('feature 들의 평균 값')
print(iris_df.mean())
print('\\nfeature 들의 분산 값')
print(iris_df.var())
#출력
feature 들의 평균 값
sepal length (cm) 5.843333
sepal width (cm) 3.057333
petal length (cm) 3.758000
petal width (cm) 1.199333
dtype: float64
feature 들의 분산 값
sepal length (cm) 0.685694
sepal width (cm) 0.189979
petal length (cm) 3.116278
petal width (cm) 0.581006
dtype: float64
#입력
from sklearn.preprocessing import StandardScaler
# StandardScaler객체 생성
scaler = StandardScaler()
# StandardScaler 로 데이터 셋 변환. fit( ) 과 transform( ) 호출.
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)
#transform( )시 scale 변환된 데이터 셋이 numpy ndarry로 반환되어 이를 DataFrame으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature 들의 평균 값')
print(iris_df_scaled.mean())
print('\\nfeature 들의 분산 값')
print(iris_df_scaled.var())
#출력
feature 들의 평균 값
sepal length (cm) -1.690315e-15
sepal width (cm) -1.842970e-15
petal length (cm) -1.698641e-15
petal width (cm) -1.409243e-15
dtype: float64
feature 들의 분산 값
sepal length (cm) 1.006711
sepal width (cm) 1.006711
petal length (cm) 1.006711
petal width (cm) 1.006711
dtype: float64
MinMaxScaler : 데이터값을 0과 1 사이의 범위 값으로 변환 (음수 값이 있으면 -1에서 1갑승로 변환)
#입력
from sklearn.preprocessing import MinMaxScaler
# MinMaxScaler객체 생성
scaler = MinMaxScaler()
# MinMaxScaler 로 데이터 셋 변환. fit() 과 transform() 호출.
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)
# transform()시 scale 변환된 데이터 셋이 numpy ndarry로 반환되어 이를 DataFrame으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature들의 최솟값')
print(iris_df_scaled.min())
print('\\nfeature들의 최댓값')
print(iris_df_scaled.max())
#출력
feature들의 최솟값
sepal length (cm) 0.0
sepal width (cm) 0.0
petal length (cm) 0.0
petal width (cm) 0.0
dtype: float64
feature들의 최댓값
sepal length (cm) 1.0
sepal width (cm) 1.0
petal length (cm) 1.0
petal width (cm) 1.0
dtype: float64
06 사이킷런으로 수행하는 타이타닉 생존자 예측
'머신러닝' 카테고리의 다른 글
| [파이썬 머신러닝 완벽 가이드] - 4.1~4.6장 (0) | 2024.11.01 |
|---|---|
| [파이썬 머신러닝 완벽 가이드] - 3장 (1) | 2024.10.11 |
| [파이썬 머신러닝 완벽 가이드] - 1장 (1) | 2024.09.28 |
| [혼자 공부하는 머신러닝+딥러닝] - 비지도 학습 (0) | 2023.11.18 |
| [혼자 공부하는 머신러닝+딥러닝] - 트리 알고리즘 (2) | 2023.11.11 |