본문 바로가기
CS/머신러닝

머신러닝 자주 쓰이는 함수 정리

by jaehoonChoi 2023. 2. 5.

* 공부하면서 계속 업데이트합니다

1. train_test_split 

train_test_split은 훈련데이터와 테스트데이터를 나눠주는 함수입니다.

기본변수는 X, y, test_size 비율, random_state 가 있습니다.

 

from sklearn.model_selection import train_test_split
X_train, X_test,y_train, y_test=train_test_split(X, y, test_size= , random_state= )

 

 

2. KFold

회귀에서 교차검증시 사용합니다. KFold(n_splits=~)꼴로 객체를 생성하면, 

splits 개수만큼 fold를 나눠서 수행하게 됩니다. 나뉜 fold를 보기 위해선 kfold.split()를

사용하면 됩니다. 

from sklearn.model_selection import KFold
folds=KFold(n_splits=5)
X=iris.data
y=iris.target
for train_idx, test_idx in folds.split(X):
    X_train, X_test=X[train_idx], X[test_idx]
    y_train, y_test=y[train_idx], y[test_idx]
    print(f'훈련 데이터: {X_train.shape}')
    print(f'테스트 데이터 크기: {X_test.shape}')

 

훈련 데이터: (120, 4)
테스트 데이터 크기: (30, 4)
훈련 데이터: (120, 4)
테스트 데이터 크기: (30, 4)
훈련 데이터: (120, 4)
테스트 데이터 크기: (30, 4)
훈련 데이터: (120, 4)
테스트 데이터 크기: (30, 4)
훈련 데이터: (120, 4)
테스트 데이터 크기: (30, 4)

 

 

3. StratifiedKFold

분류에서 KFold를 이용할 때 사용합니다. 분류문제의 경우 그냥 kflod로 나누게 되면, 훈련데이터에는 1만 있고

테스트데이터에는 0만 있어 학습률이 매우 떨어지는 문제가 발생합니다. StratifiedKFold는 타깃비율에 맞춰

훈련데이터와 테스트데이터를 나눠주어 제대로된 학습률을 측정할 수 있습니다.

 

from sklearn.model_selection import StratifiedKFold
fold=StratifiedKFold(n_splits=3)
n=0
for train_idx, test_idx in fold.split(iris_df, iris_df['target']):
    n+=1 
    target_train=iris_df['target'].iloc[train_idx]
    target_test=iris_df['target'].iloc[test_idx]
    print(target_train.value_counts())
    print(target_test.value_counts())

 

2    34
0    33
1    33
Name: target, dtype: int64
0    17
1    17
2    16
Name: target, dtype: int64
1    34
0    33
2    33
Name: target, dtype: int64
0    17
2    17
1    16
Name: target, dtype: int64
0    34
1    33
2    33
Name: target, dtype: int64
1    17
2    17
0    16
Name: target, dtype: int64

 

4. cross_val_score

KFold를 만들고 수행하면서 학습(fit), 예측(predict), 평가(evaluation)을 시켜주는 편리한 함수입니다

참고로 처음 Estimator를 지정할때 분류모델로 지정시 자동으로 StratifiedKFold로 처리해줍니다.

data와 target, 그리고 평가지표 scoring과 몇번 나눌껀지 cv(=n_splits) 값을 변수로 받습니다. 

 

from sklearn.model_selection import StratifiedKFold
iris=load_iris()
X, y=iris.data, iris.target 
dt_clf=DecisionTreeClassifier(random_state=42) 
fold=StratifiedKFold(n_splits=5) # kfold 5개로 나눔
cv_accuracy=[] # 예측값 담을 리스트

n_iter=0
for train_idx, test_idx in fold.split(X, y):
    X_train, X_test=X[train_idx], X[test_idx]
    y_train, y_test=y[train_idx], y[test_idx]
    # 훈련
    dt_clf.fit(X_train, y_train)
    # 평가
    accuracy=round(dt_clf.score(X_test, y_test),4)
    n_iter+=1 # 반복 횟수
    print(f'{n_iter} 교차검증 결과: {accuracy}\n')
    cv_accuracy.append(accuracy)
print(f'평균 정확도: {np.round(np.mean(cv_accuracy),4)}')

 

위와 같은 코드를, 

 

X, y=iris.data, iris.target
dt_clf=DecisionTreeClassifier(random_state=42)                       
scores=cross_val_score(dt_clf, X, y, scoring='accuracy', cv=5)
print(f'교차검증별 정확도: {np.round(scores,4)}')
print(f'평균검증 정확도: {np.round(np.mean(scores),4)}')

 

이렇게 순식간에 줄여주는 기능을 합니다. 

 

 

5. value_counts

value_counts() 함수는 이름 그대로 값의 개수를 세주는 역할을 합니다. 주로 범주형 데이터의 분포를

확인할 때 사용됩니다. 범주형 target이 0,1,2로 이루어져 있다면, (data).value_counts()는 data에서

0,1,2의 개수를 각각 출력해줍니다. 

 

 

6. iloc 

integer+location의 약자로, 정수형으로 원하는 데이터를 뽑을 때 사용됩니다.

예를 들어 주어진 train data에서 마지막 column이 target이라면, feature들만 추출하려면, 

 

X=train.iloc[:, :-1] # feature
y=train.iloc[:, -1] # target

 

위처럼 작성할 수 있습니다. 슬라이싱을 사용할 수 있어 원하는 데이터를 뽑기에 유용합니다.

 

 

7. enumerate

enumerate함수는 자료형을 돌면서 튜플형태로 (순번, 원소) 형태로 반환하는 함수입니다.

for 문을 이용할때보다 파이써닉하게 코드를 작성할 수 있습니다. 

 

f, ax=plt.subplots(figsize=(10, 8), nrows=3, ncols=4)
f.tight_layout() # 간격 자동맞춤 
features=boston.feature_names[:-1]
for i, feature in enumerate(features):
    r, c=i//4, i%4
    sns.regplot(x=feature, y='PRICE', data=df, ax=ax[r][c], 
                line_kws={'color': 'red'}, scatter_kws={'color': 'grey'})

 

위 코드는 12개의 feature을 3*4 규격에 그래프로 표현하는 코드입니다. 

enumerate를 통해 (i, feature)를 얻은 후 i를 통해 r,c를 알아내어 그릴 수 있습니다. 

댓글