【初心者向け】機械学習ライブラリ scikit-learn(sklearn)とは? 機械学習プログラミングを体験してみよう!  

scikit-learnとは

scikit-learn(サイキット・ラーン)はPython用の機械学習ライブラリです。scikit-learnはオープンソースで公開されており、個人・商用問わず、誰でも無料で利用することが出来ます。また、教師あり学習、教師なし学習に関するアルゴリズム(サポートベクターマシン、ランダムフォレスト、回帰、クラスタリングなど)が一通り利用出来る上、サンプルのデータセット(トイデータセットと呼びます)が豊富に揃っています。

そのためscikit-learnを用いるとすぐさま機械学習プログラミングを試すことが可能です。※より詳しい内容に関しては、公式サイト(英語)に記載されておりますので、scikit-learnに実装されている関数が出てきた際には、リファレンスとして読む事をオススメ致します。

書籍で学びたい方はこちらの書籍がおすすめです。

なぜscikit-learnを学ぶのか

なぜPythonを用いて機械学習を活用する際に、scikit-learnを学ぶのでしょうか。それはscikit-learnは、Pythonで(統計的)機械学習プログラミングを行う場合、世界的にもデファクトスタンダードになっているからです。scikit-learnは無料で利用する事が出来ますので、機械学習を扱うのであればしっかりと使いこなせるようにしましょう。

scikit-learnをインストールする

scikit-learnを利用するには「Anaconda」を用いるか、「Anaconda」を使っていない環境ではpipコマンドなどでインストールが可能です。Anaconda経由でダウンロードした場合は、最初からscikit-learnがインストールされています。

例)pipコマンドを用いた実行例

pip install scikit-learn

Mac OSの方は「ターミナル」から実行し、Windowsの方はPowerShellなどから実行してください。

scikit-learn 付属のデータセットや機械学習アルゴリズムマップに関してはこちら

Google Colaboratoryで機械学習をはじめよう!

まず前半では、Googleが機械学習の教育及び研究用に提供しているGoogle Colaboratory(グーグル・コラボレイトリー)の使い方を説明し、後半でPythonプログラミングと機械学習プログラミングを行っていきます。

今回使うGoogleのColaboratoryは、インストール不要かつ、Pythonを用いた機械学習環境が整えられているため、すぐにPythonプログラミングを始めることが可能な無料のサービスです。

費用は無料でCPU及びGPU(1回12時間)の環境が利用可能で、用意するものは、Googleアカウントさえあれば利用できます。

 Google Colaboratoryのページへ

Google Colab入門(Google Colaboratory)

ノートブックの作成

「最近のノートブック」の画面が表示されますので、画面の左下から「PYTHON3の新しいノートブック」を選びクリックしてください。または、左上メニューの『Python3 のノートブックを新規作成』でも同じように作成できます。

・左上メニューの『Python3 のノートブックを新規作成』の場合

Colaboratoryの画面が表示されましたでしょうか?さて、黒丸の三角の実行ボタンの右横にある背景が薄い青色のテキストエディタがありますので、そこにプログラムを記述します。(この部分をセルと呼んだりします。)1

print("hello Python")

問題を報告する始めは少し時間がかかりますが、少し待つと結果が表示されます。ちなみに作成したノートブックは、自動的にGoogle Driveに保存されます。

次は、Pythonのグラフ描画モジュールであるMatplotlibを使い、グラフを描画してみます。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 10, 0.1)
plt.plot(x)
plt.show()

GPUを使ってみる

ノートブック作成時には、GPUではないため、下記操作にてGPUを使えるようにします。 上部メニューの ランタイム > ランタイムのタイプを変更を選択し、ハードウェアアクセラレータをNone からGPUに変更して保存します。

さて、下記を実行し__’/device:GPU:0’__と出力されていればGPUが利用できます。

また、

!cat /proc/cpuinfo

問題を報告する及び、

!cat /proc/meminfo

問題を報告するを実行すると、Colaboratoryのマシンスペックを調べることが出来ます。

教師あり学習

機械学習には、教師あり学習、教師なし学習、強化学習の3つに分けられ、このテキストでは教師あり学習を用います。教師あり学習は入力データと正解のペア(教師データ)を与えて、それをもとに学習する方法です。

機械学習プログラミング体験(概要)

このテキストでは、Iris(アヤメ)という花の品種を判定できる分類器を作っていきます。

上記の画像を見て分かる通り、3種類ともとてもよく似ております。この3種類の花のうち、どの花なのかを判定するプログラムを機械学習を使って、実装していきます。また、今回は教師あり学習を利用しますので、データにはそれぞれ、Setosa(一番右)には0、Versicolor(一番左)には1、Versinica(中央)には2の正解ラベルが与えられています。

画像引用元: SUPPORT VECTOR MACHINE (SVM CLASSIFIER) IMPLEMENATION IN PYTHON WITH SCIKIT-LEARN

画像引用元: iris datasetpetal: 花弁sepal: がく アヤメの品種分類タスクは、花のがくの長さと花のがくの幅、花の花弁の長さと花の花弁の幅の4つを用いて、花の品種を分類しようというものです。ですのでデータセットの中には、4つの測定値(特徴量)と3種類の花(Setosal、Versicolor、Versinica)がセットになったデータが150個与えられています。

