SWEet

A Software Engineer Is Eating Technologies

とりあえず機械学習を実践してみる方法

どうも、おばんです。

あ〜そろそろなんか記事書いてまとめておくか〜って思うと大体綺麗に1ヶ月経ってます。

突然なんですが最近一身上の都合(特に深い意味はないです)でpython機械学習を使う機会が増えました。

自分ではやろうやろうと思いつつも理論がワケワカメすぎたので敬遠していたのですが改めてやってみると機械学習の概念自体はそこまで難しくない(数学的な理論は置いといて)。むしろ難しさはもっと別の場所にある。

んでもって機械学習を理論はさっくりでいいからとりあえず手っ取り早く実践してソースからイメージを掴みたい。そういう時どうすればいいのか、意外としっかりまとめてるサイトがなかったので書いてみようと思います。 一応私の環境としてはMac,Pythonを用いています。

機械学習の定義

理論の話はさっくりとと言いましたが機械学習とはなんぞやぐらいはまとめておかないといけないのでそこはご容赦ください。 あと今回はDeepLeaningの話は今回はしません。ちょいと方針が違うので・・・ wikipedia先生によると、

センサやデータベースなどから、ある程度の数のサンプルデータ集合を入力して解析を行い、そのデータから有用な規則、ルール、知識表現、判断基準などを抽出し、アルゴリズムを発展させる。なお、データ集合を解析するので、統計学との関連が深い。
そのアルゴリズムは、第一にそのデータが生成した潜在的機構の特徴を捉え、複雑な関係を識別(すなわち定量化)する。第二にその識別したパターンを用いて、新たなデータについて予測を行う。データは、観測された変数群のとりうる関係の具体例と見ることができる。一方、アルゴリズムは、機械学習者として観測されたデータの部分(訓練例などと呼ぶ)を学習することで、データに潜在する確率分布の特徴を捉え、学習によって得た知識を用いて、新たな入力データについて知的な決定を行う[1]。

まぁ、つまりは沢山のサンプルデータから傾向とかを見つけ出して次のデータはこうなるはずだ!とか、

こういうデータはやばいデータなんだな!とかをコンピュータが判断できるようになるアルゴリズムを作ること って感じですかね

機械学習の分類

そんなすごそうな機械学習ですがいくつか種類があります。

  1. 教師あり学習 入力(データ)とラベル(答え)がある学習方法 (売上、株価の予測とかは大体これ)
  2. 教師なし学習 ラベルのない入力のみの学習 (データの分類分けとかに使われてるイメージ)
  3. 強化学習 よくわからんけど動的計画法(最大の報酬を得るための選択)みたいな感じ?

超アバウトです。でも詳しく書こうとするとどうしても専門的な手法とか数学の話が絡むので今回は省略。

主に使われる手法とかのキーワードは「線形回帰(未来予測)、K近傍法(分類)、ナイーブベイズ分類器(分類)、サポートベクターマシン(忘れた)」とか色々あります。

一番情報が多いのは教師あり学習です。なぜならデータさえあればあとはライブラリ使ってデータを突っ込むだけです。

必要な材料

python機械学習を始めるのに必要なものはすぐ揃えられます。仮に揃わなかったらStackOverflowにでも投稿すればいいんじゃないかな?(適当)

まずはPython 2.7でも3.5x系でもどっちでもいいですができれば3.5x系の方がいいかもしれません。インストールしましょう

さて、インストールが完了すればターミナルからpythonと叩けばインタプリタが起動するでしょう。

そこでprint('Hello world')と打って見事出力されればもう機械学習の世界はあなたを受け入れているでしょう。

ですが罠がもう一つあります。パッケージの管理です。どんなプログラミング言語でもパッケージ、ライブラリの管理は面倒臭いもの。

pythonではそれはpipというものが管理しています。それぞれのOSに合わせてpipをインストールしましょう。Macならbrew,Unixならapt-getかな。Windowsにそんなコマンドはない?bash_on_windowsunixコマンドが叩けるようになったらしいからそれを使えばいいんじゃないかな?

pipが入ったら pip install ~~~~コマンドでscikit-learn,numpy,pandasをインストールしましょう。scikit-learnは基本的な機械学習アルゴリズムが詰まった素晴らしいライブラリです。他にも沢山の機械学習ライブラリがあります。Tensorflowとかchainerとかね。numpyとpandasは言わずと知れた行列計算ライブラリと柔軟なデータ構造を実現するこれまた最高のライブラリです。

