Scikit-learn 乳がんデータセット 機械学習

機械学習

【教師あり学習】scikit-learn の乳がんデータセットで機械学習を行う

2020年8月14日

こんにちは。産婦人科医のtommyです。(Twitter:@obgyntommy

 

この記事では、乳がんのデータセットを用いた教師あり機械学習の一通りの流れをscikit-learnを用いて学びます。

 

教師あり機械学習の一般的な流れは以下の通りです。

 

 教師あり学習の機械学習の流れ

  1. データセットの読み込み
  2. データの前処理
  3. 探索的データ解析(EDA;Explanatory Data Analysis)
  4. 機械学習予測モデルの作成
  5. 性能評価

scikit-learnを用いた機械学習の流れについては、以下の記事を参照して下さい。

AI python 機械学習 scikit-learnを使用して予測モデル(機械学習アルゴリズム)を作成し評価する
【機械学習】scikit-learnの使い方【基礎から全て解説】

続きを見る

 

又、Google Colaboratoryの使い方については以下の記事を参照して下さい。

Google Colaboratory グーグルコラボラトリー グーグルコラボ 使い方
Google Colaboratoryの使い方【完全マニュアル】

続きを見る

 

尚、ワインのデータセットを用いた教師ありの機械学習についてはこちらの記事をご参照下さい。

機械学習 ワインの品質判定 練習問題
【教師あり学習】機械学習でワインの品質判定を行ってみよう【scikit-learn】

続きを見る

 

Google Colaboratoeyを使用して学習される方は、こちらのリンクを参照して下さい。

 

では早速学習していきましょう。

 

Breast cancerデータセットの読み込みと内容確認

Scikit-learn 乳がんデータセット 機械学習

skleanのライブラリから「breast cancer」のデータセットを読み込みます。

 

breast cancerのデータセットは乳がん患者から採取した細胞の情報(半径や滑らかさ)から悪性なのか良性なのかを判断するためのデータセットになります。

 

breast cancerデータセットの中身を確認します。

 

In[]

 

Out[]

教師あり学習 乳癌の分類 機械学習 Scikit-learn

※ 全ての結果は反映できていません。

 

このデータセットの中身はPythonの辞書型になっていますので、取得したい対象のキーを以下のように指定することにより対象の中身(バリュー)を取得できます。

 

以下のコードでは正解ラベルの取得を行なっています。

 

In[]

 

Out[]

教師あり学習 乳癌の分類 機械学習 Scikit-learn

データの前処理

Scikit-learn 乳がんデータセット 機械学習

次に $X$ を特徴量、$y$  を正解ラベルとし前処理を行なっていきます。まずは正解ラベルの前処理を行います。

 

元のデータは0, 1という整数型のデータになっていますが、今回は分類問題のためにこれをカテゴリカル変数に変換します。

 

target_namesキーにカテゴリ名があるのでこれを使いましょう。

 

  • malignant:悪性
  • benign:良性となります。

 

カテゴリカル変数とは

変数には「質的変数」「量的変数」があります。
質的変数は「カテゴリー変数categorical variableカテゴリカル変数)」と呼ばれる事もあります。

 

In[]

 

Out[]

教師あり学習 乳癌の分類 機械学習 Scikit-learn

 

 

続いて、特徴量の前処理を行います。特徴量の名前は feature_names 、値は dataキー に含まれていますのでそれを用います。

 

In[]

 

Out[]

教師あり学習 乳癌の分類 機械学習 Scikit-learn

※ 一部のみを記載しています。

describeメソッドによって、一括で全ての特徴量の統計値の概要を表示できます。

In[]

 

Out[]
教師あり学習 乳癌の分類 機械学習 Scikit-learn

続いて、全てのデータを学習用と評価用に分割します。これには sklearn の train_test_split メソッドを使います。

 

学習用データと評価用データの数の割合ですが、今回は 2:1 とします。

 

※ 2:1でなければならないというわけではなく、一般的には評価用データ数が全体の2-4割程度にすることが多いです。

 

In[]

 

学習データの特徴量と正解ラベルを1つのデータセットとしてまとめます。

 

In[]

 

続いて、学習用データセットの特徴量と正解ラベルの型を確認します。pandasinfo メソッドにより全てのカラムの型を確認できます。

 

pandasの使い方は以下の記事で基本から応用までを学習することが出来ますので、参照してください。

 

In[]

Out[]

教師あり学習 乳癌の分類 機械学習 Scikit-learn

全ての特徴量が浮動小数点数(float型)ということが確認できました。

 

探索的データ解析(EDA)

Scikit-learn 乳がんデータセット 機械学習

続いて、このデータに関して探索的データ解析(EDA)を行なっていきます。

 

探索的データ解析(EDA)の目的ですが、これから機械学習を使って分類を行なっていきますが、その前に『分類が可能そうかそうでないか』を見極めるのが重要となります。

 

※ 目的なくデータ全体の平均や分散を算出するだけでは意味がありません。

 