番号長さ・幅(cm)PetalとSepal
1Sepal LengthSepal(がくの長さ)の長さ
2Sepal WidthSepal(がくの長さ)の幅
3Petal lengthPetal(花びら)の長さ
4petal WidthPetal(花びら)の幅

そして、正解値(ラベル: 花の名称)は、それぞれ下記になります。

0: Setosa

1: Versicolor

2: Versinica 

くどいようですが、今回の目的は、4つの測定値がモデルに入力されたとき、花の品種を3種類(Setosa、Versicolor、Versinica)のうち、どの花に該当するのかを当てられるようにします。 次は再度、入力と出力の関係を確認しておきましょう。

上の画像では入力に画像を入力しているようですが、実際は、がくの長さやがくの幅、花びらの長さ、花びらの幅の4つの測定値はを入力します。例えば、入力となる4つの値が次のようになります。 入力例

特徴cm
がくの長さ(Sepal Length)1.4
がくの幅 (Sepal Width)3.5
花びらの長さ (Petal Length)5.1
花びらの幅 (Petal Width)0.2

Pythonプログラムでは次のように書きます。

"""
次のセクション機械学習プログラミング体験(実装)で実装しますが、
以下の処理までには、データの読み込み、モデルの作成、学習といった流れを行います。
"""

model.predict([[1.4, 3.5, 5.1, 0.2]])

出力は例えば次のようになります。例えばプログラムの出力値が2(つまりVersinicaと判定)と返ってきます。

[2]

機械学習プログラミング体験(実装)

概説は以上にし、実装をしていきます。さて、ここではSVM(サポートベクターマシン)と呼ばれるアルゴリズムを使って分類を行ないます。まずは、sklearnから、IrisのdatasetとSVMを読み込みます。

from sklearn import datasets
from sklearn import svm

次に、Irisが持っているデータの内容とIrisの形状を出力します。

# Irisの測定データの読み込み
iris = datasets.load_iris()

print(iris.data)
print(iris.data.shape) # 形状

出力すると、Irisには150のデータがあることがわかります。

次にデータの長さを調べてみます。

num = len(iris.data)
print(num)

では、サポートベクターマシンを記述します。さきほどの、printの処理はコメントアウトしましょう。

"""
冒頭のはじめににも書きました通り、現在のテキストのコードでワーニングが出る場合があります。
ワーニングは致命的なエラーではないので、動作には問題ありません。そのため一旦気にせず進めてください。
"""
clf = svm.SVC(gamma="auto")
clf.fit(iris.data, iris.target)

ここで、svm.SVC()とfit()に関して説明します。

まず、svm.SVC()は、SVM(サポートベクターマシン)というアルゴリズムです。Scikit-learnでは分類に関するSVMは3種類(SVC,LinearSVC,NuSVC)用意されています。その中のSVC()を利用します。

次に、fit()ですが、fit()を使う事で学習(機械学習)が行えます。fit()の第1引数に特徴量Xを与え、第2引数にラベルデータYを与え利用します。続いて、作ったモデルに関して、予測をしてみましょう。

与えたものとしては、がくの長さが1.4、がくの幅が1.8、花びらの長さが3.9、花びらの幅が0.5で、それらの値から3種類のどの花かを予測します。

print(clf.predict([[1.4, 1.8, 3.9, 0.5]]))

出力は0,1,2(花のラベル)のどれかになります。ここまでの流れをより汎用的に書き直すと以下のようなプログラムになります。

"""
from sklearn import datasets
from sklearn import svm

# Irisの測定データの読み込み
iris = datasets.load_iris()
clf = svm.SVC()
clf.fit(iris.data, iris.target)
print(clf.predict([[1.4, 3.5, 5.1, 0.2], [6.5, 2.6, 4.4, 1.4], [5.9, 3.0, 5.2, 1.5]]))
"""

from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import accuracy_score

# データの読み込み
iris = datasets.load_iris()
x, y = iris.data, iris.target

# トレーニングデータとテストデータに分ける
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1)

# モデルの選択
model = svm.SVC()

# 学習
model.fit(x_train, y_train)

# 評価
pred = model.predict(x_test)
print(accuracy_score(y_test, pred))

# 学習済みモデルを使う
print(model.predict([[1.4, 3.5, 5.1, 0.2]]))

# 次のように、複数渡すことも可能です。
# print(model.predict([[1.4, 3.5, 5.1, 0.2], [6.5, 2.6, 4.4, 1.4], [5.9, 3.0, 5.2, 1.5]]))

上記のコードでは、本記事で解説していないプログラムの記載もありますが、現段階では機械学習プログラミングでは上記のような流れでコードを書くのだなと考えて頂ければ幸いです。

機械学習プログラミングを効率よく学ぶには?

機械学習プログラミングを効率よく学ぶには、普段からPythonを用いて機械学習を扱っている現役のデータサイエンティストや機械学習エンジニアに質問できる環境で学ぶことです。
質問し放題かつ、体系的に学べる動画コンテンツでデータ分析技術を学びたい方は、オンラインで好きな時間に勉強できるAI Academy Bootcampがオススメです。受講料も業界最安値の35,000円(6ヶ月間質問し放題+オリジナルの動画コンテンツ、テキストコンテンツの利用可能)なので、是非ご活用ください。

2 COMMENTS

現在コメントは受け付けておりません。