My blog
[ML_week2_chap2] 사이킷런 본문
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 |