KT 에이블스쿨 19일차(2)

박기범·2023년 2월 25일
0

에이블스쿨

목록 보기
24/95
post-custom-banner

머신러닝의 최종실습을 통해 최종정리를 하겠습니다.



데이터 가져오기

처음으로는 필요한 패키지를 불러옵니다.

	import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    import warnings

    warnings.filterwarnings(action='ignore')
    %config InlineBackend.figure_format = 'retina'

warings은 오류는 아니지만 경고를 알려주는 해당 경고를 안띄우게 해주는 설정입니다.

다음으로는 데이터를 가져옵니다.

	path = '데이터주소'
	data = pd.read_csv(path)

데이터 분석

데이터를 불러왔다면 다음으로는 데이터에 대해서 분석을 진행합니다. 데이터 분석에는 다양한 방법이 있는데 .head().tail()을 사용해줍니다. 전체적인 변수의 정보를 확인하기 위해서는 .info()를 사용합니다. 기술통계(표준편차, 사분위수, 평균등)을 정보를 얻고자 한다면 .describe()를 사용합니다.


데이터 준비

데이터 분석이 끝났다면 머신러닝을 위한 데이터 준비에 들어갑니다.
우선 x, y로 데이터를 분리해줍니다.

	# target 확인
    target = '타겟명'

    # 데이터 분리
    x = data.drop(target, axis=1)
    y = data.loc[:,target]

타겟은 y값으로 예측으로 통해 알고자하는 변수를 적어줍니다.

데이터 분리 후에는 가변수화가 필요한 변수들이 있으면 one-hot encoding을 통한 가변수화를 진행해줍니다.

	# 가변수화 대상 선정
    dumm_cols = ['컬럼명1', '컬럼명2']

    # 가변수화
    x = pd.get_dummies(x, columns=dumm_cols, drop_first=True )

    # 확인
    x.head()

성별이나 등급 객실처럼 object타입이거나 int타입이라해도 0,1,2,3같이 연속된 숫자가 아닌 변수들에 한해서 가변수화를 진행해줍니다. 단, 타겟의 변수는 절대 건들지 않도록합니다. 그래서 데이터를 분리한 후에 x에 대해서만 가변수화를 진행해주면 이런 문제를 방지할 수 있습니다.

가변수화까지 진행이 다 됐다면 학습용과 평가용 데이터로 분리합니다. 캐글에서는 평가용 데이터가 따로 있어서 데이터 분리를 할 필요가 없다고는 하지만 그럼 검증을 위해 하는 단계라고 이해하면 될 것 같습니다 학습용과 검증용 데이터 분리를 진행합니다.

	# 모듈 불러오기
    from sklearn.model_selection import train_test_split

    # 데이터 분리
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1)

변수명은 약속이기 때문에 틀에서 벗어나지 않도록 합니다. 사이킷런의 model_selection모듈에서 train_test_split을 가져와서 데이터 셋을 분리해줍니다.

평가용과 검증용(테스트용)의 데이터분리가 끝나면 정규화를 진행합니다. 정규화가 필요한 알고리즘은 KNN과 SVM이 있는데 정규화를 진행한 후에 다른 데이터에 그대로 사용해도 무방하기 때문에 정규화 작업을 해준 후 사용해도 됩니다.

	# 모듈 불러오기
    from sklearn.preprocessing import MinMaxScaler

    # 정규화
    scaler = MinMaxScaler()
    scaler.fit(x_train)

    x_train = scaler.transform(x_train)
    x_test = scaler.transform(x_test)

정규화를 진행하면 데이터타입은 리스트 타입으로 바뀌기 때문에 필요하다면 데이터프레임으로 바꾸는 형태도 기억하면 좋습니다.

	# 모듈 불러오기
    from sklearn.preprocessing import MinMaxScaler
    
    x_cols = list(x)

    # 정규화
    scaler = MinMaxScaler()
    scaler.fit(x_train)

    x_train = scaler.transform(x_train)
    x_test = scaler.transform(x_test)
    
    x_train = pd.DataFrame(x_train, columns = x_cols)
    x_test = pd.DataFrame(x_test, columns=x_col)

