こんにちは、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)
「ディープラーニングを使いたい!!」という方は、下記記事が参考になります。
scikit-learnのインストール方法
pipでインストール可能です。
pip install scikit-learn
scikit-learnの使用に際し、関連するライブラリ(numpy、scipy等)も、併せてインストールされます。
pipの詳細や、インストール方法を知りたい方は、こちらまでどうぞ。
機械学習を実装してみる
今回は、乳がんのデータセットを使用して、
- 悪性
- 良性
の2値を分類する、機械学習を実装してみます
機械学習のモデルとして、様々なものが提案されていますが、
- 本記事では、ロジスティック回帰
を使用します。
下記イメージのように、最も分類する事ができる直線を探す、という手法になります。
ロジスティック回帰とありますが、この手法は、回帰でなく分類です。
正確には、分類問題を回帰問題に変換して、解いています。
使用する乳がんのデータセットに関して
ウィスコンシン大学がまとめた、乳がんのデータセットになります。
下記の特徴があります。
- 合計データ数:569データ
- 説明変数の数:30
- 目的変数:悪性 or 良性
- 予測したい変数(上記の場合、悪性 or 良性)→ 目的変数
- 目的変数の原因になっている変数 → 説明変数
と呼ばれています。
本データセットの詳細
この章は、本記事の趣旨から外れるため、次の章までスキップして頂いて大丈夫です。
scikit-learnの公式サイトでは、こちらに、当データセットの詳細が記載されています。
その公式サイトの、Referenceとして記載されている論文から抜粋して、ご紹介します。
本データセットは、穿刺吸引細胞診(FNAs)から、得られた情報になります。
病変に細い針を刺して、病変部の細胞を吸引し、顕微鏡で観察することで、悪性 or 良性 等を調査する方法との事です。
観察した細胞は、以下のような画像が得られるとの事です。
Figure1: Initial Approximate Boundaries of Cell Nuclei より引用
こちらの画像から、以下の特徴量を抽出しています。
(これが説明変数となっています。)
- radius (mean)
- texture (mean)
- perimeter (mean)
- area (mean)
- smoothness (mean)
- compactness (mean)
- concavity (mean)
- concave points (mean)
- symmetry (mean)
- fractal dimension (mean)
- radius (standard error)
- texture (standard error)
- perimeter (standard error)
- area (standard error)
- smoothness (standard error)
- compactness (standard error)
- concavity (standard error)
- concave points (standard error)
- symmetry (standard error)
- fractal dimension (standard error)
- radius (worst)
- texture (worst)
- perimeter (worst)
- area (worst)
- smoothness (worst)
- compactness (worst)
- concavity (worst)
- concave points (worst)
- symmetry (worst)
- fractal dimension (worst)
実装コードのご紹介
Pythonの実行は、
- IDE(PyCharmや、VisualStudioCode、Jupyter Notebook等々)
- ターミナル(コマンドプロンプト)
等、なんでもOKです。
まずは、全体の流れです。
- 必要なライブラリをimport
- データセットの読込み
- データセットを確認
- データセットの分割(今回は、学習用とテスト用 2分割)
- 学習データを使って、モデルを学習
- 学習済モデルを、テストデータを使って、評価
- 最後に、コード全体のご紹介
上記の順番で、紹介していきます。
必要なライブラリを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という検証にて)成績を叩き出しています。
従来の手法では到底無理だったので、どうしても「従来の機械学習」への注目が下がっていると、感じています。
しかし「従来の機械学習」は、少ない説明変数で現象を説明できる場合、有効な手法です。
ディープラーニングに比べ、
- 学習時間も短く、
- 「内部でどんな処理されているか」完全に把握できるため、
扱いが、容易な傾向にあります。
一方、ディープラーニングは、恐ろしい数の説明変数がある場合、本領を発揮する傾向にあります。
しかし、ディープラーニングによる処理は、我々人間が理解できるロジックで説明できないため、扱いが難しい傾向にあります。
よって、「従来の機械学習」で問題解決できるなら、そちらを使うべきだと個人的には、思っています。
ちなみに、私はディープラーニングに、夢中です(笑)
それではまた、お会いしましょう!