検証手法(分類) 機械学習

#pandasのインポート
import pandas as pd

#データの読み込み
titanic = pd.read_csv('titanic.csv')
breast = pd.read_csv("breast_cancer.csv")
#ライブラリの宣言
from sklearn.model_selection import train_test_split

#全データを説明変数と目的変数に分ける
X_titanic = titanic.drop("Survived",axis=1)
y_titanic = titanic["Survived"]

#説明変数と目的変数をそれぞれ,trainのX,testのX,trainのy,testのyに分ける
X_titanic_train , X_titanic_test , y_titanic_train , y_titanic_test = train_test_split(X_titanic , y_titanic , random_state=0)

#trainとtestの形を確認して分けられていることを確認
print(titanic.shape)
print(X_titanic_train.shape , X_titanic_test.shape , y_titanic_train.shape , y_titanic_test.shape)
(668, 11)
(501, 10) (167, 10) (501,) (167,)
  • sklearnのmodel_selectionモジュールの中には,検証用に使えるライブラリが多く入っています.その中のtrain_test_splitという関数を持ってきます.
  • 初めに,全データをXとyに分けます.
  • train_test_split(データフレーム)で学習用と検証用に分けられます.
  • 二つに分けられて返ってくるので,Xとy,二つ渡すとそれぞれ二つ((X_train,X_test)と(y_train, y_test))になって返ってきます.つまり4つですね.
  • 少しややこしいですが,上記の図を参考にして考えてみてください.
  • .shape関数で形を確認すると,行方向に分けられていることがわかりますね.
  • train_test_splitはデフォルトが3:1に分けるようになっています.
  • train_test_split(データフレーム,train_size=0.6)など書くと,6:4に分けられます.
  • また,デフォルトがシャッフルするようになっているので,図のようにばっさり分けられるというより,ランダムにその割合で取ってきます.
  • (なのでrandam_state=0と,シード値を固定しているんですね)

モデリング

#ライブラリの宣言をします
from sklearn.ensemble import RandomForestClassifier

# モデルを定義して,学習させます.
model_titanic = RandomForestClassifier(n_estimators=100,random_state=0)
model_titanic.fit(X_titanic_train,y_titanic_train)

#モデルの精度を出します
print("学習用データのスコアは",model_titanic.score(X_titanic_train,y_titanic_train))

print("検証用データのスコアは",model_titanic.score(X_titanic_test,y_titanic_test))
学習用データのスコアは 0.9800399201596807
検証用データのスコアは 0.8203592814371258
  • ランダムフォレストを取り出してきました.
  • モデルを定義して,学習用データに対して学習しました(つまりX_trainとy_train)
  • スコアを出して評価しました.ただし学習用データを渡したときと検証用データを渡したときで結果が違います.

結果は82%程度ですね.危うく精度98%と言ってしまうところでした.実際にはこのくらいが出るだろうという検証をすることができましたね.

交差検証

K-分割交差検証(以降K-Fold CVなど)を使ってみましょう.

#ライブラリの宣言
from sklearn.model_selection import cross_val_score
#交差検証をする
cv_model_titanic = cross_val_score(model_titanic,X_titanic,y_titanic,cv=5)
print(cv_model_titanic) さっきのモデル
[0.74626866 0.76119403 0.84328358 0.85714286 0.76691729]
  • 交差検証をするライブラリには,X,yで渡さなければならないので,すべてのデータをXとyに分けました.
  • cross_val_score(モデル,X,y,cv=5)の順に入れると,交差検証をした検証データに対する結果を返してくれます.
  • モデルにはアルゴリズム名を入れます.cv=5というのは,5分割するという意味です
#結果を評価する
print(cv_model_titanic.mean())
print(cv_model_titanic.std())
0.7949612838065312
0.04582413633418334
  • リスト.mean()リスト.std()で,リストの平均値と標準偏差を計算することができます.

だいたい79%くらいの精度で,標準偏差が4%程度なので,多少ブレても±3%程度だとということも分かりましたね.

コメント

タイトルとURLをコピーしました