이제 머신러닝을 위한 모든 데이터 준비가 완료되었습니다. 이제는 머신러닝을 실시하겠습니다.


성능 예측

※필요에 따라서는 pip install을 통해 필요 모듈들을 설치해야됩니다.

먼저 머신러닝에 사용할 함수들을 불러옵니다.

	# 불러오기
    from sklearn.metrics import *
    from sklearn.linear_model import LinearRegression
    from sklearn.tree import DecisionTreeRegressor
    from sklearn.model_selection import cross_val_score, GridSearchCV
    from sklearn.neighbors import KNeighborsRegressor
    from sklearn.svm import SVR
    from sklearn.ensemble import RandomForestRegressor
    from xgboost import XGBRFRegressor
    from lightgbm import LGBMRegressor

    result = {}

평가 방법은 sklearn.metrics에 있기 때문에 모든 패키지를 불러온다는 *를 사용하여 모든 평가 방법을 가져와줍니다. 그리고 해당 실습에서는 회귀예측을 위해 회귀 방법의 알고리즘들을 불러왔습니다. 항상 회귀 예측인지 분류 예측인지 잘 생각해야됩니다. 왜냐하면은 회귀와 분류에 사용하는 알고리즘이 다르고 평가 방법이 다르기 때문입니다. result는 알고리즘 별로 결과값을 저장해서 확인하기 위해 알고리즘 이름을 키 값으로 그리고 결과 값을 value값으로 저장하기 위해 dictionary 만들어주었습니다.

모든 알고리즘은 K-Fold CV를 사용해서 교차검증을 진행했습니다.

먼저 Linear Regression 사용방법을 보겠습니다.

	# 선언하기
    model = LinearRegression()
    # 성능예측
    cv_score = cross_val_score(model, x_train, y_train, cv = 10)
    # 결과확인
    print(cv_score)
    print('평균', cv_score.mean())
    # 결과수집
    result['Linear Regression'] = cv_score.mean()

다음으로 KNN알고리즘 사용방법을 보겠습니다.

	# 선언하기
    model = KNeighborsRegressor()
    # 성능예측
    cv_score = cross_val_score(model, x_train, y_train, cv =10)
    # 결과확인
    print(cv_score)
    print('평균 :',cv_score.mean())
    # 결과수집
    result['KNN'] = cv_score.mean()

다음으로는 Decision Tree에 대한 사용방법을 보겠습니다.

	# 선언하기
    model = DecisionTreeRegressor(max_depth=5, random_state=1)
    # 성능예측
    cv_score = cross_val_score(model, x_train, y_train, cv = 10)
    # 결과확인
    print(cv_score)
    print('평균', cv_score.mean())
    # 결과수집
    result['Decision Tree'] = cv_score.mean()

다음으로는 SVM에 대한 사용법을 보겠습니다.

    # 선언하기
    model = SVR(kernel='poly', gamma=1 ,C=3)
    # 성능예측
    cv_score = cross_val_score(model, x_train, y_train, cv =10)
    # 결과확인
    print(cv_score)
    print('평균:', cv_score.mean())
    # 결과수집
    result['SVR'] = cv_score.mean()

다음으로는 Random Forest에 대한 사용법을 보겠습니다.

	# 선언하기
    model = RandomForestRegressor(max_depth=5, random_state=1)
    # 성능예측
    cv_score = cross_val_score(model, x_train, y_train, cv=10)
    # 결과확인
    print(cv_score)
    print('평균 :',cv_score.mean())
    # 결과수집
    result['Random Forest'] = cv_score.mean()

다음으로는 XGBoost에 대한 사용법을 보겠습니다.

	# 선언하기
    model = XGBRFRegressor(max_depth = 5, random_state = 1)
    # 성능예측
    cv_score = cross_val_score(model, x_train, y_train, cv=10)
    # 결과확인
    print(cv_score)
    print('평균', cv_score.mean())
    # 결과수집
    result['XGBoost'] = cv_score.mean()

