연습 - 기계 학습 모델 빌드

완료됨

기계 학습 모델을 만들려면 학습용 및 테스트용의 두 가지 데이터 세트가 필요합니다. 실제로 데이터 세트가 하나만 있는 경우가 많으므로 데이터 세트를 둘로 나눕니다. 이 연습에서는 이전 랩에서 준비한 DataFrame을 80-20 비율로 분할하여 기계 학습 모델을 학습하는 데 사용할 수 있습니다. 또한 DataFrame을 기능 열과 레이블 열로 구분합니다. 전자는 모델에 입력으로 사용되는 열(예: 항공편의 출발지와 도착지, 예정 출발 시간)을 포함하고, 후자는 모델에서 예측하려고 하는 열(이 경우 항공편의 정시 도착 여부를 나타내는 ARR_DEL15 열)을 포함합니다.

  1. 이전 섹션에서 만든 Azure Notebook으로 다시 전환합니다. Notebook을 닫은 경우 Microsoft Azure Notebooks 포털에 다시 로그인하고, Notebook을 열고, ->모두 실행을 사용하여 Notebook의 모든 셀을 다시 실행할 수 있습니다.

  2. Notebook의 끝에 있는 새 셀에서 다음 명령문을 입력하고 실행합니다.

    from sklearn.model_selection import train_test_split
    train_x, test_x, train_y, test_y = train_test_split(df.drop('ARR_DEL15', axis=1), df['ARR_DEL15'], test_size=0.2, random_state=42)
    

    첫 번째 명령문은 Scikit-learn의 train_test_split 도우미 함수를 가져옵니다. 두 번째 줄은 DataFrame을 원래 데이터의 80%를 포함하는 학습 세트와 나머지 20%를 포함하는 테스트 세트로 분할하는 함수를 사용합니다. random_state 매개 변수는 분할을 수행하는 데 사용되는 난수 생성기를 시드하고, 첫 번째 및 두 번째 매개 변수는 기능 열과 레이블 열이 포함된 DataFrame입니다.

  3. train_test_split는 네 개의 DataFrame을 반환합니다. 다음 명령을 사용하여 학습에 사용된 기능 열이 포함된 DataFrame의 행 및 열 수를 표시합니다.

    train_x.shape
    
  4. 이제 이 명령을 사용하여 테스트에 사용되는 기능 열이 포함된 DataFrame의 행 및 열의 수를 표시합니다.

    test_x.shape
    

    두 출력의 차이와 그 이유는 어떻게 될까요?

다른 두 DataFrame, 즉 train_ytest_y에서 shape를 호출한 경우 표시되는 결과를 예측할 수 있나요? 확실하지 않은 경우 한번 시도해 보고 알아보세요.

다양한 유형의 기계 학습 모델이 있습니다. 가장 일반적인 모델 중 하나로 여러 회귀 알고리즘 중 하나를 사용하여 숫자 값(예: 사람의 나이 또는 신용 카드 거래가 사기일 확률)을 생성하는 회귀 분석 모델이 있습니다. 입력 집합을 알려진 일단의 출력 중 하나로 분해하려고 하는 분류 모델을 학습합니다. 분류 모델의 전형적인 예는 이메일을 검사하여 "스팸" 또는 "스팸 아님"으로 분류하는 작업입니다. 모델은 항공편이 정시에 도착할지 늦게 도착할지를 예측하는 이진 분류 모델입니다(두 가지 출력만 가능하므로 “이진”이라고 함).

