Trial and Error

ITで色々やってることを書いてくチラシの裏です

機械学習のwebラーニング課題で教師あり学習をいろいろ試してみた

はじめに

UdacityというwebラーニングコミュニティでIntro to Machine Learningっていうコースを学習している(このボリュームで全て無料!)
www.udacity.com
1-4章では教師あり学習について扱っていて、4章付属のpythonプログラムがいろいろな教師あり学習アルゴリズムを比較検討するのに役立ちそう、と思いついたので、4章まで受講し終わったこのタイミングでまずはざっとやってみた。

環境

$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.10.5

$ python -V
Python 2.7.11

$ pip freeze
cycler==0.10.0
matplotlib==1.5.3
nltk==3.2.1
numpy==1.11.2
pyparsing==2.1.10
python-dateutil==2.6.0
pytz==2016.7
scikit-learn==0.18.1
scipy==0.18.1
six==1.10.0
Theano==0.8.2

ライブラリは色々入ってますが、matplotlib,numpy,scipy,scikit-learnあたりを主に使ってるはず。

コードの中身

コードのベースにしたのはこちらからダウンロードできる以下のスクリプト

ud120-projects/choose_your_own/your_algorithm.py

あらかじめプロット関係のコードは書かれているので、your code here!の後に「各アルゴリズムのモジュールをインポート」「classifier導入」「fit」と3行程度追加するだけで図示できる。便利。

一例として、naive bayesの場合はこんな感じになる(一部抜粋)

### your code here! name your classifier object clf if you want the
### visualization code (prettyPicture) to show you the decision boundary

from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
clf.fit(features_train, labels_train)

try:
    prettyPicture(clf, features_test, labels_test)
except NameError:
    pass

plt.show()

試してみたアルゴリズムと出力結果

今回decision boundaryを図示してみたのは以下のアルゴリズム

  1. Naive Bayes
  2. Support Vector Machine(SVM)
  3. Decision Tree
  4. AdaBoost
  5. Random Forest
  6. k-Nearest Neighbor(kNN)

対象データ

自動運転車の速度制御がモチーフで、横軸に凸凹度(bumpiness 大きいほどでこぼこ)、縦軸に坂の緩急(grade 大きいほど急)を取ってある。
全データはfast(青)かslow(赤)かで既に色分けされている。
f:id:niaoz:20161204180916p:plain
青と赤の領域をどのように分けるのか?が今回のお題。

1.Naive Bayes

使用したライブラリ、モジュール、classifier

from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()

参考:sklearn.naive_bayes.GaussianNB — scikit-learn 0.18.1 documentation
f:id:niaoz:20161204181508p:plain

2.Support Vector Machine(SVM)

使用したライブラリ、モジュール、classifier

from sklearn.svm import SVC
clf = SVC()

参考:sklearn.svm.SVC — scikit-learn 0.18.1 documentation
f:id:niaoz:20161205165945p:plain

3.Decision Tree

使用したライブラリ、モジュール、classifier

from sklearn import tree
clf = tree.DecisionTreeClassifier()

参考:1.10. Decision Trees — scikit-learn 0.18.1 documentation
f:id:niaoz:20161205170818p:plain

4.AdaBoost

使用したライブラリ、モジュール、classifier

from sklearn.ensemble import AdaBoostClassifier
clf = AdaBoostClassifier()

参考:1.11. Ensemble methods — scikit-learn 0.18.1 documentation
f:id:niaoz:20161205170108p:plain

5.Random Forest

使用したライブラリ、モジュール、classifier

from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier()

参考:1.11. Ensemble methods — scikit-learn 0.18.1 documentation
f:id:niaoz:20161205170133p:plain

6.k-Nearest Neighbor(kNN)

使用したライブラリ、モジュール、classifier

from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier()

参考:sklearn.neighbors.KNeighborsClassifier — scikit-learn 0.18.1 documentation
f:id:niaoz:20161205170207p:plain

まとめと今後

かなり適当にやりましたが、結構各アルゴリズムの分類特色は出てる気がした。
4章まで進むのは少し大変だけど、ここまで到達してしまえば結構お手軽にアルゴリズムを試せてしまうpythonとsklearnすげえ(あと勿論このコースも)

残った課題としては、

  • 今回はざっとお試しだったので、clfのパラメータを一切いじらないでやってみたが、いじったらどうなる?
  • 関連して、これらパラメータの変更でaccuracyの改善を図る

とかありますが、まだまだコースの先が長い&興味ある章がたくさんあるので、とりあえず先に進みます。