機械学習の勉強をする時に、

とアドバイスされる方も多いのではないでしょうか。
実際、このやり方は非常に有効です。
ただ、本当の初心者の頃、こんなことを思っていました。

・こんなに難しいやり方じゃなくて、もっとシンプルなやり方を知りたいだけなのに・・・
そう、kernelは教材ではないので、「まずは最低限の書き方を知りたい」「少しずつステップアップしたい」という要望には応えてくれません。
今回は複数回に及ぶ企画です。
【第一回】←今回はココ
Kaggleのtitanicを使って、複数モデル(決定木やロジスティック回帰)について最低限の基礎的なアプローチのコードを紹介
↓
【第二回】
少しレベルを上げたアプローチ(正則化を実行してみる)
↓
【第●回】
もう少しレベルを上げる・・と徐々にレベルを上げていき、それぞれについて精度を検証していくことにします。
本記事をお読み頂くと下記が分かります。
ポイント
・複数のモデルについて、最低限の基本的なコーディングの仕方が分かる
・複数のモデルについて、精度の比較の仕方が分かる
本記事の目次は以下の通りです。
①本企画の全体像
②実践
(0)前処理
(1)ロジスティック回帰
(2)SVM
(3)決定木
(4)ランダムフォレスト
(5)アダブースト
③まとめ
今回試す手法とモデルは下記です。
■試す手法
1.最低限の、シンプルな書き方
2.(必要なモデルのみ)正則化
3.(必要なモデルのみ)標準化
4.ハイパーパラメータチューニング
5.特徴量選択
■試すモデル
・ロジスティック回帰
・サポートベクトルマシン
・決定木
・ランダムフォレスト
・アダブースト
①本企画の全体像
アウトプットはこのようなイメージです。
5モデル×5手法の計25パターンについてコードを示しながら解説し、最後に各セルに精度を埋めていきます。
今回はその企画の第一回目として、「1.シンプル」列(5モデル×1手法)について、各モデルのコードの書き方の解説と、精度を検証していきたいと思います。
■補足
実は以前に、異なるコンペで全く同じ取り組みをqiitaでしております。
今回はよりメジャーなtitanicで取り扱っていきます。
また、qiitaの記事は全検証を1つの記事で行い、「ちょっと長すぎるかも」とコメントを頂いたので、今回は手法別に記事を分けていきます。
②実践
(0)で前処理、(1)~(5)は各モデル構築です。
ですので、実際に手を動かして頂くときは、全モデルについて(0)前処理は必須で、その後に各モデルを試してください。
(0)前処理
全モデルに共通の処理を行っていきます。
まずは必要なものをインポートしていきます。
command
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
import math
#ロジスティック回帰
from sklearn.linear_model import SGDClassifier
#サポートベクターマシン
from sklearn.svm import SVC
#決定木
from sklearn.tree import DecisionTreeClassifier, export_graphviz
#ランダムフォレスト
from sklearn.ensemble import RandomForestClassifier
#アダブースト
from sklearn.ensemble import AdaBoostClassifier
続いて、データの読み込み→train.csvとtest.csvの結合をします。
command
#データの読み込み
df_train = pd.read_csv("train.csv")
df_test = pd.read_csv("test.csv")
#データの結合
df_train["TrainFlag"] = True
df_test["TrainFlag"] = False
df = df_train.append(df_test)
#最後の提出に必要なのでPassengerIDをdfのindexにしておき、dfからはPassengerID列を削除
df.index = df["PassengerId"]
df.drop("PassengerId", axis = 1, inplace = True)
続いて、最低限の前処理を行います。
command
#欠損値処理
df["Age"] = df["Age"].fillna(df["Age"].median())
df["Embarked"] = df["Embarked"].fillna("S")
#カテゴリ変数処理
df = pd.get_dummies(df, columns = ["Sex", "Embarked"])
#不要列の削除
df = df.drop(['Cabin','Name','Ticket', 'Fare'], axis = 1)
最後に、train.csvだけをdf_trainとして切り離し、df_trainを訓練データとテストデータに分割します。
command
#訓練データの切り離し
df_train = df[df["TrainFlag"] == True]
df_train= df_train.drop(["TrainFlag"], axis = 1)
#テストデータの切り離し(今回の検証ではsubmitまではしないため、df_testは使いません)
df_test = df[df["TrainFlag"] == False]
df_test = df_test.drop(["TrainFlag"], axis = 1)
df_test = df_test.drop(["Survived"], axis = 1)
#df_trainを訓練データとテストデータに分割
y = df_train["Survived"].values
X = df_train.drop("Survived", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)
今回は前処理の話を必ずしも全て理解しておく必要はないですが、訓練データとテストデータの結合や切り離しの意味が分からない方は、下記の記事も併せてお読みください。
-
-
Kaggle|訓練データ・テストデータの結合と切り離しの仕方を解説
・Kaggleのtitanicをちょうどやり始めたけど、train.csvとtest.csvの結合の仕方が分からない ・最後にtest.csvの部分だけをKaggleに提出しないといけないけど、どうや ...
続きを見る
(1)ロジスティック回帰
最低限であれば、非常にシンプルです。
command
#モデル構築
clf = SGDClassifier(loss = "log", penalty = "none",random_state=1234)
#X_train,y_trainを使って訓練
clf.fit(X_train,y_train)
#テストデータを使って精度検証
clf.score(X_test, y_test)
SGDClassifierの中の引数の補足です。
・loss
logにしないとロジスティック回帰モデルが作れないのでlogにします
・penalty
次回の記事で正則化ありの場合の精度を検証するので、penaltyはここではnoneにしておきます
これで終わりです!精度にこだわらなければ、すごくシンプルに実装できます。
私は去年学習を始めた際、まさにこの内容を知りたかったのですが、意外に超初心者がこのシンプルなコードを本やインターネットで見つけるのって、難しいと感じます・・・。
clf.scoreで出力される精度は0.813でした。
(2)サポートベクトルマシン
command
#モデル構築
clf = SVC(random_state=1234)
#X_train,y_trainを使って訓練
clf.fit(X_train, y_train)
#テストデータを使って精度検証
clf.score(X_test, y_test)
clf.scoreで出力される精度は0.608でした。
(3)決定木
command
#モデル構築
clf = DecisionTreeClassifier(random_state=1234)
#X_train,y_trainを使って訓練
clf = clf.fit(X_train, y_train)
#テストデータを使って精度検証
clf.score(X_test, y_test)
clf.scoreで出力される精度は0.783でした。
(4)ランダムフォレスト
command
#モデル構築
clf = RandomForestClassifier(random_state=1234)
#X_train,y_trainを使って訓練
clf.fit(X_train, y_train)
#テストデータを使って精度検証
clf.score(X_test, y_test)
clf.scoreで出力される精度は0.828でした。
(5)アダブースト
command
#モデル構築
clf = AdaBoostClassifier(DecisionTreeClassifier(random_state=1234))
#X_train,y_trainを使って訓練
clf.fit(X_train, y_train)
#テストデータを使って精度検証
clf.score(X_test, y_test)
clf.scoreで出力される精度は0.817でした。
③まとめ
いかがでしたでしょうか。どのモデルも、最低限でよければかなりシンプルですね。
各モデルの精度を比較します。
今のところ、SVMの精度がやや他のモデルに比べると悪いかな?/そのほかのモデルは割と良い精度だな、といった所感でしょうか。
次回は「2.正則化」を行い、各モデルの精度がどう変わるのか(必ずしも上がるとは限りませんが)検証していきたいと思います!