scikit-learnという機械学習のライブラリをよく耳にするので。
チュートリアルに従って、簡単なことを試してみようと思います。

scikit-learn
http://scikit-learn.org/stable/

このエントリでは、
とりあえず、SVMでirisのクラス分類を行ってみることにします。
その後、次元削減+クラス分類をpipeline機能を使って試してみます。

ちなみに、sciki-learnというのは、
google製のpython言語の機械学習ライブラリです。
どのようなアルゴリズムが使えるのかは、
以下のページのフローチャートを見ればわかると思います。

Choosing the right estimator | scikit-learn
http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html

Python(Anaconda)の環境構築

Anacondaをインストールするとscikit-learnが使えるようになるので、
ここではAnacondaをインストールし、
jupyter notebookから利用することにします。

pyenvがセットアップされているとして、
以下のように作業ディレクトリを作成し、anacondaをインストールします。

$ mkdir scikit-learn-study && cd $_
$ pyenv install anaconda3-4.2.0
$ pyenv local anaconda3-4.2.0

以下のように、jupyter notebookを起動します。

$ jupyter notebook

ブラウザが起動して、以下のような画面が表示されます。

scikit-learn1

右側の「New」から「Python [default]」を選んで、新規のノートブックを作成します。

scikit-learn2

SVM使ってirisをクラス分類

この節では、順にpythonのコードブロックを示していきます。
示したコードを、
jupyter notebookのセルに貼り付けて順に実行していけば、
このエントリで実施したことと同じことが、試せると思います。

最初にscikit-learnのバージョンを確認します。

import sklearn
print('The scikit-learn version is {}.'.format(sklearn.__version__))
The scikit-learn version is 0.17.1.

私の環境では「0.17.1」なので、
該当バージョンのドキュメントを読みながら試していきます。

Documentation of scikit-learn 0.17 | scikit-learn
http://scikit-learn.org/0.17/documentation.html

お馴染みirisのデータセットを読み込みます。

from sklearn import datasets
iris = datasets.load_iris()

iris.dataに説明変数(特徴量)の行列が入っています。

print(iris.data)

iris.targetには目的変数が入っています。

print(iris.target)

cross_validation.train_test_splitを使って、
以下のように訓練データ・テストデータに分割します。

import sklearn
from sklearn import cross_validation
X_train, X_test, y_train, y_test = cross_validation.train_test_split(iris.data, iris.target, test_size=0.1, random_state=0)

以下のように、訓練データを使ってSVMのモデルで学習させます。

from sklearn import svm
clf = svm.SVC()
clf.fit(X_train, y_train)  
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)

学習させたモデルを使って、予測を行います。

list(clf.predict(X_test))
[2, 1, 0, 2, 0, 2, 0, 1, 1, 1, 2, 1, 1, 1, 1]

テストデータの目的変数を表示すると、一致しているかが確認出来ると思います。

list(y_test)
[2, 1, 0, 2, 0, 2, 0, 1, 1, 1, 2, 1, 1, 1, 1]

正解率(accuracy)も以下のように確認出来ます。

clf.score(X_test, y_test)
1.0

PCAによる次元削減を行ってSVMでクラス分類

次はPCAによって次元削減を行った上で、クラス分類を実施してみます。
前項と同じように、pythonのコードブロックを示していきます。

以下のように、次元数を指定してPCAを初期化、実行すると
次元削減をすることが出来ます。(この例では2次元に削減)

from sklearn.decomposition import PCA
pca = PCA(2)
pca.fit_transform(X_train, y_train)

ところで、scikit-learnには、
説明変数の加工と学習・予測をまとめるpipelineという機能があります。
このpipelineを使って、一連の処理を定義すると以下のようになります。

clfp = Pipeline([
        ('dim', PCA(2)),
        ('svm', svm.SVC())
    ])
clfp.fit(X_train, y_train)
clfp.score(X_test, y_test)
1.0

試しに、1次元にまで削減してみると、正解率も1を下回りました。

clfp = Pipeline([
        ('dim', PCA(1)),
        ('svm', svm.SVC())
    ])
clfp.fit(X_train, y_train)
clfp.score(X_test, y_test)
0.8666666666666667

このようにpipelineで、
説明変数の加工と学習・予測のロジックをまとめておくと、
パラメータを変更して試行を繰り返しが、やりやすくて便利です。

まとめ

以上、非常に簡単ですがscikit-learnでクラス分類を行ってみました。

このエントリと同じような流れで、
(pipelineの中に入れる処理の入れ替えで)
ユーザガイドにある各種の特徴量選択や予測アルゴリズムを試すことが出来ると思います。

User Guide | scikit-learn
http://scikit-learn.org/0.17/user_guide.html

データがirisだと、差がわかりにくいですが。。