Pythonスキルの習得

scikit-learn(sklearn)入門 – インストールから、実際に分類問題を、実装してみる –

scikit-learn(sklearn)入門 - インストールから、実際に分類問題を、実装してみる -

こんにちは、Zero-Cheeseです。

今回は、機械学習で頻繁に使用されるライブラリ

  • scikit-learn (sklearn)

をご紹介します。

初めて、「scikit-learn」に触れる方を、対象にしております。

また、Python入門者レベル以上の方であれば、十分に理解できる内容です。

本記事のゴール

  • scikit-learnの概要を把握する
  • scikit-learnのインストール方法を知る
  • 簡単な機械学習を実装・体験をして、雰囲気をつかむ

scikit-learnとは?

scikit-learn(サイキット・ラーン)とは、Pythonから使用できる、機械学習のライブラリです。

このライブラリを使用する事で、驚くほど簡単に、機械学習を実装する事ができます。

具体的には、本ライブラリの使用により

  • データの分割(学習用、検証用、テスト用 など)
  • データの前処理
  • モデルの学習
  • 学習したモデルの評価

の一連を、簡単に実装する事ができます。

しかもオープンソースの、BSD license(new BSD)で公開されており、個人/商用問わず、誰でも自由に利用できます。

扱っているモデルに関して

下図は、機械学習に使用に際し、「お勧めのモデル」が示されています。

公式サイトより引用

scikit-learnでは、モデルをestimator(推定機)と呼んでいます。

Startから始まり、

  • 矢印に従って、青丸の質問をYes、Noで答えていき、
  • 最終的に辿りついた、緑四角に書いてあるものが、お勧めのモデル

となっています。

上図の通り

  • 線形回帰
  • サポートベクターマシン
  • K-means
  • ナイーブベイズ

等々、幅広いモデルが、標準でサポートされています。

機械学習の中でも、scikit-learnによる「ディープラーニング」の使用は、お勧めできません。

理由は、

  • 自由に、モデルが作れない
  • 学習に、GPUが使えない → つまり学習時間が膨大になる。

からです。

「ディープラーニング」の次元数は他の機械学習と比べ、圧倒的に多い傾向にあり、その結果、計算量が膨大になります。

また、「ディープラーニング」の計算は、GPUに適しています。

つまり、「ディープラーニング」はGPUの使用が必須となってきます。(特に学習の場合)

繰返しになりますが、scikit-learnは、GPUが使えません。

なぜなら、ディープラーニング用のフレームワークとして、使用される事を意図していないからです。(公式によるFAQ

「ディープラーニングを使いたい!!」という方は、下記記事が参考になります。

【 入門 】初めてのPyTorch - 実際にコードを書いて、体験してみる -
【 入門 】初めてのPyTorch - 実際にコードを書いて、体験してみる -Python初心者以上の方で、ディープラーニングに興味はあるが、まだコードを書いた事の無い方、もしくは、「PyTorch」初めての方を対象に、「PyTorch」を実際に体験してみて、特徴の把握、自分に合う・合わないを、実感するという内容になっています。...

scikit-learnのインストール方法

pipでインストール可能です。

pip install scikit-learn

scikit-learnの使用に際し、関連するライブラリ(numpy、scipy等)も、併せてインストールされます。

pipの詳細や、インストール方法を知りたい方は、こちらまでどうぞ。

【Python】pipの使い型入門 - コマンドライン、Anaconda、PyCharmからの操作方法を解説 -
【Python】pipの使い方入門 - コマンドライン、Anaconda、PyCharmからの操作方法を解説 -Python入門者を対象に、pipの使い型を解説した記事です。 コマンドライン、Anaconda、PyCharmからの操作方法を、わかりやすく解説しました。 ...

機械学習を実装してみる

今回は、乳がんのデータセットを使用して、

  • 悪性
  • 良性

の2値を分類する、機械学習を実装してみます

機械学習のモデルとして、様々なものが提案されていますが、

  • 本記事では、ロジスティック回帰

を使用します。

下記イメージのように、最も分類する事ができる直線を探す、という手法になります。

ロジスティック回帰とありますが、この手法は、回帰でなく分類です。

正確には、分類問題を回帰問題に変換して、解いています。

使用する乳がんのデータセットに関して

ウィスコンシン大学がまとめた、乳がんのデータセットになります。

下記の特徴があります。

  • 合計データ数:569データ
  • 説明変数の数:30
  • 目的変数:悪性 or 良性
  • 予測したい変数(上記の場合、悪性 or 良性)→ 目的変数
  • 目的変数の原因になっている変数 → 説明変数

と呼ばれています。

本データセットの詳細

この章は、本記事の趣旨から外れるため、次の章までスキップして頂いて大丈夫です。

scikit-learnの公式サイトでは、こちらに、当データセットの詳細が記載されています。

その公式サイトの、Referenceとして記載されている論文から抜粋して、ご紹介します。

本データセットは、穿刺吸引細胞診(FNAs)から、得られた情報になります。

病変に細い針を刺して、病変部の細胞を吸引し、顕微鏡で観察することで、悪性 or 良性 等を調査する方法との事です。

観察した細胞は、以下のような画像が得られるとの事です。

Figure1: Initial Approximate Boundaries of Cell Nuclei より引用

1993 W.N. Street, W.H. Wolberg and O.L. Mangasarian
Nuclear feature extraction for breast tumor diagnosis
IS&T/SPIE 1993 International Symposium on Electronic Imaging: Science and Technology, volume 1905, pages 861-870, San Jose, CA, 1993. 

こちらの画像から、以下の特徴量を抽出しています。

(これが説明変数となっています。)

  1. radius (mean)
  2. texture (mean)
  3. perimeter (mean)
  4. area (mean)
  5. smoothness (mean)
  6. compactness (mean)
  7. concavity (mean)
  8. concave points (mean)
  9. symmetry (mean)
  10. fractal dimension (mean)
  11. radius (standard error)
  12. texture (standard error)
  13. perimeter (standard error)
  14. area (standard error)
  15. smoothness (standard error)
  16. compactness (standard error)
  17. concavity (standard error)
  18. concave points (standard error)
  19. symmetry (standard error)
  20. fractal dimension (standard error)
  21. radius (worst)
  22. texture (worst)
  23. perimeter (worst)
  24. area (worst)
  25. smoothness (worst)
  26. compactness (worst)
  27. concavity (worst)
  28. concave points (worst)
  29. symmetry (worst)
  30. fractal dimension (worst)

実装コードのご紹介

Pythonの実行は、

  • IDE(PyCharmや、VisualStudioCode、Jupyter Notebook等々)
  • ターミナル(コマンドプロンプト)

等、なんでもOKです。

まずは、全体の流れです。

  1. 必要なライブラリをimport
  2. データセットの読込み
  3. データセットを確認
  4. データセットの分割(今回は、学習用とテスト用 2分割)
  5. 学習データを使って、モデルを学習
  6. 学習済モデルを、テストデータを使って、評価
  7. 最後に、コード全体のご紹介

上記の順番で、紹介していきます。

必要なライブラリをimport

最初に、必要なライブラリをimportします。

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

  • 1行目:データセット取得に必要
  • 2行目:学習用データと訓練データの分割に必要
  • 3行目:モデル(識別器)の取得に必要

データセットの読込み

下記コマンドで、データセットを読み込めます。

# データセットの読込み
data = load_breast_cancer()

データセットを確認

下記コマンドにて、データセットの内容を確認できます。

# データセットを確認
print(data.DESCR)

実行すると

  • データ数
  • 説明変数の種類
  • 目的変数の種類

等々の情報を取得できます。

Jupyter Notebookや、Jupyter Lab、GoogleColabを使用している場合は、

  • print(○○○)

は不要です。

直接、data.DESCR と入力して、実行して下さい。

データセットの分割(今回は、学習用とテスト用 2分割)

本記事では

  • 学習用に、データセット全体の、7割を使用
  • テスト用に、残り3割を使用

とします。

まずは、本データセットの

  • 説明変数を、変数「X」に
  • 目的変数を、「y」に代入します。
X = data.data
y = data.target

データを、訓練用と、テスト用に分割します。

下記関数の、

  • 引数:train_size は、 0.0〜1.0 で訓練用の割合を指定

できます。

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7)