失礼、もう一つライブラリを忘れていました。それはmatplotlibです。これはグラフの描画ライブラリですがデータを可視化できるのでとても便利です。

さて、それらのインストールが済んだら実際に簡単なソースを動かしてみましょう

実践

import pandas as pd
import numpy as np

// データの読み込み wine = pd.read_csv("winequality-red.csv", sep=";") wine.head

// sklearn.linear_model.LinearRegression クラスを読み込み from sklearn import linear_model clf = linear_model.LinearRegression()

// 説明変数に "density (濃度)" を利用 X = wine.loc[:, ['density']].as_matrix() print(X) // 目的変数に "alcohol (アルコール度数)" を利用 Y = wine['alcohol'].as_matrix()

// 予測モデルを作成 clf.fit(X, Y)

// 回帰係数 print(clf.coef_)

// 切片 (誤差) print(clf.intercept_)

// 決定係数 print(clf.score(X, Y))

// 実際の値を与えてみての予測 result = clf.predict(0.9978) print("%s : %s" % (result,Y[0]))

// matplotlib パッケージを読み込み import matplotlib.pyplot as plt

// 散布図 plt.scatter(X, Y)

// 回帰直線 plt.plot(X, clf.predict(X)) plt.show()

scikit-learn で線形回帰 (単回帰分析・重回帰分析) – Python でデータサイエンス

上記のソースをお借りしたサイトです。少しだけ改変しています。 上をコピって実行すればライブラリさえあれば動くはずです。 これは何をしているソースかというとリンク先を読むとわかると思いますがワインの諸々のデータを読み込んで、試しに濃度からアルコールを予測してみよう的なことをしてます。

この予測に用いてる手法は線形回帰です。これは機械学習の数ある手法の中でもダントツでわかりやすい手法だと思います。 これを応用すれば売り上げの予測、アクセス数の予測、株価の予測とかもできるはずです。やってないのでわかりませんが。

処理に関してはコメント文そのまんまです。

機械学習の難しさ

さて、ソースを動かすだけならライブラリを使えば難しくはないことがお分かりいただけたでしょうか?

勿論、手法の方から自分でコーディングしてもいいと思います。それにはかなりの数学的知識とそれをコードに落とし込むプログラミング能力が必要にはなりますが・・・

そして実際に最近機械学習をやるようになって私が一番難しいと思っているのは何か。

それは データの調達、整形です。

今回のソースはあらかじめ用意されたデータを使っているのでとても綺麗で無駄がありません。 何か新しい分野に機械学習を利用したい!そういう人はいると思います。私も例外ではありません。しかし、新しい分野、たとえば日本の農業のこれからの総生産量を海外からの輸入量と比較しつつ予測するのに機械学習を用いるとなった場合はまず当然ですが日本の農業のデータが莫大に必要です。海外からの輸入データも必要でしょう。それはどこから入手しますか?農林水産省財務省?。まだ当てがある場合はいいです。そもそもまとめられていないデータを分析したいならまとめるところから始めなければなりません。

まとめたデータにノイズとなるようなデータが混じっていることもあります。それだけで学習器の精度は狂ってしまいます。コンピュータは人間より繊細ですからね優しく扱ってあげないといけません。

更に今まさに私が直面している問題ですが、データの定量化、評価です。機械学習で学習器に学習させるデータは全てを数値化する必要があります。 例えば学生のデータとして「170,50,男,性格に難あり」といった4次元の特徴ベクトルの集合の場合、男というベクトルは男女、しかないのであれば0,1に変換する必要があります。最後の備考的な項目はもっと評価するのが難しいです。定量化するのか、それとも独自のアルゴリズムで評価すべきなのか。

そこも考えるのがとても難しい。

ついでにデータの性質、傾向を学習させる前に自分でそれらを理解する必要もあります。なので統計や確率などの知識多少はあった方がいいのではないでしょうか。 データを理解すれば必要ではない項目、ノイズのようなデータもすぐにわかるようになるので学習器の精度向上にも繋がるでしょう

ですがとりあえず機械学習に触れるのであればライブラリに付属しているデータセットcsv) とかを使えばどういうものなのかはつかめると思います。

Pythonがわからない? 今すぐAmazonでOreillyの本を買うべきです。

今回の記事で機械学習の入り口が広がって(主に大学の関係者の方々へ)ついでに私に色々教えてくれるようになるのを願っています。

では今日はこのあたりで筆を置かせていただきます。次もなるべく早めに更新したいです