Notice
Recent Posts
Recent Comments
Link
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

My blog

[ML_week2_chap2] 사이킷런 본문

ML

[ML_week2_chap2] 사이킷런

gayoung 2026. 1. 24. 18:34

 

2장에서는 사이킷런 model_selection 모듈 : 학습 데이터테스트 데이터 분리 , 교차검증 , 하이퍼 파라미터 튜닝 등등을 학습합니다

.data꽃받침/잎의 수치들 상품 알맹이.feature_names 컬럼 이름들 이름표.targe t0, 1, 2 (품종 번호) 분류 태그

지도학습 

   다양한 피처와 분류 결정값이 레이블 데이터로 모델을 학습한 뒤 , 별도의 데이터 세트에서 미지의 레이블 예측

   즉 , 명확한 정답이 주어진 데이터를 먼저 학습한 뒤 미지의 정답을 예측하는 방식 

 

학습/테스트 데이터 세트 분리 - train_test_split() 

train_test_split (피처 데이터 세트 , 레이블 데이터 세트 , test_size , 등 ) : 학습 / 테스트 데이터 세트 분리
dt_clf.fit(X_train,y_train) :  학습데이터를 기반으로 DecisionTreeClassifier 객체의 fit 메서드로 학습 
dt_clf.predict(X_test) : 모델이 예상한 정답 : 리스트 
accuracy_score(y_test,dt_clf.predict(X_test) : (실제 정답 , 모델 예상 정답) 해서 정확도 평가 

 

* 비지도학습인 차원축소 , 클러스터링 , 피처추출 에서의 

fit()  - 입력 데이터의 형태에 맞춰 데이터 변환

transform() : 차원 변환 , 클러스터링 , 피처 추출들의 실제 작업 

 

 

교차검증 

P:  학습데이터만 쓰면 과적합 문제 발생

S :학습데이터를 다시 분할해 학습 데이터 + 검증 데이터 로 나눈 후 테스트 데이터 평가 

 

1. K 폴드 교차 검증 : k개의 데이터 폴드 세트 , K번만큼의 학습과 검증 평가 , 평균결과로 예측성능평가

  - split : 위치 번호(인덱스)를 생성해주는 함수로 k폴드는 피처데이터 세트 넣음

## ❇️ kfold  적용 예제 
dt_clf = DecisionTreeClassifier(random_state=156)
kfold = KFold(n_splits=5) # 5개의 폴드 세트로 분리하는 KFold 객체 생성
cv_accuracy =[]

for train_index , test_index in kfold.split(features): #split 
 #값 X 번호 - train_index: [2, 3, 4, 5, 6, 7, 8, 9] (공부할 번호) ,test_index: [0, 1] (시험 볼 번호)
    X_train,X_test = features[train_index],features[test_index]
    y_train,y_test = label[train_index],label[test_index]

    #학습 및 예측
    dt_clf.fit(X_train,y_train)
    pred = dt_clf.predict(X_test)
    
    # 반복시 마다 정확도 측정
    accuracy = np.round(accuracy_score(y_test,pred),4)
    train_size = X_train.shape[0]
    test_size = X_test.shape[0]
    cv_accuracy.append(accuracy)
    
print('평균 검증 정확도: ',np.mean(cv_accuracy))

 

2. Stratified K 폴드 : 골고루

   - k폴드로 분할된 레이블 데이터 세트가 전체 레이블 값의 분포도를 반영하지 못한 문제 해결

   - 원본 데이터의 레이블 분포를 먼저 고려한 뒤 이 분포와 동일하게 학습과 검증 데이터 세트 분배 

   - split 에 피처데이터세트 + 레이블 데이터 세트 

## ❇️ skfold 적용 예제 
dt_clf = DecisionTreeClassifier(random_state=156)
skfold = StratifiedKFold(n_splits=3)
cv_accuracy=[]

# StratifiedKFold 의 split 호출시 반드시 레이블 데이터 세트 추가 입력 ! 
for train_index , test_index in skfold.split(features,label):
    
    #split()으로 반환된 인덱스를 이용해 학습용 , 검증용 테스트 데이터 추출
    X_train , X_test = features[train_index] , features[test_index]
    y_train , y_test = label[train_index],label[test_index]
    #학습 
    dt_clf.fit(X_train,y_train)
    #예측
    pred = dt_clf.predict(X_test)
    #반복시 마다 정확도 측정
    accuracy = np.round(accuracy_score(y_test,pred),4)
    
    cv_accuracy.append(accuracy)
print('교차 검증별 정확도 :',np.round(cv_accuracy,4)) # 리스트 각각 반올림 
print('평균 검증 정확도 :',np.round(np.mean(cv_accuracy),4))
  • 일반 K-Fold: 교과서 1~3단원 공부하고, 시험은 4단원에서만 나옴
  • Stratified K-Fold: 교과서 1~4단원 전체를 골고루 요약해서 공부하고, 시험도 전 범위에서 골고루 나옴
  • 왜곡된 레이블 데이터 세트에서는 반드시 Stratified K  폴드 이용해 교차 검증해야함
  • 일반적으로 <  분류 : Stratified K > < 회귀 :X (연속값이라) > 

지금 과정은 폴드세트 설정하고 인덱스 설정하고 .. 반복적 학습하고 예측성능을 반환했는데 

교차검증을 한번에 해주는 함수가 있다 

 

cross_val_score() 

- 반환값은  성능 지표 측정값 배열 

- 분류가 입력되면 Straified 방식 , 회귀면 K폴드

scores = cross_val_score(dt_clf,data,label,scoring ='accuracy',cv=3)
print('교차 검증별 정확도 :',np.round(cv_accuracy,4)) # 리스트 각각 반올림 
print('평균 검증 정확도 :',np.round(np.mean(cv_accuracy),4))

 

교차검증 + 최적 하이퍼 파라미터 튜닝 

GridSearchCV 

- 하이퍼 파라미터를 순차적으로 입력하면서 최적의 파라미터를 도출하는 api 제공

- 하이퍼 파라미터란  max_depth, learning_rate 같이 사람이 모델 학습 전에 수동 설정

#1. 학습 데이터 테스트 데이터분리
X_train , X_test , y_train ,y_test = train_test_split(iris_data.data , iris_data.target ,test_size=0.2,random_state=121)
#2. 객체
dtree = DecisionTreeClassifier()
#3. 파라미터를 딕셔너리 형태로 설정 
parameters = {'max_depth':[1,2,3],'min_samples_split':[2,3]}
#설정
grid_dtree = GridSearchCV(dtree,param_grid=parameters ,cv=3,refit=True)
#학습
grid_dtree.fit(X_train,y_train)
#결과는 딕셔너리라 DataFrame으로 변경
scores_df = pd.DataFrame(grid_dtree.cv_results_)
scores_df[['params', 'mean_test_score', 'rank_test_score']]

print(grid_dtree.best_params_)
print(grid_dtree.best_score_)

 

 

데이터 전처리

- 사이킷런 문자열값이 입력값 X

 

1. 레이블 인코딩 : 카테고리 피처를 코드형 숫자값으로 

- LabelEncoder를 객체로 생성한 후 , fit() 과  transform()으로 레이블 인코딩 

- 1,2, 같은 숫자라서 가중치가 인식 될 수도 있어 선형회귀같은 ML 알고리즘엔 적용 X , 트리 O

encoder = LabelEncoder()
encoder.fit(items) # 번호 배정 
labels = encoder.transform(items) # 글자를 숫자로 TV -.3 냉장고 ->0 이렇게 
print(labels)

 

2 .원-핫 인코딩 : 새로운 피처를 추가해 고유 값에만 1 추가 

- 입력값으로 2차원 데이터 필요 

- OneHotEncoder 를 이용해 변환값이 희소행렬이므로 toarray() 메서드로 밀집행렬로 변환해야함

- 판다스의 pd.getdummies(df) 

#2차원 ndarray로 변환
items = np.array(items).reshape(-1,1)

oh_encoder = OneHotEncoder()
oh_encoder.fit(items)
oh_labels = oh_encoder.transform(items)
print(oh_labels.toarray())

df = pd.DataFrame({'items' : ['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']})
pd.get_dummies(df,dtype=int)

 

 

피처 스케일링과 정규화

피처스케일링 : 서로 다른 변수 값 범위를 일정한 수준으로 맞추는 작업 ex ) 표준화 , 정규화 