Scikit-learn을 사용하여 얻을 수 있는 이점 중 하나는 이러한 모델을 직접 작성하거나 사용할 알고리즘을 구현할 필요가 없다는 것입니다. Scikit-learn에는 일반적인 기계 학습 모델을 구현하기 위한 다양한 클래스가 포함되어 있습니다. 그 중 하나가 여러 의사 결정 트리를 데이터에 맞추고, 평균을 사용하여 전체 정확도를 높이고, 과잉 맞춤을 제한하는 RandomForestClassifier입니다.

  1. 새 셀에서 다음 코드를 실행하여 RandomForestClassifier 개체를 만들고, fit 메서드를 호출하여 해당 개체를 학습시킵니다.

    from sklearn.ensemble import RandomForestClassifier
    
    model = RandomForestClassifier(random_state=13)
    model.fit(train_x, train_y)
    

    출력에는 각 의사 결정 트리 포리스트의 트리 수를 지정하는 n_estimators 및 의사 결정 트리의 최대 깊이를 지정하는 max_depth를 포함하여 분류자에서 사용되는 매개 변수가 표시됩니다. 표시된 값은 기본값이지만, RandomForestClassifier 개체를 만들 때 이 값 중 하나를 재정의할 수 있습니다.

    모델을 학습시킵니다.

    모델 학습

  2. 이제 predict 메서드를 호출하여 test_x의 값으로 모델을 테스트한 다음, score 메서드를 사용하여 모델의 평균 정확도를 확인합니다.

    predicted = model.predict(test_x)
    model.score(test_x, test_y)
    

    다음 출력이 표시되는지 확인합니다.

    모델 테스트.

    모델 테스트

평균 정확도는 86%로 표면적으로는 양호한 것 같습니다. 그러나 평균 정확도는 항상 분류 모델의 정확도를 나타내는 신뢰할 수 있는 지표가 아닙니다. 더 자세히 알아보고, 모델이 실제로 얼마나 정확한지, 즉 항공편의 정시 도착 여부를 얼마나 능숙하게 결정하는지 알아보겠습니다.