다음으로는 LightGBM에 대한 사용법을 보겠습니다.

    # 선언하기
    model = LGBMRegressor(max_depth=5, random_state = 1)
    # 성능예측
    cv_score = cross_val_score(model, x_train, y_train, cv=10)
    # 결과확인
    print(cv_score)
    print('평균 :',cv_score.mean())
    # 결과수집
    result['LightGBM'] = cv_score.mean()

이로써 배운 모든 머신러닝 알고리즘을 한번씩 사용해봤습니다. 물론 아직 하이퍼파라미터에 대해 Search기법을 사용하지 않았지만 먼저 각 알고리즘에 대해 성능평가를 확인하고 잘나온 모델에 대해서 최적의 하이퍼파라미터를 찾아주겠습니다.


결과 확인

result에 각 알고리즘에 대한 결과를 넣었기 때문에 result를 확인하겠습니다.

	for m_name, score in result.items():
    	print(m_name, score.round(3))

시각화로도 확인할 수 있습니다.

    # 성능 시각화 비교
    plt.barh(list(result.keys()), result.values())
    plt.show()

해당 결과 확인을 통해 가장 성능이 좋았던 알고리즘을 선택해서 최종 알고리즘으로 결정을 합니다. 결정이 된 알고리즘을 가지고 이제 하이퍼파라미터 튜닝을 통해 더 좋은 성능을 기대할 수 있도록 최적의 하이퍼파라미터 값을 찾습니다.

저는 XGBoost가 가장 성능이 높게 나와서 XGBoost에 대해 튜닝을 진행하겠습니다.


성능 튜닝

먼저 최종 알고리즘에 대해 튜닝 준비를 해줍니다.

	# 기본 모델 선언
    model_xg = XGBRFRegressor(random_state=1)

    # 파라미터 지정
    # max_depth
    param = {'max_depth' : range(1,21)}

    # 모델 선언
    model = GridSearchCV(model_xg, param, cv=10)

XGBoost는 결정트리 기반이기 때문에 max_deapthmin_samples_leaf 등의 하이퍼파라미터를 가지고 있습니다. 하지만 파라미터의 갯수가 많아지면 튜닝 속도가 오래걸리기 때문에 max_deapth에 대해서만 튜닝을 진행했습니다.

파라미터 지정과 모델선언이 끝났다면 학습을 진행해줍니다.

	# 학습하기
    model.fit(x_train, y_train)

학습횟수는 파라미터 범위 20, CV값(K값) 10을 곱한 값으로 200번 진행합니다.

학습이 완료되면 결과확인을 통해 최적의 파라미터 값과 최고의 성능을 알아냅니다.

	# 최적 파라미터, 예측 최고 성능
    print('최적의 파라미터 :', model.best_params_)
    print('최고의 성능 :', model.best_score_)

그리고 변수의 중요도를 시각화해서 각 변수별로 중요도를 확인합니다. XGBoost에서 변수 중요도를 시각화해서 보는 방법은 아래와 같습니다.

    # 변수 중요도 시각화
    plt.barh(list(x), model.best_estimator_.feature_importances_)
    plt.show()

XGBoost에서 변수중요도 확인은 모델.best_estimator_.feature_importances_를 사용해주면 확인할 수 있습니다.

이제 마지막으로 최종 성능평가를 진행합니다.


성능 평가

    # 예측하기
    y_pred = model.predict(x_test)
    # 성능평가
    print('MAE : ', mean_absolute_error(y_test, y_pred))
    print('R2 : ', r2_score(y_test, y_pred))

평가 방법으로는 회귀모델이기 때문에 r2_scoreMAE를 사용했습니다.







오늘로 이제 머신러닝에 대해 공부를 마쳤습니다. 학습데이터에서 성능이 좋았다고 최종평가에서 성능이 좋게 나오는 것은 아니지만 배운 것을 최대한 활용하고 튜닝을 해서 성능을 끌어올려야겠다고 생각했습니다.




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

profile
개발자가 되기 위한 한걸음
post-custom-banner

0개의 댓글