学習データを使って、モデルを学習

今回使用するモデル、「ロジスティック回帰」を、インスタンス化します。

clf = LogisticRegression()

学習データを使って、モデルを学習するためには、以下のコードを入力します。

clf.fit(X_train, y_train)

コード実行時

  • ConvergenceWarning: lbfgs failed to converge (status=1):

という警告(Warning)が発生すると思います。

これは、

  • 学習が収束していないよ(終わってないよ)

という警告内容になっています。

解決方法として、モデルをインスタンス化する際、

# clf = LogisticRegression() ← これは警告発生
# 下記に変更
clf = LogisticRegression(max_iter=3000)

にすると、解決します。

これは、学習時の、最大の反復回数(MAX、何回学習するか)を指定します。

デフォルトでは、max_iter=100 になっています。

学習済モデルを、テストデータを使って、評価

テストデータの合格率がどれ位か、以下のコードで確認します。

# jupyter notebook等の使用に場合、print は不要
print(clf.score(X_test, y_test))

コード全体のご紹介

最後に、上記コード全体を、まとめて記載します

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

# データセットのDL
data = load_breast_cancer()

# データセットを確認
print(data.DESCR)

X = data.data
y = data.target

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7)

# モデル(識別器)を、インスタンス化
# clf = LogisticRegression()
clf = LogisticRegression(max_iter=3000)
# 学習
clf.fit(X_train, y_train)

# 学習モデルを、テストデータを使って、評価
print(clf.score(X_test, y_test))

最後に

本記事では、入門者を対象に、scikit-learnでの実装をご紹介しました。

実装の流れを、雰囲気レベルで感じ取って頂けましたら、幸いです。

お話は少し変わりまして、

2020年にディープラーニングが、自然言語の領域でも、人間を超える(※GLUEという検証にて)成績を叩き出しています。

従来の手法では到底無理だったので、どうしても「従来の機械学習」への注目が下がっていると、感じています。

しかし「従来の機械学習」は、少ない説明変数で現象を説明できる場合、有効な手法です。

ディープラーニングに比べ、

  • 学習時間も短く、
  • 「内部でどんな処理されているか」完全に把握できるため、

扱いが、容易な傾向にあります。

一方、ディープラーニングは、恐ろしい数の説明変数がある場合、本領を発揮する傾向にあります。

しかし、ディープラーニングによる処理は、我々人間が理解できるロジックで説明できないため、扱いが難しい傾向にあります。

よって、「従来の機械学習」で問題解決できるなら、そちらを使うべきだと個人的には、思っています。

ちなみに、私はディープラーニングに、夢中です(笑)

それではまた、お会いしましょう!