前回に引き続き、AzureMLを使ってモデルを構築していきます!
まだ自分で一から作るほど機能を理解できていないので
今回もAzure AI ギャラリーからお手本を選んで、流れを確認してみます٩(ˊᗜˋ*)و
乳がんの良性・悪性分類予測
https://gallery.azure.ai/Experiment/Breast-cancer-dataset
前回は単純な回帰のモデルでしたが、今回は分類問題で
モデルもより複雑そうなものを選択しました。
モデルの自分の作業スペースへ保存したら、構造を見てみます。
前回の単純なモデルに比べブロック数は増えていますが
思ったほど構造は複雑に見えませんね。
データセットに関する情報のリンクがあったので、そちらを見てみると
データは10の説明変数と1つの目的変数で構成されていました。
1. ID (サンプルコード番号):id番号
2. Clump Thickness (塊の厚さ):1-10
3. Uniformity of Cell Size (細胞サイズの均一性) :1-10
4. Uniformity of Cell Shape (細胞形状の均一性):1-10
5. Marginal Adhesion (辺縁接着):1-10
6. Single Epithelial Cell Size (単一上皮細胞サイズ): 1-10
7. Bare Nuclei (剥き出しの核): 1-10
8. Bland Chromatin (無刺激性クロマチン):1-10
9. Normal Nucleoli (通常の核):1-10
10. Mitoses (分裂):1-10
11. Class (クラス):良性の場合は2、悪性の場合は4
2~10は10段階評価で整数の値であり
11が目的変数のクラスで、2か4で良性か悪性かを表しています。
前処理
まずはデータを視覚化して確認します。
カラム数は11でデータ数は698あるようです。
カラム名を見てみると、1番目のデータがカラム名と認識されてしまったようです。
このお手本ではカラム名の変更は行っていないので、自分で追加してみたいと思います。
Data Transformation (データ変形)のManipulation (操作)にあるEdit Metadata(メタデータの編集)というブロックを使うとカラム名を変更できるようなので、このブロックをデータセットのブロックの下に差し込みます。
ブロックを繋げたら、プロパティで名前変更したいカラム名を選択し、
一番下のNew column names (新しいカラム名)にカンマ区切りで順に名前を記入します。
確認してみるとカラム名が正しく設定されていることが分かりました。
3つ目のブロックは「Remove Duplicate Rows (重複する行の削除)」です。
ブロック内では、重複を確認したいカラム名を選択でき、今回は全選択します。
実行後に結果を確認してみると、データ数が690になっていました。
4つ目のブロックは「Selected Columns in Dataset (カラムの選択)」です。
ここでは[ ID ]が不要なので、それ以外の変数を全て選択します。
5つ目のブロックは「Clean Missing Data (欠損値除去)」です。
前処理ではお馴染みの欠損値除去ですね。全てのカラムを選択します。
前回は欠損値除去の種類について書きましたが、今回は欠損値の比率について書きます。
「Minimum missing value ratio (欠損値の最小比率)」は
操作を実行するために必要な欠損値の最小比率を指します。
「Maximum missing value ratio (欠損値の最大比率)」も同様です。
例えば最小値が0.2、最大値が0.8の場合、
欠損値の数が全体の20%以上で80%以下のカラムのみ除去が実行されます。
これは欠損値の数が少なすぎたり、多すぎたりする時は実行しないように調整できます。
6つ目のブロックは「Split Data (データ分割)」です。
これは前回と操作は同じで、trainデータの割合を0.75にしています。
学習と推論
ここからは学習と推論に入っていきます。
モデルの後半を見てみると、2つの手法が使われています。
まずは左の「Multiclass Neural Network(多クラスニューラルネットワーク)」を見ます。
設定すべき項目が多くありますので、順に確認していきます。
・Create trainer mode (トレーナーモードの作成) トレーニング方法を指定
Single Parameter (単一パラメータ)とParameter Range (パラメータ範囲)の2つがあり
パラメータが既に決まっていればSingle Parameterを選択します。
このモデルではこちらを選択します。
・Hidden layer specification (隠れ層の仕様)
Fully-connected case(完全結合ケース)とCustom definition script(カスタム定義)
があり、Fully-connected caseは入出力層と1つの隠れ層で構築されます。
隠れ層のノード数はユーザが設定します。今回はこちらを選択します。
・Number of hidden nodes (隠れ層のノード数)
・The learning rate (学習率)
・Number of learning iterations (学習のイテレーション数) 学習を回す最大回数を入力
・The initial learning weights diameter (初期学習の重み倍率)学習開始時の重みを設定
・The momentum (モーメンタム)前のイテレーションから適用させる重みを指定
・The type of normalizer (正規化のタイプ)正規化手法もしくは正規化しないから選択
・Shuffle examples (データのシャッフル)
イテレーション間でデータをシャッフルする場合はチェックを入れる
・Random number seed (乱数シード)実行する度に再現性を確保したい場合に値を指定
・Allow unknown categorical levels (不明なカテゴリーラベルを許可)
次に右の「Multiclass Decision Forest (多クラス決定木)」の設定する項目を確認します。
・Resampling method (リサンプリング方法)各ツリーの作成方法を選択
・Create trainer mode (トレーナーモードの作成)ニューラルネットワークと同じ
・Number of decision trees (決定木の数)
・Maximum depth of the decision trees (決定木の最大深度)
・Number of rundom splits per node (ノード毎のランダムな分割数)
・Minimum number of samples per leef node (リーフ毎の最小サンプル数)
上記のように設定したブロックをそれぞれ、次の「Train Model (モデルの訓練)」へ繋ぎます。
前処理で準備したTrainデータも、同様にブロックに繋ぎます。
Label columns (ラベル列)として目的変数である[ Class ]を選択します。
次に「Score Model」のブロックにTrainデータとTestデータを繋ぎます。
最後に2つの学習方法の結果を「Evaluate Model」のブロックに繋いで実行します。
結果
結果を確認するために「Evaluate Model」を可視化します。
どちらの手法も高い正答率ですが、ニューラルネットワークの方が
より精度が高いようですね!
この事例の場合は取りこぼしを少なくしたいので、Recall(再現率)が重視されますね。
まとめ
前回より難しそうなモデルを選択しましたが
実際に見てみると難しいと感じることは全くありませんでした。
今回は自分で考えて修正を行えたので、一歩前進できたかなと思います。
次こそは自分で一からモデルを作成することに挑戦します٩(ˊᗜˋ*)و!!