1. 표준화 scaler = StandardScaler() 가우시안 분포 활용

2. MinMaxScaler : 데이터값을 0과 1사이의 범위값 (음수는 -1~1) 데이터 분포가 가우시안 분포가 아닐경우 활용

 

*Scaler 클래스의 fit() , transform() 은 2차원 이상의 데이터만 가능 

#객체 
scaler = StandardScaler()    # MinMaxScaler()
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df) # transform으로 변환된거 ndarry 이므로 df로 변환

iris_df_scaled = pd.DataFrame(data=iris_scaled , columns = iris.feature_names)
print(iris_df.mean())
print(iris_df.var())

 

✔️ 스케일링 변환 시 유의점 - 테스트 데이터는 학습 데이터의 스케일링 기준을 따라야함 테스트 데이터에 fit() X 

scaler = MinMaxScaler()
train_array = np.arange(0, 11).reshape(-1, 1)
test_array = np.arange(0, 6).reshape(-1, 1)

scaler.fit(train_array)
train_scaled = scaler.transform(train_array)
test_scaled = scaler.transform(test_array)

'ML' 카테고리의 다른 글

[ML_week4_chap3] 평가  (0) 2026.02.10
[ML_week3_chap5] 회귀  (0) 2026.02.03
[ML_week2_chap6] 차원축소  (0) 2026.01.27
[ML_week1_chap10] 시각화  (0) 2026.01.19
[ML_week1_chap1] Numpy , Pandas  (0) 2026.01.19