機械学習のライブラリ!scikit-learnとは【初心者向け】現役エンジニアが解説

初心者向けに機械学習のオープンソースライブラリscikit-learnとは何かについて詳しく解説しています。実際のデータを使ってscikit-learnを使った機械学習を行っているので、参考にしてみてください。手軽に試すことができます。

TechAcademyマガジンは受講者数No.1のオンラインプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。

今回は、Pythonの代表的な機械学習のライブラリであるscikit-learnについて解説します。

機械学習というと、複雑な数式を使ったり、なんだか難しそうなイメージですが、scikit-learnを使うと、とても手軽に機械学習を試してみることができます。

ぜひ、この記事を参考に、機械学習にチャレンジしてみてください。

 

目次

 

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()

 

実行結果は以下のようになります。

数字の0のように見えますね。

今回のプログラムでは、このような手書きの数字の画像データを使い、機械学習のモデルの学習と予測を行います。

 

訓練データとテストデータの準備

データセットには、「手書き数字の画像データ」と、それに対する「数字」が含まれます。

データを訓練データとテストデータに分け、訓練データで学習した結果を、テストデータで検証します。

# 画像データを配列にしたもの(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)

 

実行結果は以下のようになります。

SVMというアルゴリズムに対してどのような設定(パラメータ)を行ったかが表示されています。

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovr', degree=3, gamma=0.001, kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)

 

モデルの評価

最後にモデルの学習結果を、テストデータを用いて評価します。

from sklearn import metrics

# テストデータで試した正解率を返す
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))

 

実行結果は以下のようになります。

「1.00」や「0.99」の数字が適合率や再現率です。

かなり予測精度が高いことが分かります。

とても簡単に機械学習を試してみることができましたね。

 

scikit-learnを使った機械学習(2)

次に、機械学習のアルゴリズムを、ロジスティック回帰に変更してみましょう。

先ほどのソースコードの以下の部分を変更します。

# 学習器の作成。SVMというアルゴリズムを選択
from sklearn import svm
clf = svm.SVC(gamma=0.001)

 

上記の部分を以下のように変更します。

# 学習器の作成。ロジスティック回帰というアルゴリズムを選択
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()

 

他のコードは変更の必要がありません。

このように、scikit-learnではモデルを簡単に取り替えながら、機械学習を行うことができます。

こちらも、モデルの評価を実行しましょう。

 

実行結果は以下のようになります。

 

今回は、機械学習ライブラリのscikit-learnについて解説しました。

これからscikit-learnを勉強したい、機械学習を使って何か作ってみたいという方は最初に理解しておきたい内容でしょう。

この記事を監修してくれた方

太田和樹(おおたかずき)
ITベンチャー企業のPM兼エンジニア

普段は主に、Web系アプリケーション開発のプロジェクトマネージャーとプログラミング講師を行っている。守備範囲はフロントエンド、モバイル、サーバサイド、データサイエンティストと幅広い。その幅広い知見を生かして、複数の領域を組み合わせた新しい提案をするのが得意。

開発実績:画像認識技術を活用した駐車場混雑状況把握(実証実験)、音声認識を活用したヘルプデスク支援システム、Pepperを遠隔操作するアプリの開発、大規模基幹系システムの開発・導入マネジメント

地方在住。仕事のほとんどをリモートオフィスで行う。通勤で消耗する代わりに趣味のDIYや家庭菜園、家族との時間を楽しんでいる。

 

オンラインのプログラミングスクールTechAcademyでは、AIオンライン講座を開催しています。

AI(人工知能)の構築に必要な機械学習・ディープラーニングについて実践的に学習することができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、習得することが可能です。