- 教室付き学習の為の基本的なパイプラインコード化
- 複数の分類器が同じ問題を解く様子を見る
- アルゴリズムがデータからものを学ぶとはどういうことか
SPAM分類器をつくる
受信メールにSPAMかSPAMでないかとラベル付けする関数
データを集めて、モデルを学習させる準備ができたとする。
しかし実際に運用を始める前に答える必要がある質問がある。
学習データにないEメールを分類するのに精度はどれくらいになるのか。
モデルを導入する前にうまく機能するのかできるだけ検証したい。
方法1) データセットを2つ(学習(モデルの学習用)とテスト(新データに対する精度検証))に分割
\begin{align}
f(x) &= y
\end{align}
xは入力(features)。yは出力(ラベル)
# import a dataset
from sklearn import datasets
iris = datasets.load_iris()
# 分類器を関数と考える1つの方法のため。特徴量x、ラベルyを呼び出す。
x = iris.data
y = iris.target
# x_trainとy_trainは学習セットの特徴量とラベル
# x_testとy_testはテストセットの特徴量とラベル
# test_size = .5はデータの半分をテストに使うことを意味
from sklearn.cross_validation import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size = .5)
# 分類器をつくる。今回は決定木を利用。
from sklearn import tree
my_classifier = tree.DecisionTreeClassifier()
# 上の2行を下の2行に置き換えればK近傍を使用した分類器を使うことができる。
# from sklearn.neighbors import KNeighborsClassifier
# my_classifier = KNeighborsClassifier()
# 学習データを使って分類器を学習させる
my_classifier.fit(x_train,y_train)
# 予測メソッドを呼び出しテストデータを分類。(分類器がテストデータの各行に対して予測)
predictions = my_classifier.predict(x_test)
# 予測した結果のラベルを出力
print predictions
# テストセットに対する分類器の精度(スコア)を確認
from sklearn.metrics import accuracy_score
print accuracy_score(y_test,predictions)
多種の分類器があるいっぽう、高レベルではそれらのインタフェースは似ている。
データから学ぶとは
ラベルと特徴は関数の関係に似ている。
xは入力(features)。yは出力(ラベル)
\begin{align}
f(x) &= y
\end{align}
def classify(features):
# do some logic
return label
教師付き学習で既にしってるように、この関数を自分たちでは書かず、学習データからそれを学ぶアルゴリズムが欲しい。
関数を学ぶとはどういう意味なのか?
関数は入力値から出力値への対応付けにすぎない。
例えばy=mx +b は直線の関数で、パラメータは2つ(傾きを表すmとy切片を表すb)。
これらのパラメータがあればxの異なる値に対する関数を図示できる。
classify関数にもいくつかパラメータがあるが、入力xは分類したい例の特徴量で、出力yはラベル。
この線をどうやって学ぶのか。
学習データを使ってモデルのパラメータを調整。
⇒どうやってパラメータを覚えるのか
⇒学習データを使って繰り返し調整する。
適当に線を引いて、答えがあってたら線は変更せず、間違ってたらモデルのパラメータを調整してもっと正確になるようにする。
関数の本体はどのように見えるのか?
⇒アルゴリズム的に書きたい、学びたい部分。
我々一から始めているのではなく、どこからともなく関数の本体を引っ張ってきている。我々はモデルから始めている。モデルを試作品とか関数の本体を定義する規則と考えて良い。