【人工知能】機械学習における最適な手法の選び方【Python3/scikit-learnとは】

先日(2021年8月19日)、自動運転技術の開発で世界をリードしているテスラ社によるイベント、Tesla AI Dayが開催されました。以下にあるのが同イベントのYouTube動画です。内容と直接は関係ないですが、スライドや動画、CGがとても奇麗で、眺めるだけでも楽しめます。

同イベントでは画像情報のみを用いた自動運転技術を実現するための機械学習手法や、スーパーコンピューターに関する情報が発表されました。

エンジニアの端くれとしては、テスラ社のように画期的な技術開発ができる環境は非常に魅力的に思えます。IT関連の技術は日々進歩をしており、高度な技術を誰でも簡単に使えるようになってきていることは喜ばしいことであるのは確かです。それらを使ってサービスを開発することが、社会に大きな影響を与える素晴らしいことだと頭では理解しているのですが…例えばLinuxのKernel開発や、機械学習の新規手法開発など、基盤技術の開発に携わっている方々に憧れることは少なくないです。

さて本記事では世界の優秀なエンジニアの方々がその英知を積み上げてくれた、機械学習を誰でも簡単に使えるライブラリ scikit-learn (サイキット-ラーン)をご紹介します。

scikit-learnとは

scikit-learnはPythonベースの機械学習に関するオープンソースソフトウェア(OSS)ライブラリです。数学が苦手でも、プログラミングをしたことがなくても、気軽に機械学習を始めることができます。

2007年のGoogle Summer of Code project (Googleが毎年夏に開催する学生エンジニア向けのOSS開発イベント)にて、デイビット・クールナポー(David Cournapeau)が開始したプロジェクトがベースとなっております。

その後他のエンジニアも加わり、2010年2月に初めて一般向けにライブラリを公開しました。

scikit-learnの使い方

Pythonの他のライブラリと同様に使えばよいのですが、「機械学習がやりたくてPythonを始めました!」という方にはAnacondaを利用すると良いと思います。Anacondaは機械学習向けのプラットフォームで、Pythonやscikit-learnのインストールや環境設定などをごそっと省略して、いきなり実際のコーディングから始めることができます。

プログラミングに関する情報はWeb上で集めることをお勧めしますが、どうしても日本語書籍が読みたいという方には、以下の2冊のいずれかを読むと良いかもしれません。

Amazonでクジラ飛行机の増補改訂Pythonによるスクレイピング&機械学習 開発テクニック。アマゾンならポイント還元…

Amazonでクジラ飛行机, 杉山 陽一, 遠藤 俊輔のすぐに使える! 業務で実践できる! Pythonによる AI・機…

英語でも問題ない、ある程度プログラミングの経験があるという方は英語のオライリー本を読むことをお勧めします。ACM会員になるとあらゆるオライリー本がサブスクリプションサービスでつまみ読みできるようになるので、ご興味のある方はぜひご入会下さい。

関連記事

エンジニアの皆さんは普段何か分からないことがあった時、恐らくGoogle検索で対応しているかと思います。インターネットの前身であるARPANETの誕生以降、膨大な情報がネット上に蓄積され今や適切な検索力さえあれば、大抵の問題は解決できる[…]

アイキャッチ_ACMに入ろう!

機械学習でできること

Pythonやscikit-learnを頑張ってインストールするとして、その後どのようなことが実際できるのかは事前に確認しておきたいですよね。

ここでAndreas C. Müller等著『Introduction to Machine Learning with Python』で紹介されている、機械学習でできることの例を3つご紹介します。

封筒に書かれた手書きの数字から郵便番号を特定する

入力は手書き文字のスキャンであり、出力は郵便番号の実際の数字です。機械学習モデルを構築するためのデータセットを作成するには、多くの封筒を集める必要があります。そうすれば、自分で郵便番号を読み取って、その数字を目的の結果として保存することができます。

医用画像に基づいて腫瘍が良性かどうかを判断する

入力は画像で、出力は腫瘍が良性かどうかです。モデルを構築するためのデータセットを作成するには、医療画像のデータベースが必要です。また、専門家の意見(教師信号)も必要です。つまり、医師がすべての画像を見て、どの腫瘍が良性で、どの腫瘍がそうでないかを判断し、モデルに教える必要があります。また、画像に写っている腫瘍ががんであるかどうかを判断するために、画像の内容以外にも追加診断が必要になることもあります。

クレジットカード取引における不正行為の検出

入力はクレジットカード取引の記録で、出力はそれが不正である可能性が高いかどうかです。あなたがクレジットカードを配布する事業者であると仮定すると、データセットの収集とは、すべての取引を保存し、ユーザーが不正な取引であると報告した場合に記録することを意味します。

