Pythonで機械学習をやってみる!

スポンサーリンク

本エントリはとにかく機械学習をやってみたいという思いだけで突っ走って書きました。機械学習をしてドヤりたい人、色々アルゴリズムがあるのは知っているけど実際どうやるんだっけという人向けになっていると思います。理論より実践!!という感じなので玄人の方々ご容赦ください。(理論的な部分は今後一つ一つ追っていくつもりです。たぶん。)


これを読んだらどうなるの?

  • とりあえず機械学習ができる
  • いろんなアルゴリズムを試せる
  • こんな感じでやってしまっていいのって疑問を持つ




機械学習って何ぞや?


なぜ機械学習がこんなに世間を賑わせているかは、機械学習によって自動化できる範囲が広がるからだと思います。電脳戦や画像分類のようにすでに自動化は人間たらしめる脳処理の部分まで行われています。機械学習は、人間がしていることを代替し、場合によっては人間よりも精度が高く、休まないというおまけ付きなんですね。機械学習を使うと優秀な新卒が入ってきたらすべてを任せて最後だけ顔を出す上司的なことができてしまうんですね。


人間の行動は、インプット⇒ 脳処理 ⇒ アウトプットという流れが基本です。例えば、道端できれいな女性を見かけたら(インプット)、過去の記憶から判断し(脳処理)、硬直したまま立ち止まる(アウトプット?)的な感じですね。これは間違った脳処理をしてしまっていますね(まぁ、何が正解はわからないですが)。話を元に戻すと、これはインプット\(x\) ⇒ 変換\(f(・)\) ⇒ アウトプット\(y\)の形になります。まさしく\(y=f(x)\)なわけです。


機械で\(y=f(x)\)の\(f(・)\)を作ってしまえば、人間と同じような処理ができ、\(f(・)\)の精度を上げていけば人間の処理以上のことができる、だから\(f(・)\)のパラメータを調整(学習)させようというのが機械学習なんです。


機械学習の流れ

  1. データ部(用意して、加工)
  2. 学習部
  3. 測定部


 大まかな流れは上記の通りです。ただ実際には、データの前処理に時間がかかり、システムに組み込むまで必要になることもありますが、一旦見て見ぬふりをします。


Pythonで機械学習


とにかく実践してみます。今回はPythonのライブラリとして『sklearn』を使っています。sklearnはpipを使えば簡単にインストールできるので、まだ入れていない方はぜひ。データは機械学習の導入としてよく使われる『iris』です。これもすでに数多くWeb上に文献があるので、詳細を知りたい方は検索してみて下さい。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

#
# データ部
# データを読み込んだ後、入力・出力データに分けている
#
data = datasets.load_iris()
x_data = data.data
y_data = data.target

# データを学習用/テスト用に分割している
# 2割がテスト用
x_train, x_test, y_train, y_test = train_test_split(x_data,
                                                    y_data,
                                                    test_size=0.2)
#
# 学習部
# 今回は学習器として深さ3の『決定木』を使っている
#
model = DecisionTreeClassifier(criterion='entropy', max_depth=3)
model.fit(x_train, y_train)

#
# 測定部
# 正答率を測定している
#
train_score = model.score(x_train, y_train)
test_score = model.score(x_test, y_test)
print('train accuracy score : {:.0f}%'.format(train_score*100))
print('test accuracy score : {:.0f}%'.format(test_score*100))


決定木による学習結果は以下のようになりました。学習用データとテスト用データのそれぞれに対して正答率を出しています。

train accuracy score : 98%
test accuracy score : 97%


決定木による学習はできたのでひとまず機械学習をやりました。ついでなので、一気に色んなアルゴリズムを試してみましょう。以下は、色々な機械学習のアルゴリズムを試した結果です。

Model : logistic regression , train accuracy :  95, test accuracy :  93
Model : k nearest neighbor  , train accuracy :  97, test accuracy :  97
Model : svm                 , train accuracy :  98, test accuracy :  97
Model : decision tree       , train accuracy :  98, test accuracy :  97
Model : random forest       , train accuracy : 100, test accuracy :  97


上からロジスティック回帰、K近傍探索、SVM、決定木、ランダムフォレストに関して正答率を測定しました。上の結果を見ると、ランダムフォレストが正答率高いようですが、過学習をしているようにも見えます。ただデータ数が少なく、試行回数が1回なのでなんとも言えないです。コードは以下です。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline


#
# データの読み込み
#
data = datasets.load_iris()
x_data = data.data
y_data = data.target

# データを学習用/テスト用に分割している
x_train, x_test, y_train, y_test = train_test_split(x_data,
                                                    y_data,
                                                    test_size=0.2)
#
# 学習データをモデルに投入する前に、各変数において、平均0、標準偏差が1になるように
# 正規化するため、モデルの定義の前に正規化処理を入れている
#
lr = Pipeline([('scl', StandardScaler()),
               ('clf', LogisticRegression(C=10))])

knn = Pipeline([('scl', StandardScaler()),
                ('clf', KNeighborsClassifier(n_neighbors=5))])

svm = Pipeline([('scl', StandardScaler()),
                ('clf', SVC(kernel='rbf', C=1.0))])

##  決定木とランダムフォレストは学習データの正規化をしなくても良い
dc = DecisionTreeClassifier(criterion='entropy', max_depth=3)

rf = RandomForestClassifier(criterion='entropy',
                            n_estimators=10)

models = [lr, knn, svm, dc, rf]
model_names = ['logistic regression',
               'k nearest neighbor',
               'svm',
               'decision tree',
               'random forest']

#
# 指定したモデルをぞれぞれ学習させている
#
for model_name, model in zip(model_names, models):

    model.fit(x_train, y_train)
    train_score = model.score(x_train, y_train)
    test_score = model.score(x_test, y_test)

    print('Model : {:20}, train accuracy : {:3.0f}, test accuracy : {:3.0f}'.format(model_name,
                                                                                    train_score*100,
                                                                                    test_score*100))


実装部分はこちらの本を参考にしております。一通りの機械学習のアルゴリズムを実装メインで書かれているので、自分で手を動かしながら学べるので、理解が早いです。



終わりに


これで機械学習において一連の流れができました。ただ実際は、機械学習の工程①、②、③のそれぞれに対して試すことが多々あり、時間がかかります。その点に関しては今後それぞれの理論も踏まえてかけたらなあと思います。


今回は、機械学習をやる上での流れは抑えられたかと思います。家を作る際の骨格は作れたかと。後は、部屋割り、壁紙、インテリアなど細部をどんどん詰めていく事が大事です。しかし。何もしなければコントで使われる舞台セット的な感じですかね。


この記事で誰かのモチベーションを少しでも高められたら幸いです。


おまけ