機械学習

初心者向け|【第一回】機械学習モデルの精度比較検証

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

Kaggleのkernel(他の人の解法)を見ながら勉強すると良いよ

とアドバイスされる方も多いのではないでしょうか。

実際、このやり方は非常に有効です。

ただ、本当の初心者の頃、こんなことを思っていました。

・kernel見ても、なんか難しそうなやり方ばっかり・・・

・こんなに難しいやり方じゃなくて、もっとシンプルなやり方を知りたいだけなのに・・・

そう、kernelは教材ではないので、「まずは最低限の書き方を知りたい」「少しずつステップアップしたい」という要望には応えてくれません。

今回は複数回に及ぶ企画です

【第一回】←今回はココ

Kaggleのtitanicを使って、複数モデル(決定木やロジスティック回帰)について最低限の基礎的なアプローチのコードを紹介

【第二回】

少しレベルを上げたアプローチ(正則化を実行してみる)

【第●回】

もう少しレベルを上げる・・と徐々にレベルを上げていき、それぞれについて精度を検証していくことにします

本記事をお読み頂くと下記が分かります。

ポイント

・複数のモデルについて、最低限の基本的なコーディングの仕方が分かる

・複数のモデルについて、精度の比較の仕方が分かる

本記事の目次は以下の通りです。

①本企画の全体像

②実践

(0)前処理

(1)ロジスティック回帰

(2)SVM

(3)決定木

(4)ランダムフォレスト

(5)アダブースト

③まとめ

 

今回試す手法とモデルは下記です。

■試す手法

1.最低限の、シンプルな書き方

2.(必要なモデルのみ)正則化

3.(必要なモデルのみ)標準化

4.ハイパーパラメータチューニング

5.特徴量選択

■試すモデル

・ロジスティック回帰

・サポートベクトルマシン

・決定木

・ランダムフォレスト

・アダブースト

①本企画の全体像

アウトプットはこのようなイメージです。

5モデル×5手法の計25パターンについてコードを示しながら解説し、最後に各セルに精度を埋めていきます。

今回はその企画の第一回目として「1.シンプル」列(5モデル×1手法)について、各モデルのコードの書き方の解説と、精度を検証していきたいと思います

■補足

実は以前に、異なるコンペで全く同じ取り組みをqiitaでしております。

kaggleを題材に、機械学習モデルの精度比較をしてみた

今回はよりメジャーな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.正則化」を行い、各モデルの精度がどう変わるのか(必ずしも上がるとは限りませんが)検証していきたいと思います!

 

未経験からデータサイエンティストに転職するためのロードマップ販売中

未経験からデータサイエンティストに転職した私のノウハウを凝縮したロードマップをnoteで販売中です(1,280円)。

巷にあふれる「勉強法」だけでなく、「勉強した内容をどのように実務で実践し」「転職ではどのような点が評価されたのか」といった入手困難な情報を、「私のリアルな実体験」としてお届けしています。

わずか4日間で60名超の方に購入頂きました!

ロードマップの無料部分を見てみる

-機械学習

© 2021 データサイエンス はじめの一歩 Powered by AFFINGER5