今回はSVMとランダムフォレストです。
どちらも機械学習の花型ですね。
今回は教科書でも、分類がメインなので、
Orangeではなく、いよいよsklearnを使用してみます。
- 作者: 尾崎隆
- 出版社/メーカー: 技術評論社
- 発売日: 2014/08/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (6件) を見る
準備
import numpy as np import pandas as pd from sklearn.svm import SVC from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score
データの読み込み
test = pd.read_csv("ch8_test.txt",sep=" ") test_label = pd.read_csv("ch8_test_label.txt",sep = " ") train = pd.read_csv("ch8_train.txt",sep=" ") train.head() test_label.head()
train
age sex act1 act2 influx 0 31 F No Yes B 1 32 F No Yes C 2 33 F Yes No C 3 34 M No Yes A 4 36 F No Yes C
test_lable
age sex act1 act2 influx label 0 28 M Yes Yes C No 1 34 M Yes Yes A Yes 2 33 M No Yes A No 3 40 M No No A Yes 4 30 F Yes Yes A No
今回はデータにカテゴリカルデータが含まれています。
このままだとsklearnでは扱えないので、
pandasのダミー変数に変換するメソッドを使用して、
ダミー変数列をつくります。
学習データとテストデータの両方に施すので、
関数化しておきます。
def preprocess(data_set): age = data_set["age"] sex = pd.get_dummies(data_set["sex"]) act1 = pd.get_dummies(data_set["act1"]) act2 = pd.get_dummies(data_set["act2"]) influx = pd.get_dummies(data_set["influx"]) new_data_set = pd.concat((age,sex,act1,act2,influx),axis=1) new_data_set.columns = ["age","F","M","act1_y","act1_n","act2_y","act2_n","A","B","C"] if "label" in data_set.columns: func = lambda x : 1 if x=="Yes" else 0 new_data_set["label"] = data_set["label"].apply(func) return new_data_set
実行するとこんな形になります。
age F M act1_y act1_n act2_y act2_n A B C label 0 28 0 1 0 1 0 1 0 0 1 0 1 34 0 1 0 1 0 1 1 0 0 1 2 33 0 1 1 0 0 1 1 0 0 0 3 40 0 1 1 0 1 0 1 0 0 1 4 30 1 0 0 1 0 1 1 0 0 0
processed_train=preprocess(train)
これで学習用のデータが用意されました。
SVM
まずはSVMから試してみます。
モデルを作成し、テストデータを説明変数と被説明変数でわけて、学習させます。
svm_mdl = SVC() svm_mdl.fit(processed_train.ix[:,0:10],processed_train["label"])
これで学習完了です。
このモデルのpredict
にテストデータを渡して、
結果を予測させます。
その結果と、テストデータのラベルを、
accuracy_socre
に渡して、正解率を見てみます。
result_svm = svm_mdl.predict(preprocess(test)) svm_score = accuracy_score(preprocess(test_label)["label"],result_svm) print svm_score #0.932
チューニングを一切せずにこの結果はすごいですね・・・。
ランダムフォレスト
次はアンサンブル学習のランダムフォレストを試してみます。
sklearnの素晴らしいところは、
モデルの作成、学習、予測の流れが、
手法を変えても同じコードで出来る所です。
rf_mdl = RandomForestClassifier() rf_mdl.fit(processed_train.ix[:,0:10],processed_train["label"]) result_rf = rf_mdl.predict(preprocess(test)) rf_score = accuracy_score(preprocess(test_label)["label"],result_rf) print rf_score # 0.934
変えたのは最初のクラスだけです。
Rと比べると、ダミー変数の準備等、少し手間はかかりますが、
それでも圧倒的に楽です。
前回の記事はこちら