演習 - 機械学習モデルを構築する

完了

機械学習モデルを作成するには、2 つのデータセット (トレーニング用とテスト用に 1 つずつ) が必要です。 実際には、多くの場合、データセットは 1 つだけであるため、それを 2 つに分割します。 この演習では、機械学習モデルのトレーニングに使用できるように、前のラボで準備した DataFrame で 80 対 20 に分割します。 また、DataFrame を特徴列とラベル列に分けます。 前者には、モデルへの入力として使用される列 (フライトの出発地と目的地および予定の出発時刻など) が含まれ、後者には、モデルで予測が試行される列 (この場合、フライトが定刻に到着するかどうかを示す、ARR_DEL15 列) が含まれます。

  1. 前のセクションで作成した Azure ノートブックに戻ります。 ノートブックを閉じた場合は、Microsoft Azure Notebooks ポータルにもう一度サインインし、ノートブックを開き、[セル] ->[すべて実行] を使用して、開いたノートブック内のすべてのセルを再実行します。

  2. ノートブックの末尾にある新しいセルで、次のステートメントを入力して実行します。

    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 ヘルパー関数がインポートされます。 2 行目では関数を使用して、DataFrame を、元のデータの 80% を含むトレーニング セットと、残りの 20% を含むテスト セットに分割します。 random_state パラメーターでは、分割するために使用された乱数ジェネレーターをシードし、最初と 2 番目のパラメーターは、特徴列とラベル列を含む DataFrame となります。

  3. train_test_split では 4 つの DataFrame が返されます。 次のコマンドを使って、トレーニングに使用される特徴列を含む DataFrame 内の行と列の数を表示します。

    train_x.shape
    
  4. 次は以下のコマンドを使って、テストに使用される特徴列を含む DataFrame 内の行と列の数を表示します。

    test_x.shape
    

    2 つの出力にどのような違いがありますか。またその理由は何ですか。

他の 2 つの DataFrame (train_ytest_y) で shape を呼び出した場合にどのようになるかを予測できますか。 わからない場合は、試して確認してください。

さまざまな種類の機械学習モデルがあります。 最も一般的なものの 1 つは回帰モデルです。このモデルでは、多くの回帰アルゴリズムのうちの 1 つを使用して数値を生成します。たとえば、人の年齢や、クレジットカード取引が不正である確率です。 一連の入力を一連の既知の出力のいずれかに解決しようとしている、分類モデルをトレーニングします。 分類モデルの典型的な例は、電子メールを調べ、それを "スパム" または "スパムではない" に分類することです。あなたのモデルは、フライトが定刻に到着するか遅れるかを予測する二項分類モデルとなります (考えられる出力は 2 つのみであるため、"二項" となる)。

scikit-learn を使用する利点の 1 つは、これらのモデルを手動で構築する (あるいは、モデルで使用されるアルゴリズムを実装する) 必要がないことです。 scikit-learn には、一般的な機械学習モデルを実装するためのさまざまなクラスが含まれます。 その 1 つは 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% であり、一見するとよく見えます。 しかし、平均精度が必ずしも、分類モデルの精度の信頼性のあるインジケーターであるとは限りません。 ここではもう少し詳しく調べ、モデルの実際の精度を判断します。つまり、フライトが定刻に到着するかをどれくらい適切に判断できるかを確認します。

分類モデルの精度を測定する方法はいくつかあります。 二項分類モデルの最適な全体の測定方法の 1 つは受信者動作特性曲線下面積 ("ROC AUC" とも呼ばれる) で、結果に関係なく、モデルで正しく予測される頻度を実質的に定量化します。 このユニットでは、以前構築したモデルの ROC AUC スコアを計算し、そのスコアが、score メソッドで出力された平均精度より低い理由について、いくつか学習します。 また、モデルの精度を評価する他の方法についても学習します。

  1. ROC AUC を計算する前に、テスト セットの "予測確率" を生成する必要があります。 これらの確率は、モデルで予測できる、各クラス、または回答の推定値です。 たとえば、[0.88199435, 0.11800565] は、フライトが定刻に到着する確率が 89% (ARR_DEL15 = 0) で、到着しない確率が 12% (ARR_DEL15 = 1) であることを意味します。 2 つの確率を合計すると 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)
    

    出力の最初の行は、定刻だったフライトを表します。 その行の最初の列には、定刻であると正しく予測されたフライトの数が表示され、2 番目の列には、遅延が予測されたが遅れなかったフライトの数が示されています。 そのため、モデルでは、フライトが定刻であるということが適切に予測されたと考えられます。

    混同行列の生成。

    混同行列の生成

    しかし、2 番目の行を見ると、遅れたフライトが示されています。 最初の列には、誤って定刻であると予測された、遅延フライトの数が表示されています。 2 番目の列には、正しく遅延が予測されたフライトの数が表示されています。 明らかに、モデルでのフライトの遅延予測は、フライトの定刻到着予測ほど適切なものではありません。 混同マトリックスで望まれる のは、左上隅と右下隅の大きい数値、および右上隅と左下隅の小さい数値 (可能であれば、ゼロ) です。

  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. [ファイル] ->[Save and Checkpoint] (保存とチェックポイント) コマンドを使用して、ノートブックを保存します。

実世界では、トレーニングを受けたデータ サイエンティストは、モデルをさらに正確なものにするための方法を見つけます。 特に、さまざまなアルゴリズムを試し、選択したアルゴリズムを "調整" してパラメーターの最適な組み合わせを見つけるために対策を講じます。 別の対策として考えられるのは、数千ではなく、数百万の行にデータセットを拡張し、また、遅延到着と定刻到着の間の不均衡を減す試みです。 しかし、ここではモデルはそのままで問題ありません。