KT 에이블스쿨 18일차(1)

박기범·2023년 2월 23일
0

에이블스쿨

목록 보기
22/95

오늘은 머신러닝 4일차로 알고리즘과 머신러닝 성능 향상 방법에 대해 배웠습니다.



머신러닝의 복잡도

모델이 복잡하다는 것은 학습데이터에 너무 치중한 나머지 실제 평가데이터로 평가를 진행하면 머신러닝의 성능이 좋지 않은 것을 의미합니다. 즉, 과적합 위험이 있다는 것을 의미합니다.
Linear Regressin : 독립변수가 너무 많을수록 복잡한 모델입니다.
KNN : k값 즉, n_neighbors 값이 작을수록 복잡한 모델입니다.
Decision Tree : max_depth의 값이 클수록 복잡한 모델입니다.

결국 우리는 적절한 복잡성을 가지는 모델을 만들기 위해서는 적합한 값을 가지는 파라미터를 찾아야 합니다.

복잡도가 높은 모델이면 학습데이터를 평가하면 좋은 결과가 나옵니다. 하지만 학습데이터를 100% 다 맞춘다 하더라도 평가데이터를 다 맞추는 것이 아니라 좋은 모델이라고는 할 수 없습니다. 따라서 적절한 분류와 회귀 학습을 통해 평가데이터에서 좋은 결과를 내는 것이 중요합니다.



로지스터 회귀(Logistic Regression)

로지스터 회귀의 이름에 회귀가 들어가지만 회귀 예측을 만드는 알고리즘이 아닌 분류 모델을 만드는 알고리즘입니다. 시그모디드 함수라고도 부르면서 확률값은 선형 판별식 값이 커지면 1, 작아지면 0에 가까운 값이 됩니다.

▶실습

	# 1단계: 불러오기
    from sklearn.linear_model import LogisticRegression
    from sklearn.metrics import classification_report, confusion_matrix
    # 2단계: 선언하기
    model = LogisticRegression()
    # 3단계: 학습하기
    model.fit(x_train, y_train)
    # 4단계: 예측하기
    y_pred = model.predict(x_test)
    # 5단계 평가하기
    print(confusion_matrix(y_test, y_pred))
    print(classification_report(y_test, y_pred))

로지스터 회귀는 위와 같은 방법으로 사용합니다.



클레스 불균형

분류해야될 변수가 한쪽으로 값이 몰려있는 데이터가 있습니다. 예를들어 우리나라의 비가 안올 확률이 높은 것처럼 0혹은 1의 데이터 한 쪽에 데이터가 몰려 있는 데이터들이 있습니다. 이렇게 변수가 불균형하게 있는 경우가 있는데 이 데이터를 가지고 머신러닝을 진행하면 정확도는 높지만 재현율이 낮은 모델이 만들어지게 됩니다. 이런 현상을 클레스 불균형이라고 부릅니다. 정확도가 높아 좋아보일 순 있지만 재현율이 높은 모델이 필요할 경우가 있기 때문에 꼭 좋다고라고 말할 수 없습니다.

이런 문제를 해결하기 위해 UnderSampling이나 OverSampling기법을 사용합니다.

▶언더샘플링의 코드

	# 불러오기
	from imblearn.under_sampling import RandomUnderSampler
    # Under Sampling
    under_sample = RandomUnderSampler()
    u_x_train, u_y_train = under_sample.fit_resample(x_train, y_train)

언더샘플링을 사용하면 데이터의 분포를 서로 맞춰줍니다.(언더샘플링은 많은 분포를 가지고 있는 데이터를 랜덤하게 날립니다.)

샘플링 작업 끝나면 똑같이 머신러닝을 진행해주면 recall(재현율)이 오른것을 확인할 수 있습니다.

▶오버샘플링의 코드

	# 불러오기
    from imblearn.over_sampling import RandomOverSampler
    # Over Sampling
    over_sample = RandomOverSampler()
    o_x_train, o_y_train = over_sample.fit_resample(x_train, y_train)

위 방법 말고 다른 방법의 오버샘플링 코드가 있습니다.

	# 불러오기
    from imblearn.over_sampling import SMOTE
    # Over Sampling
    smote = SMOTE()
    s_x_train, s_y_train = smote.fit_resample(x_train, y_train)
	

파라미터인 class_weight의 값을 주어 불균형을 해결할 수도 있습니다.

	# 불러오기
    from imblearn.over_sampling import SMOTE
    # Over Sampling
    smote = SMOTE()
    s_x_train, s_y_train = smote.fit_resample(x_train, y_train)
    



Support Vector Machine

분류를 위한 기준선을 그어주는 방식으로 결정경계선(Decision Boundary)을 찾는 알고리즘입니다. 성능 향상을 위해서는 정규화 작업이 필요합니다.

결정 경계는 서로 다른 분류값을 결정하는 경계를 의미합니다.

비용(C)라는 변수를 사용하여 마진을 크게 혹은 작게 가져갈 수 있습니다. 이 마진을 적절하게 설정하는 것이 중요합니다.

선을 그을 때 직선뿐 아니라 감마와 커널트릭을 사용하여 선에 굴곡을 주어 변형시킬수 있습니다. 따라서 최적의 커널트릭의 C와 감마를 찾으면 됩니다.

