PythonでScikit-learnを使って機械学習分類器を構築する方法
紹介
機械学習は、コンピュータサイエンス、人工知能、統計学の研究分野です。機械学習の焦点は、アルゴリズムを訓練してパターンを学び、データから予測を行うことです。機械学習は特に価値があり、コンピュータを使用して意思決定プロセスを自動化することを可能にします。
機械学習の応用はどこにでもあります。NetflixやAmazonは新しい商品を推薦するために機械学習を使用しています。銀行はクレジットカード取引の不正行為を検出するために機械学習を使用しており、ヘルスケア会社は患者の監視、評価、診断を行うために機械学習の使用を始めています。
このチュートリアルでは、Pythonの機械学習ツールであるScikit-learnを使用して、シンプルな機械学習アルゴリズムを実装します。乳がんの腫瘍情報のデータベースを使用して、腫瘍が悪性か良性かを予測するナイーブベイズ(NB)分類器を使用します。
このチュートリアルの終わりまでには、自分自身の機械学習モデルをPythonで構築する方法を知ることができます。
前提条件
このチュートリアルを完了するためには、次のものが必要です:
Python 3と、コンピュータにローカルなプログラミング環境を設定してください。適切なインストールと設定ガイドに従って、オペレーティングシステムに合わせて構成できます。
- Pythonが初めての場合は、言語に慣れるために「Python 3でのコーディング方法」を探ってみてください。
ステップ1 — Scikit-learnのインポート
まず、Pythonのための最も優れた文書化された機械学習ライブラリの一つであるScikit-learnモジュールをインストールしましょう。
私たちのコーディングプロジェクトを始めるために、Python 3プログラミング環境をアクティブにしましょう。環境が存在するディレクトリにいることを確認し、以下のコマンドを実行してください:
- . my_env/bin/activate
プログラミング環境がアクティブになっているので、Sckikit-learnモジュールがすでにインストールされているか確認してください。
- python -c "import sklearn"
もし sklearn がインストールされていれば、このコマンドはエラーなしで完了します。インストールされていない場合は、次のエラーメッセージが表示されます:
Traceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named 'sklearn'
エラーメッセージはsklearnがインストールされていないことを示しているので、pipを使ってライブラリをダウンロードしてください:
- pip install scikit-learn[alldeps]
インストールが完了したら、Jupyter Notebookを起動します:
- jupyter notebook
JupyterでML チュートリアルと呼ばれる新しいPythonノートブックを作成します。ノートブックの最初のセルで、sklearnモジュールをインポートします:
import sklearn
あなたのノートは以下の図のようであるべきです。
私たちのノートブックにsklearnがインポートされたので、機械学習モデルのためのデータセットに取り組み始めることができます。
ステップ2 — Scikit-learnのデータセットのインポート
このチュートリアルで扱うデータセットは、ウィスコンシン州の乳癌診断データベースです。このデータセットには、乳がん腫瘍に関するさまざまな情報と、悪性または良性の分類ラベルが含まれています。このデータセットには、569のインスタンス、すなわち569の腫瘍に関するデータがあり、腫瘍の半径、テクスチャ、滑らかさ、面積など、30の属性、または特徴に関する情報が含まれています。
このデータセットを使用して、腫瘍情報を利用して腫瘍が悪性か良性かを予測する機械学習モデルを構築します。
Scikit-learnには、Pythonに読み込むことができるさまざまなデータセットがインストールされており、必要なデータセットも含まれています。データセットをインポートして読み込みます:
...
from sklearn.datasets import load_breast_cancer
Load dataset
data = load_breast_cancer()
このdata変数は、辞書のように機能するPythonオブジェクトを表しています。考慮すべき重要な辞書のキーには、分類ラベル名(target_names)、実際のラベル(target)、属性/特徴名(feature_names)、および属性(data)があります。
属性は、あらゆる分類器にとって重要な部分です。属性はデータの性質に関する重要な特徴を捉えます。予測しようとしているラベル(悪性腫瘍か良性腫瘍か)を考えると、役立つ可能性のある属性には、腫瘍のサイズ、半径、質感が含まれます。
重要な情報の各セットごとに新しい変数を作成し、データを割り当ててください。
...
Organize our data
label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']
現在、情報の各セットに対してリストがあります。データセットをよりよく理解するために、クラスラベル、最初のデータインスタンスのラベル、特徴名、最初のデータインスタンスの特徴値を印刷してデータを見てみましょう。
...
Look at our data
print(label_names)
print(labels[0])
print(feature_names[0])
print(features[0])
コードを実行すると、以下の結果が表示されます:
画像に示されているように、私たちのクラス名は悪性と良性であり、それぞれが0と1の二進値にマッピングされます。ここで0は悪性腫瘍を、1は良性腫瘍を表します。したがって、私たちの最初のデータインスタンスは、平均半径が1.79900000e+01の悪性腫瘍です。
データがロードされたので、機械学習分類器を構築するためにデータを操作することができます。
ステップ3 — データをセットに整理する
分類器の性能を評価するためには、常に未知のデータでモデルをテストする必要があります。したがって、モデルを構築する前に、データを2つの部分に分割してください:トレーニングセットとテストセット。
開発段階では、トレーニングセットを使用してモデルをトレーニングし、評価します。その後、トレーニングされたモデルを使用して、未見のテストセットに対して予測を行います。このアプローチにより、モデルの性能と堅牢性を把握することができます。
幸運なことに、sklearn には train_test_split() という関数があり、データをこれらのセットに分割します。この関数をインポートし、データを分割するために使用してください:
...
from sklearn.model_selection import train_test_split
Split our data
train, test, train_labels, test_labels = train_test_split(features,
labels,
test_size=0.33,
random_state=42)
この関数は、test_size パラメータを使用してデータをランダムに分割します。この例では、元のデータセットの33%を表すテストセット(test)があります。残りのデータ(train)はトレーニングデータを構成します。また、トレーニング/テスト変数それぞれに対応するラベル、すなわち train_labels と test_labels もあります。
私たちは今、最初のモデルのトレーニングに進むことができます。
ステップ4 — モデルの構築と評価
機械学習には多くのモデルがあり、それぞれのモデルには独自の強みと弱みがあります。このチュートリアルでは、通常、二値分類タスクでうまく機能するシンプルなアルゴリズム、つまりナイーブベイズ(NB)に焦点を当てます。
最初に、GaussianNBモジュールをインポートします。次に、GaussianNB()関数を使ってモデルを初期化し、その後、gnb.fit()を使用してデータにフィットさせてモデルをトレーニングします:
...
from sklearn.naive_bayes import GaussianNB
Initialize our classifier
gnb = GaussianNB()
Train our classifier
model = gnb.fit(train, train_labels)
モデルを訓練した後、訓練されたモデルを使ってテストセットの予測を行うことができます。その際、predict()関数を使用します。predict()関数は、テストセット内の各データインスタンスに対する予測の配列を返します。その後、予測を印刷することで、モデルが決定した内容を把握することができます。
testセットを使用してpredict()関数を呼び出し、結果を出力してください:
...
Make predictions
preds = gnb.predict(test)
print(preds)
コードを実行すると、次の結果が表示されます。
Jupyter Notebook の出力に示されているように、predict() 関数は、腫瘍のクラス(悪性対良性)に対する予測値を表す 0 と 1 の配列を返しました。
予測が得られたので、分類器の性能を評価してみましょう。
ステップ5 — モデルの精度を評価する
真のクラスラベルの配列を使用して、test_labelsとpredsの2つの配列を比較することで、モデルの予測値の正確性を評価できます。sklearnの関数accuracy_score()を使用して、機械学習分類器の精度を判断します。
...
from sklearn.metrics import accuracy_score
Evaluate accuracy
print(accuracy_score(test_labels, preds))
次の結果が表示されます:
出力に示されているように、NB分類器の精度は94.15%です。これは、94.15%の確率で分類器が腫瘍が悪性か良性かを正しく予測できることを意味します。これらの結果は、30の属性からなる特徴セットが腫瘍のクラスの良い指標であることを示唆しています。
あなたは最初の機械学習分類器を無事に構築しました。すべてのimport文をノートブックまたはスクリプトの最上部に配置して、コードを整理しましょう。コードの最終版は次のようになります:
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
Load dataset
data = load_breast_cancer()
Organize our data
label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']
Look at our data
print(label_names)
print('Class label = ', labels[0])
print(feature_names)
print(features[0])
Split our data
train, test, train_labels, test_labels = train_test_split(features,
labels,
test_size=0.33,
random_state=42)
Initialize our classifier
gnb = GaussianNB()
Train our classifier
model = gnb.fit(train, train_labels)
Make predictions
preds = gnb.predict(test)
print(preds)
Evaluate accuracy
print(accuracy_score(test_labels, preds))
これからは、クラスifierをさらに改善するために、コードを引き続き作業することができます。異なる特徴のサブセットを試したり、全く異なるアルゴリズムに挑戦してみるのも良いでしょう。Scikit-learnのウェブサイトで、より多くの機械学習のアイデアをチェックしてみてください。
結論
このチュートリアルでは、Pythonで機械学習分類器を構築する方法を学びました。これで、Scikit-learnを使用して、データの読み込み、整理、訓練、予測、および機械学習分類器の評価をPythonで行うことができます。このチュートリアルのステップは、自分のデータをPythonで扱うプロセスを円滑に進める手助けになるはずです。