このデータセットは特徴量が浮動小数点数(float型)で構成されているため、値の大小でクラス分けが大体できれば理想的になります。

 

クラス、特徴量ごとの平均をまずは算出してみます。

 

In[]

 

Out[]

教師あり学習 乳癌の分類 機械学習 Scikit-learn

※ 一部のみを表示しています。

 

全体的に中央全体傾向としてどの変数も malignant > benign となっています。

 

また、" mean concavity", "area error", "worst area"あたりの特徴量が良性悪性間に差があることが分かります。

 

In[]

 

Out[]

教師あり学習 乳癌の分類 機械学習 Scikit-learn

続いてこれらの特徴量をもう少し詳細に確認していきます。

 

箱ひげ図を用いることによりデータの分布を考慮した良性悪性間の違いを確認します。 描画には seaborn ライブラリの boxplot メソッドを使うと便利です。

 

In[]

 

Out[]

教師あり学習 乳癌の分類 機械学習 Scikit-learn

In[]

 

Out[]

教師あり学習 乳癌の分類 機械学習 Scikit-learn

In[]

 

Out[]

教師あり学習 乳癌の分類 機械学習 Scikit-learn

若干の外れ値はありますが、25%-75%点の部分で良性悪性間の被りが無いので分類はたやすそうです。

 

続いて散布図により、2つの特徴量で良性悪性が上手く分類できそうかを確認してみます。 これも  seaborn の scatterplot メソッドを使うと便利です。

 

Pythonのseabornの使い方については以下の2つの記事を参照して復習して下さい。

Python seaborn 使い方 前編
PythonのライブラリSeabornの使い方【前編】

続きを見る

Python seaborn 使い方 後編
PythonのライブラリSeabornの使い方【後編】

続きを見る

 

In[]

 

Out[]
教師あり学習 乳癌の分類 機械学習 Scikit-learn

In[]

 

Out[]

教師あり学習 乳癌の分類 機械学習 Scikit-learn

以上から、良性悪性が上手く纏まっており、機械学習などの手法により分類が可能そうという目処がつきました。

 

よってこの結果より、分類を行うモデルの作成を行なっていきます。

機械学習予測モデルの作成

Scikit-learn 乳がんデータセット 機械学習

これから機械学習予測モデルの作成を行います。

 

すでに前処理は完了していますので、機械学習モデルのハイパーパラメータ探索から行います。

 

今回は機械学習モデルとしてランダムフォレスト、ハイパーパラメータ探索としてグリッドサーチを用います。

 

両方ともsklearnのクラスとして用意されています。

 

In[]

 

ランダムフォレストのハイパーパラメータについては色々ありますが、今回は代表的なもののみ取り上げることにします。

 

  • max_depth(木深さ)
  • n_estimators(木の数)
  • min_samples_split(木ノードにおいてそれ以上分割を行うための最少サンプル数)

 

GridSearchCVの引数について解説します。

 

scoring については今回は accuracy にしております。

※ ただし不均衡データの場合は accuracy からは変えたほうが良い場合があります。これは別途解説します

 

CVはクロスバリデーションにおけるデータセットの分割数ですが、これは一般的には3-10くらいの場合が多いです。

 

もちろん分割数が多いほど結果の信頼性が高まりますが、その分計算時間が増大します。

 

グリッドサーチの手順としては、ハイパーパラメータの候補を作成し、それを元にグリッドサーチのインスタンスを作成、データをフィッティングさせます。

 

グリッドサーチの手順まとめ

  1. ハイパーパラメータの候補を作成
  2. グリッドサーチのインスタンスを作成
  3. データをフィッティングさせる

 

In[]

 

Out[]

教師あり学習 乳癌の分類 機械学習 Scikit-learn

どのハイパーパラメータが最も良い性能を及ぼすかは、フィッティングさせたインスタンス(cld f)の best_params_ メソッドで確認することができます。

 

In[]

また、このハイパーパラメータを採用した際のモデルはbest_estimator_メソッドにより作成が可能です。

 

In[]

 

性能評価

Scikit-learn 乳がんデータセット 機械学習

続いて、予測と性能評価を行いましょう。

※ 性能は正解データと予測データがどの程度合致しているかということですが、一般的にはprecision、recall、f1-score、accuracyの4種類があります。(説明は割愛しますが、本来はデータ分析の背景からこのどれを選ぶかを決定することが多いです。)

 

今回は元々性能指標として設定していたaccuracyに注目することにしましょう。

 

accuracy含め、性能評価結果は sklearn の classification_report によって一括で算出することが可能です。

 

In[]

 

Out[]

教師あり学習 乳癌の分類 機械学習 Scikit-learn

 

以上の結果から、十分な分類性能が得られていることが分かります。

 

 

人気記事 【入門から上級レベルまで】人工知能・機械学習の学習におすすめの書籍25選

人気記事 無料あり:AI(機械学習)特化型おすすめプログラミングスクール3社


-機械学習
-, , ,

Copyright© Tommy blog  , 2024 All Rights Reserved.