機械学習手法の適切な選び方

さて、本記事の本題となります。scikit-learnをインストールできたとして、そもそも機械学習にはどのような手法があって、どのように解析すればよいの分からないとお手上げですね。

scikit-learnはそんな悩みを解決してくれる、痒い所に手が届くチートシートを用意してくれています。

scikit-learn algorithm cheat sheet

 右上のStartから順番にYes/Noとグラフを辿っていけば、適切な手法にたどり着くことができます。各手法の具体的な使い方については、上の引用元のサイトにて画像上の手法名をクリックすると、プログラムの書き方が詳しく示されています。

例えば手書きの数字(0-9)について、50,000件のラベル付きデータ(手書き数字の画像と、それに対応した実際の数字が与えられている)を元にカテゴリー分類(画像からどの数字かを読み取る)をしたい場合を考えます。

この場合、>50 samples → predicting category → labeled data → < 100,000 samples と順番に緑の矢印を辿っていくと、LinearSVC(線形サポートベクタークラシファイアー)という、SVM(サポートベクターマシン)の1つにたどり着きました。

あとはこのLinearSVCの使い方をscikit-learn上で確認し、Pythonで実装するだけです!

機械学習手法の具体的な仕組みについて

LinearSVCを使えばよいことは分かったけど、そもそもLinearSVCが何なのか気になって手が進まない方もいるかもしれません。僕も全く同じ気持ちです笑

しかし高度に科学技術が発展した現代において、自身が使う技術の全てをあまねく理解することは、非常に困難です。そもそもscikit-learnの開発者は、一般人が難しい数学やアルゴリズムを意識することなく機械学習を便利に使えるよう、プログラムを書いてくれています。(最低限の概念を理解するのは別として)そこをあえて掘り起こすのは、実務上はデメリットの方が大きいかもしれません。

例えばLinearSVCを使うだけであれば、(データの処理や結果の表示を除くと)以下のコードを書けば十分です。

from sklearn import svm # SVMの読み込み
X = [[0, 0], [1, 1]]    # データ
y = [0, 1]              # ラベル(教師信号)
clf = svm.SVC()         # SVMの内、SVCのインスタンスを生成
clf.fit(X, y)           # SVCに学習させる
clf.predict([[2., 2.]]) # 学習したSVCから予測を行う

SVMの数学的背景

一方LinearSVCを理解するためには…

まずSVMがn次元ユークリッド空間\(\mathbb{R}^n\)に与えられた複数の点\(x_i\)とそのラベル(0または1)を与えられたとき、その点を超平面により2群に分類することを理解しておく必要があります。このときその超平面から最も近い点を”サポートベクター”と呼び、サポートベクターから超平面までの距離をマージンと呼びます。このマージンを最大化するような超平面をラグランジュの未定乗数法により求める、というのが線形SVMのメカニズムです。

この1つ1つを数式で厳密に追っていけば、LinearSVCについての理解を深めることができるでしょう。しかし機械学習をあくまで道具として使いたい方からすれば、そこまで勉強する時間も必要もないかと思います。

SVMの実装を見てみたい方へ

幸いにもscikit-learnはOSSであり、全てのコードがgithubで公開されています! 例えばSVMの実際のコードはこちらにあります(PythonではなくC++で書かれています。)。

数学的な手続きをどのようにしてプログラミングに落とし込んでいるのか、大変参考になりそうですね。

GitHub

scikit-learn: machine learning in Python. Contribute to scik…

終わりに

今回は誰でも機械学習が簡単に使えるようになるライブラリsciki-learnと、機械学習手法の選択についてお伝えしました。具体的な実装方法については公式サイトをご覧いただければ、それほど悩むことなくご利用いただけると思います。プログラミングに不安がある方、初学者の方は、ご紹介した日本語書籍から入ると良いかもしれません。

各種手法の具体的なメカニズムについては、今後当ブログ内でご紹介していくことを予定しています。機械学習を普段使いする上ではそれほど重要ではないかもしれませんが、しっかりと使いこなす上では役に立つかもしれません。

記事ができ次第、こちらでもリンクを共有しますのでぜひご覧ください。

参考

  • scikit-learn.org (https://scikit-learn.org/stable/index.html)
  • Google Summer of Code Project (https://summerofcode.withgoogle.com/)
  • Naiyang Deng他, Support Vector Machines, Chapman and Hall/CRC, 2012
  • Andreas C. Müller他, Introduction to Machine Learning with Python, O’Reilly Media, Inc., 2016