▶용어
마진은 서포트 벡터와 결정 경계사이의 거리를 의미합니다.
서포트 벡터는 결정 경계선과 가장 가까운 포인트(데이터)를 의미합니다.
벡터는 2차원 공간에서 나타나는 데이터 포인트를 의미합니다.

※정규화가 필요한 알고리즘은 KNN과 SVM입니다.



튜닝

튜닝은 머신러닝의 성능을 더 좋아지게 하는 기술입니다.

▶성능예측
모델 평가를 하기 전에 성능을 예측하는 것입니다. 학습데이터를 한번 더 학습과 테스트데이터로 나눠서 성능을 예측합니다. 이런 검증을 한번만 하는 것이 아니라 반복적인 검증을 통해 해당 검증들의 평균이 최종 테스트를 진행했을 때 나올 수 있다고 예측할 수 있습니다.

▶K-Fold Cross Validation

K-폴드 교차 검증을 사용하면 모든 데이터가 평가에 한번 사용하고 k-1만큼 학습에 사용됩니다. 장점은 모든 데이터를 학습과 평가에 사용을 하기 때문에 일반화된 모델을 만들 수 있지만 반복 횟수가 많아지기 때문에 그만큼 시간이 오래걸린다는 단점이 있습니다.

▶K분할 교차 검증 실습
일부 알고리즌에는 정규화 진행이 필요하기 때문에 정규화된 데이터를 구분하기 위해 변수명 뒤에 _s를 붙여서 변수명을 분리했습니다.

결정 트리에서의 K-Folde 교차검증 사용

	#결정트리
    # 불러오기
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.model_selection import cross_val_score

    # 선언하기 
    model = DecisionTreeClassifier(max_depth=5, random_state=1)

    # 검증하기
    cv_score = cross_val_score(model, x_train, y_train, cv=10, scoring='accuracy')
    #scoring 옵션값을 설정해주면 해당 성능검증을 진행해줍니다.

    # 확인
    print(cv_score)
    print('평균:', cv_score.mean())
    print('표준편차:', cv_score.std())

KNN에서의 K-Fold 교차검증 사용

	#KNN
    # 불러오기
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.model_selection import cross_val_predict

    # 선언하기 
    model = KNeighborsClassifier(n_neighbors=5)

    # 검증하기
    cv_score = cross_val_score(model, x_train_s, y_train, cv=10, scoring='accuracy')

    # 확인
    print(cv_score)
    print('평균:', cv_score.mean())
    print('표준편차:', cv_score.std())

로지스터회귀에서의 K-Fold 교차검증 사용

	#로지스터회귀
    # 불러오기
    from sklearn.linear_model import LogisticRegression
    from sklearn.model_selection import cross_val_score

    # 선언하기 
    model = LogisticRegression()

    # 검증하기
    cv_score = cross_val_score(model, x_train, y_train, cv = 10, scoring='accuracy')

    # 확인
    print(cv_score)
    print('평균:', cv_score.mean())
    print('표준편차:', cv_score.std())

SVM에서 K-Fold 교차검증 사용

	# 불러오기
    from sklearn.svm import SVC
    from sklearn.model_selection import cross_val_score


    # 선언하기 
    model = SVC(kernel='linear', C=1)

    # 검증하기
    cv_score = cross_val_score(model, x_train_s, y_train, cv=10, scoring='accuracy')

    # 확인
    print(cv_score)
    print('평균:', cv_score.mean())
    print('표준편차:', cv_score.std())

cv는 분할 개수입니다. 필요에 따라서 적절히 조절할 수 있습니다.
분류에서의 검증은 accuracy가 디폴트 값이고 회귀에서의 검증 r2_score가 디폴드 값입니다.



하이퍼파라미터로 성능예측

교차검증으로만 머신러닝 알고리즘을 선택하면 안됩니다. 이유는 하이퍼파라미터의 설정에 따라 머신러닝의 성능이 달라지기 때문입니다. 하이퍼파라미터는 사용자가 수정할 수 있는 파라미터를 의미하고 KNN에서는 n_neighbors, 결정트리에서는 max_depth등이 있습니다.

파라미터의 고민은 과연 어떤 파라미터의 값이 최적의 예측 값일지 고민을 해야합니다.

Grid Search는 성능 테스트를 할 파라미터 값의 범위를 설정하면, 해당 범위의 모든 파라미터 값을 테스트 후 성능이 제일 좋은 파라미터 값으로 자동 학습을 합니다.
Random Search는 성능 테스트를 할 파라미터 값의 범위를 설정하면, 해당 범위 내의 몇 개의 파라미터 값을 지정해서 성능테스트를 진행하고 성능이 제일 좋은 파라미터 값으로 자동 학습을 합니다.







오늘은 머신러닝의 성능 향상 방법에 대해 배웠습니다. 데이터에 대해서 어떤 알고리즘을 적용할 지에 대해서 많은 방법이 있다는 것을 느꼈습니다. K-Fold교차 검증과 하이퍼파라미터 검색 방법에 대해 익숙해져야겠습니다.




※공부하고 있어 다소 틀린점이 있을 수 있습니다. 언제든지 말해주시면 수정하도록 하겠습니다.
※용어에 대해 조금 공부 더 해서 수정하겠습니다.

profile
개발자가 되기 위한 한걸음

0개의 댓글