読者です 読者をやめる 読者になる 読者になる

あれもPython,これもPython

Pythonで世界を包みたい

データサイエンスをPythonで試す(6_SVMとランダムフォレスト)

今回はSVMとランダムフォレストです。
どちらも機械学習の花型ですね。

今回は教科書でも、分類がメインなので、
Orangeではなく、いよいよsklearnを使用してみます。

手を動かしながら学ぶ ビジネスに活かすデータマイニング

手を動かしながら学ぶ ビジネスに活かすデータマイニング

準備

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と比べると、ダミー変数の準備等、少し手間はかかりますが、
それでも圧倒的に楽です。

前回の記事はこちら

esu-ko.hatenablog.com