분류 모델의 정확도를 측정하는 몇 가지 방법이 있습니다. 이진 분류 모델에 가장 적합한 전체 측정값 중 하나는 본질적으로 모델에서 결과에 관계없이 정확히 예측하는 빈도를 정량화하는 수신기 작동 특성 곡선 아래의 영역(ROC AUC라고도 함)입니다. 이 단원에서는 앞에서 작성한 모델에 대한 ROC AUC 점수를 계산하고, 해당 점수가 score 메서드의 평균 정확도 출력보다 낮은 몇 가지 이유에 대해 알아봅니다. 또한 모델의 정확도를 측정하는 다른 방법에 대해서도 알아봅니다.

  1. ROC AUC를 계산하기 전에 먼저 테스트 집합에 대한 예측 확률을 생성해야 합니다. 이러한 확률은 모델에서 예측할 수 있는 각 클래스 또는 답변에 대한 추정값입니다. 예를 들어 [0.88199435, 0.11800565]는 항공편이 정시에 도착할 확률이 89%이고(ARR_DEL15 = 0), 그렇지 않을 확률이 12%임(ARR_DEL15 = 1)을 나타냅니다. 두 확률의 합은 최대 100%가 됩니다.

    다음 코드를 실행하여 테스트 데이터에서 예측 확률 세트를 생성합니다.

    from sklearn.metrics import roc_auc_score
    probabilities = model.predict_proba(test_x)
    
  2. 이제 다음 명령문을 사용하여 Scikit-learn의 roc_auc_score 메서드를 사용하여 확률에서 ROC AUC 점수를 생성합니다.

    roc_auc_score(test_y, probabilities[:, 1])
    

    출력에 67%의 점수가 표시되는지 확인합니다.

    AUC 점수 생성.

    AUC 점수 생성

    AUC 점수가 이전 연습에서 계산한 평균 정확도보다 낮은 이유는 무엇일까요?

    score 메서드의 출력에는 테스트 집합의 항목 중 모델에서 정확하게 예측한 항목 수가 반영됩니다. 이 점수는 모델에서 학습하고 테스트한 데이터 세트가 지연 도착을 나타내는 행보다 정시 도착을 나타내는 행을 더 많이 포함하고 있다는 사실에서 왜곡됩니다. 데이터의 불균형으로 인해 항공편의 지연 도착 예측보다 항공편의 정시 도착 예측이 정확할 가능성이 더 높습니다.

    ROC AUC는 이를 고려하며, 정시 또는 지연 도착에 대한 예측이 정확할 가능성을 더 정확하게 나타냅니다.

  3. 혼동 행렬(오차 행렬이라고도 함)을 생성하여 모델의 동작에 대해 자세히 알아볼 수 있습니다. 혼동 행렬은 각 답변이 정확하거나 잘못 분류된 횟수를 정량화합니다. 특히 거짓 긍정, 거짓 부정, 참 긍정 및 참 부정의 수를 정량화합니다. 이 작업은 고양이와 개를 인식하도록 학습된 이진 분류 모델을 개가 95%인 데이터 세트를 사용하여 테스트하면 매번 "개"를 추측하는 것만으로도 95%의 점수를 얻을 수 있으므로 중요합니다. 하지만 고양이를 전혀 식별하지 못하는 경우 가치가 거의 없습니다.

    다음 코드를 사용하여 모델에 대한 혼동 행렬을 생성합니다.

    from sklearn.metrics import confusion_matrix
    confusion_matrix(test_y, predicted)
    

    출력의 첫 번째 행은 정시에 도착한 항공편을 나타냅니다. 이 행의 첫 번째 열은 정시에 도착할 것으로 정확하게 예측된 항공편의 수를 보여 주는 반면, 두 번째 열은 늦게 도착할 것으로 예측되었지만 정시에 도착한 항공편의 수를 보여 줍니다. 이 관점에서 이 모델은 항공편이 정시에 도착할 것이라고 예측하는 데 능숙합니다.

    혼동 행렬 생성.

    혼동 행렬 생성

    하지만 지연된 항공편을 나타내는 두 번째 행을 살펴보세요. 첫 번째 열은 정시에 도착할 것으로 잘못 예측된 늦게 도착한 항공편의 수를 보여 줍니다. 두 번째 열은 늦게 도착할 것으로 정확하게 예측된 항공편의 수를 보여 줍니다. 분명히 이 모델은 항공편이 정시에 도착할 것이라고 예측하는 것만큼 항공편이 늦게 도착할 것이라고 예측하는 데는 거의 능숙하지 않습니다. 혼동 행렬에서 원하는 것은 왼쪽 위/오른쪽 아래 모서리의 큰 숫자 및 오른쪽 위/왼쪽 아래 모서리의 작은 숫자(가급적 0)입니다.

  4. 분류 모델에 대한 다른 정확도 측정값으로 정밀도재현율이 있습니다. 모델에 3편의 정시 도착과 3편의 지연 도착이 제공되었고, 2편의 정시 도착을 정확하게 예측했지만, 2편의 지연 도착이 정시에 도착할 것이라고 잘못 예측했다고 가정합니다. 이 경우, 정밀도는 50%(정시 도착으로 분류된 4편의 항공편 중 2편이 실제로 정시 도착함)이며, 재현율은 67%(3편의 정시 도착 중 2편을 정확하게 식별함)입니다. 정밀도와 재현율에 대해서는 https://en.wikipedia.org/wiki/Precision_and_recall에서 자세히 알아볼 수 있습니다.

    Scikit-learn에는 정밀도 계산용 precision_score라는 간편한 메서드가 포함되어 있습니다. 모델의 정밀도를 정량화하려면 다음 명령문을 실행합니다.

    from sklearn.metrics import precision_score
    
    train_predictions = model.predict(train_x)
    precision_score(train_y, train_predictions)
    

    출력을 검사합니다. 모델의 정밀도는 얼마일까요?

    정밀도 측정.

    정밀도 측정

  5. 또한 Scikit-learn에는 재현율 계산을 위한 recall_score라는 메서드가 포함되어 있습니다. 모델의 재현율을 측정하려면 다음 명령문을 실행합니다.

    from sklearn.metrics import recall_score
    
    recall_score(train_y, train_predictions)
    

    모델의 회수는 얼마일까요?

    회수 측정.

    회수 측정

  6. 파일 ->저장 및 검사점 명령을 사용하여 Notebook을 저장합니다.

실제 세계에서 숙련된 데이터 과학자는 모델을 훨씬 더 정확하게 만들 수 있는 방법을 찾을 수 있습니다. 무엇보다도 서로 다른 알고리즘을 시도하고, 선택한 알고리즘을 튜닝하는 단계를 수행하여 이동하여 최적의 매개 변수 조합을 찾습니다. 또 다른 가능성 있는 단계는 데이터 세트를 수천 개가 아니라 아닌 수백만 개의 행으로 확장하고, 지연 도착과 정시 도착 간의 불균형을 줄이려고 시도하는 것입니다. 하지만 이 학습의 목적상 모델을 그대로 사용해도 됩니다.