忘れないようにメモっとく

機械学習とかプログラミングとか。

kaggleにpythonを使ってみる(2) 〜sklearn

機械学習ライブラリのsklearn(scikit-learn)

前回の続き
予測モデルをつくるときに、機械学習のライブラリを使ってみようということで、sklearnを試してみる。
というかpandasに機械学習入ってると思ってた。。

まずはインストール。

$ pip install scikit-learn

機械学習はいろんなモジュールに分割されているので、必要なものを以下のように、importする。

# 決定木
from sklearn import tree
# 線形モデル
from sklearn import linear_model
# ニューラルネットワーク
from sklearn import neural_network
# サポートベクターマシン
from sklearn import svm

今回は、ロジスティック回帰を使う。

import pandas as pd
from sklearn import linear_model

前回と同じように、train.csvをデータフレームとして読み込んで、train.Ageの欠損部分は、平均値で埋める。

説明変数には、AgeとSexを使う。Rなら、説明変数と目的変数に列をボコスカ入れればいいんだけど、sklearnの場合は、オブジェクトを注意して選ぶ。
説明変数はDataFrameオブジェクト、目的変数はSeriesオブジェクト。
あと、カテゴリカル変数が文字のときは、そのまま使えないみたいなので、直しとく。
[male, female]->[1, 0]って感じで。

train = pd.read_csv('train.csv')

# データ加工
train.Age = train.Age.fillna(train.Age.mean())

for i, sex in enumerate(train.Sex):
    if sex=='male':
        train.Sex[i]=1
    else:
        train.Sex[i]=0

# ロジスティック回帰
logiReg = linear_model.LogisticRegression()

目的変数は、Seriesオブジェクト。

y = train['Survived']
print type(y)

>> <class 'pandas.core.series.Series'>

説明変数は、DataFrameオブジェクト。

X = train[['Age', 'Sex']]
print type(X)

>> <class 'pandas.core.frame.DataFrame'>

変数の準備ができたら、fit()とか、score()とかを使っていく。

logiReg.fit(X, y)
print logiReg.coef_ # 回帰係数
print logiReg.intercept_ # 切片
print logiReg.score(X, y) # 決定係数

>> [[-0.0042936  -2.41865573]]
>> [ 1.11913633]
>> 0.786756453423

このモデルに、練習用データをそのまま使ってみる。

py = logiReg.predict(X) # 練習用データ当てはめ
table = pd.crosstab(y, py) # 比較する
table

表示される結果は、以下の通り。

col_0 0 1
Survived
0 468 81
1 109 233

正解率を計算すると、

(468+233)/(468+233+81+109.0)
>> 0.7867564534231201

今回書いたコードは、ここ
-> http://nbviewer.ipython.org/6204124
githubはこちら
-> https://github.com/akiniwa/kaggle_titanic