scikit-learnとは
scikit-learnは、Pythonの機械学習ライブラリです。「サイキット・ラーン」と読みます。scikit-learnはオープンソース(BSD license)で公開されており、個人/商用問わず、誰でも無料で利用することができます。
scikit-learnは、現在も活発に開発が行われており、インターネット上で情報を探すのも容易です。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムでも同じような書き方で利用することができます。また、サンプルのデータセット(トイデータセット)が付属しているため、インストールしてすぐ機械学習を試すことができます。
このようなことから、初学者が機械学習を学び始めるには、最適のライブラリと言えます。
他にもオープンソースで使えるPythonのライブラリをまとめているので、合わせてご覧ください。
[PR]機械学習で挫折しない学習方法を動画で公開中
scikit-learnを利用するには
scikit-learnを利用するには、Anacondaなどの開発環境のパッケージを使うのが簡単です。
Anaconda
Anacondaは、データ分析やグラフ描画など、Pythonでよく利用されるライブラリを含んだ開発環境です。もちろん、scikit-learnも含まれています。よって、Anacondaを導入するだけで、scikit-learnをすぐ利用することができます。
Anacondaにscikit-learnがインストールされているかは、メニュー画面のEnvironmentsから、Installedを選択し、検索BOXに「scikit-learn」と入力することで確認を行うことができます。
なお、Anacondaなどの開発環境を利用せず、手動でscikit-learnをインストールして利用することも出来ます。中級者向けとなるため、手順は省略いたしますが、その場合、scikit-learnをインストールする前に、事前に以下のライブラリもインストールする必要があります。
· NumPy
· Scipy
· Pandas
scikit-learnの主な機能
次にscikit-learnの主な機能、特に機械学習のモデルについて説明します。
以下をご覧ください。これはscikit-learnのアルゴリズムチートシートと呼ばれます。scikit-learnを用いて機械学習を行う際、自分が行いたい分析(分類/回帰/クラスタリングなど)について、適切なモデルを選択する際の手助けとなるものです。
また、scikit-learnでは、簡単にモデルを取り替えて機械学習を行うことができます。モデルを取り替える方法については、以降の頁で説明します。
分類(classification)
与えられたデータがどのクラスに属するかを判別するものです。教師あり学習の分類問題を解くアルゴリズムと表現できます。以下のような種類があります。
SGD(stochastic gradient descent)
大規模データ(10万件以上)におすすめな、線形のクラス分類手法です。
カーネル近似
SGDではうまく分類できない場合に利用する、非線形なクラス分類手法です。こちらも大規模データ向けです。
Linear SVC
中小規模(10万件未満)におすすめな、線形のクラス分類手法です。
k近傍法
Linear SVCではうまく分類できない場合に利用する、非線形なクラス分類手法です。こちらも中小規模データ向けです。
この他、テキストデータの場合、ナイーブベイズという手法があります。
回帰(regression)
与えられたデータをもとに、目的とする値を予測するものです。教師あり学習の回帰問題を解くアルゴリズムと表現できます。以下のような種類があります。
SGD(stochastic gradient descent)
大規模データ(10万件以上)におすすめな、線形の回帰分析手法です。
LASSO、ElasticNet
中小規模(10万件未満)で、説明変数の一部が重要な場合におすすめな、回帰分析手法です。
Ridge、Liner SVR
中小規模(10万件未満)で、説明変数の全てが重要な場合におすすめな、回帰分析手法です。
SVR(ガウスカーネル)、Ensemble
Ridge、またはLinerSVRではうまく分析できない場合に利用する、非線形な回帰分析手法です。
クラスタリング(clustering)
与えられたデータを、なんらかの規則に則って分けるものです。教師なし学習のクラスタリング問題を解くアルゴリズムと表現できます。以下のような種類があります。
KMeans
いくつのクラスタに分かれるのか、事前に決めることができる場合におすすめな、クラスタリング分析手法です。大規模データの場合、MiniBatchといって、データを分けながら学習させる手法を取ります。
スペクトラルクラスタリング、GMM
KMeansではうまく分析できない場合に利用する、非線形なクラスタリング分析手法です。
MeanShift、VBGMM
いくつのクラスタに分かれるのか、事前に決めることができない場合におすすめな、クラスタリング分析手法です。
その他の機能
次元削減
与えられたデータの次元数が多い場合、学習効率を上げるため、次元削減という前処理を行います。
PCA、カーネルPCA、Isomap、SpectralEmbeddingなどの手法があります。
ハイパーパラメータの最適化
機械学習を行う際、学習の方法などを調整する数値のことを「ハイパーパラメータ」と言います。
グリッドサーチ、クロスバリデーションなどの手法があります。
scikit-learnを使った機械学習(1)
それでは、scikit-learnを使った機械学習に挑戦してみましょう。今回は、scikit-learnのトイデータセットにある「手書き数字データセット」を使います。以下はanacondaを使った例で表示しています。
データセットの読み込み
初めに、データセットを読み込み、どのようなデータが格納されているか、確認してみます。以下のコードを入力して実行して下さい。
# scikit-learn ライブラリの読み込み
from sklearn import datasets
# 手書き文字セットを読み込む
digits = datasets.load_digits()
# どのようなデータか、確認してみる
import matplotlib.pyplot as plt
plt.matshow(digits.images[0], cmap="Greys")
plt.show()
実行結果は以下のようになります。
訓練データとテストデータの準備
データセットには、「手書き数字の画像データ」と、それに対する「数字」が含まれます。データを訓練データとテストデータに分け、訓練データで学習した結果を、テストデータで検証します。
# 画像データを配列にしたもの(numpy.ndarray型)
X = digits.data
# 画像データに対する数字(numpy.ndarray型)。ラベルと言う
y = digits.target
# 訓練データとテストデータに分ける
# 訓練データ :偶数行
X_train, y_train = X[0::2], y[0::2]
# テストデータ:奇数行
X_test, y_test = X[1::2], y[1::2]
学習
それでは、モデルに学習を行いましょう。以下ではSVMというアルゴリズムを選択しています。
# 学習器の作成。SVMというアルゴリズムを選択
from sklearn import svm
clf = svm.SVC(gamma=0.001)
# 訓練データとラベルで学習
clf.fit(X_train, y_train)
モデルの評価
最後にモデルの学習結果を、テストデータを用いて評価します。
# テストデータで試した正解率を返す
accuracy = clf.score(X_test, y_test)
print(f"正解率{accuracy}")
# 学習済モデルを使ってテストデータを分類した結果を返す
predicted = clf.predict(X_test)
# 詳しいレポート
# precision(適合率): 選択した正解/選択した集合
# recall(再現率) : 選択した正解/全体の正解
# F-score(F値) : 適合率と再現率はトレードオフの関係にあるため
print("classification report")
print(metrics.classification_report(y_test, predicted))
実行結果は以下のようになります。とても簡単に機械学習を試してみることができましたね。
scikit-learnを使った機械学習(2)
次に、機械学習のアルゴリズムを、ロジスティック回帰に変更してみましょう。学習器の作成の2行を以下のように変更します。
# 学習器の作成。ロジスティック回帰というアルゴリズムを選択
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
他のコードは変更の必要がありません。このように、scikit-learnではモデルを簡単に取り替えながら、機械学習を行うことができます。
こちらも、モデルの評価を実行しましょう。実行結果は以下のようになります。