scikit-learnを使った機械学習の入門

投稿日:

更新日:

カテゴリ:

,

ディープラーニング入門」のカテゴリには、ディープラーニング実践ガイド」を参考に、ディープラーニングの既存モデルを使って画像中に何が含まれているかを判別したり、Kaggleのデータセットを使って犬か猫かをモデルを作って判別したりしました。

その先どこに向かおうかと考えたとき、ディープラーニング実践ガイド」は主に画像処理をメインとしている印象を受けてますが、入力は画像ではなく、データを対象する場合はどうするだろうと気になっていました。

そこで、探した中で「見て試してわかる機械学習アルゴリズムの仕組み 機械学習図鑑」という本が良さそうだったので、こらちを教材として、少し異なる系統を探りたいと思います。

改めて、機械学習とニューラルネットワークモデル、ディープラーニングの関係のおさらいですが、以下になります。

今思えば、まず機械学習を触ってからディープラーニングというように、順番を逆にするとかもしれませんが、画像処理と比べたら、データを相手にするのはやっぱり面白みが欠けてます。
また、順番考えられるのは今ちょっとだけディープラーニングを触ったから言えることかもしれません。なので、まあ、結果オーライでしょう。

概要

scikit-learn(サイキットラーン)の付属データを使って機械学習をやってみます。

Kerasを使った画像の分類で、ディープラーニングのソリューションに必要な要素は以下の4つあると紹介しました。これは機械学習全般に言えることのようですね。

  1. データセット
  2. モデルのアーキテクチャー
  3. フレームワーク
  4. ハードウェア

今回は教材に沿って、データセットはsklearnが付属している乳がんのデータ、モデルは「ロジスティック回帰」、フレームワークは「sklearn」として機械学習やります。

データの確認

まずどんなデータかを確認するため、次のように一部を表示して確認してみます。

from sklearn.datasets import load_breast_cancer
import pandas as pd

data = load_breast_cancer()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.DataFrame(data.target, columns=['cancer'])
df = pd.concat([X, y], axis=1)
df.head()

実行すると、次のように表示されます。

ふむふむ、、なにかなんだかさっぱりですね〜

ですが、一番右側の「cancer」列を注目してください。ここの「0」は乳がんじゃないよ的な結果を意味しているはずです。
という感じで、一番右側の列以外のデータを入れたら、この患者は乳がんにかかってるか否かを判定するAIになる想定です。

モデルを訓練

早速ソースですが、ディープラーニングと似た感じになりますね!

# Xだけが大文字はタイポではなく、慣例だそうです。(P13)
X = data.data
y = data.target

# 先頭の10列は平均値だそうで、平均値だけを特徴量として訓練します。
X = X[:, :10]

# ロジスティック回帰のモデルをベースに学習します。
# ロジスティック回帰とは、ある事象が起こる確率を学習するアルゴリズムです。(P54)
from sklearn.linear_model import LogisticRegression

# ベースモデル生成
model = LogisticRegression()

# モデルを訓練
# ディープラーニングで紹介した例では、compileしてfit_generatorだったので、こちらのほうが簡単ですね。
model.fit(X, y)

最後の訓練するところで、次のような収束に失敗したとのワーニングが出るかもしれませんが、動くので一旦無視で問題なさそうです。

/Users/user/ml/.env/lib/python3.11/site-packages/sklearn/linear_model/_logistic.py:469: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  n_iter_i = _check_optimize_result(

結果評価

学習済みのモデルを使って予測を行います。

# すべてのデータに対して予測し、結果を配列として持ちます。
y_pred = model.predict(X)

# 正解と答え合わせして正確率を算出します。
from sklearn.metrics import accuracy_score

accuracy_score(y, y_pred)

私の場合、次のように91%ぐらいの正解率が得られました。

0.9121265377855887

いかがでしょうか。なんだかディープラーニングとは同じパターンの気がします。

今回で言うLogisticRegressionのようなモデル背後のロジックを理解するのが難しいですが、使うとなるとそんな難しくないように感じます。

上で紹介している順でJupyterLabで動くはずですので、みなさんも動かしてみて、少しずつ慣れておくといいかもしれません。


投稿日

カテゴリー:

,

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です