Kaggleデータ分析の手法について整理。
※以下は
Youtube動画 「Kaggle入門「タイタニックの生存予測」メダリストと一緒に解説!」を
実際に演習をしながら進め、個人の理解でまとめたものです。
→ https://www.youtube.com/watch?v=-QuM_QAC748
(とてもわかりやすかったです)
最初に全体像
1.訓練用データ分割(学習・テスト)
2.予測モデル決定
3.モデルインスタンスへの訓練用学習データのfit
4.訓練用テストデータでの予測スコア確認
5.課題用データで変数データセットを準備
6.特徴量のうちカテゴライズ値を展開
7.予測結果submitとして、課題用データからレコードを一意に定める項目を拾ってくる
8.予測結果submitに予測項目列を作成し、
訓練データをfitさせた機械学習モデルインスタンスへ
課題用データを引数として与えた予測結果を対応付ける。
9.予測結果submitをCSVデータへ変換
10.Kaggleへの提出
ファイルの準備、作業ディレクトリへの移動
1.個人のアカウント配下のGoogleドライブの一部をマウントし、
ipynb(ノートブックファイル)へ接続する。
2.cdコマンドで、接続したGoogleドライブ内の
テストデータ格納先ディレクトリへ移動する
Notebookへのデータインポート
1.pandasインポート
import pandas as pd
2.訓練データをpandasでreadする
train = pd.read_csv('data/train.csv')
3.課題データをpandasでreadする
test = pd.read_csv('data/test.csv')
対象データの概要確認
※以下は訓練データtrainを対象に確認した場合。
1.保持データ件数を確認 ★
train.count()
2.保持項目のデータタイプを確認 ★
train.dtypes
3.Null値の含まれているデータ件数を項目ごとに表示確認 ★
train.isnull().sum()
4.保持データサンプルとして先頭格納データを確認
train.head()
※以下は課題データtestを対象に確認した場合。
1.保持データ件数を確認 ★
test.count()
2.保持項目のデータタイプを確認 ★
test.dtypes
3.Null値の含まれているデータ件数を項目ごとに表示確認 ★
test.isnull().sum()
4.保持データサンプルとして冒頭格納データを確認
test.head()
★…どんなデータを取り扱うにしても、非常に重要。
訓練データと課題データでの相違を整理しておく
(例)
・データ件数の差
・項目数の差
・項目ごとにデータタイプが一致していること
・Nullを含む項目は訓練用・課題用それぞれでどれか
・課題データ側で明らかにしたいその目的は何か
・訓練データはどのモデルに基づいて機械学習を行うべきか
(これは追々…)
訓練用データに対し、事前準備をする
1.訓練用データ内で予測モデル関数における独立変数となる定義域xと
それらに対応する値域yを定義する。※
x = train[['Pclass', 'SibSp', 'Parch']]
y = train[['Survived']]
※訓練データの集合Sにおいてx∈S、y∈Sのとし
xからyへの写像(モデル)を考えるとき、
x(変数)にどの要素を定めるか?
y(予測値)にどの要素を定めるか?
ということ。
2.(訓練用データの中で)学習データとテストデータに分割する
(sklearn.model_selection から train_test_split をimport利用)
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0)
訓練データと課題データを適用する機械学習モデルを選択する
①k−最近傍法
:データをプロットした際、対象データを
半径k内に存在する分類済データが最も多く属するカテゴリと
同パターンになると判断していく手法
from sklearn.neighbors import KNeighborsClassifier
②ロジスティック回帰
③サポートベクタマシン(超平面)
from sklearn.svm import LinearSVC
④決定木
⑤ランダムフォレスト(多数の決定木による多数決)
from sklearn.ensemble import RandomForestClassifier
⑥勾配ブースティング回帰木
from sklearn.ensemble import GradientBoostingClassifier
︙
選択したモデルへ訓練用の学習データを適用後、訓練用のテストデータでスコア確認
1.モデルをパッケージからインポートする
2.モデルインスタンスを生成する
3.訓練データからSplitした学習用データx,yをモデルインスタンスにFitさせる
4.モデルインスタンスのScoreを訓練データからSplitしたテストデータで確認する
5.スコアが低い場合、1に戻る
★k−最近傍法の場合
1.モデルをパッケージからインポートする
from sklearn.neighbors import KNeighborsClassifier
2.モデルインスタンスを生成する
knn = KNeighborsClassifier()
3.訓練データからSplitした学習用データx,yをモデルインスタンスにFitさせる
knn.fit(x_train, y_train)
4.モデルインスタンスのScoreを訓練データからSplitしたテストデータで確認する
knn.score(x_test, y_test)
訓練済の機械学習モデルに課題用のデータを与え予測させる
1.課題用データ(test)を用いて訓練用(train)と同様に
予測モデル関数における独立変数を定める
x_for_submit = test[['Pclass', 'SibSp', 'Parch']]
2.予測結果submitとして予測結果の項目を定義するが、
まず課題用データの対象レコードと一意に対応するように
項目PassengerIDを採用する
submit = test[[‘PassengerId’]]
3.予測結果submitに項目列Survivedを作成し、
訓練データをfitさせた機械学習モデルインスタンスへ
課題用データを引数として与えた予測結果を対応付ける。
submit[’Survived’] = knn.predict(x_for_submit)
4.予測結果をCSVデータに変換し取得する
submit.to_csv('submission/submit01.csv', index=False)
※Kaggle上の提出時に不要なため、出力結果にindexは付けない
5.Kaggleで提出
全体像(再掲)
1.訓練用データ分割(学習・テスト)
2.予測モデル決定
3.モデルインスタンスへの訓練用学習データのfit
4.訓練用テストデータでの予測スコア確認
5.課題用データで変数データセットを準備
6.特徴量のうちカテゴライズ値を展開 ★後述
7.予測結果submitとして、課題用データからレコードを一意に定める項目を拾ってくる
8.予測結果submitに予測項目列を作成し、
訓練データをfitさせた機械学習モデルインスタンスへ
課題用データを引数として与えた予測結果を対応付ける。
9.予測結果submitをCSVデータへ変換
10.Kaggleへの提出
精度を高める
ほかに有用な特徴量はないか?を検討する
例:性別(Sex:male/female)を採用するとき
1.訓練用データから、機械学習モデルに投入する変数項目として追加する
x = train[['Pclass', 'SibSp', 'Parch', 'Sex']]
y = train[['Survived']]
カテゴライズに用いる値を持つ項目列は、該当・非該当状態を表す項目列へと展開する
※特徴量が数値ではないため、Sexの内容を0/1のデータに展開する。
0/1の「該当・非該当」データへ変換するには、pandasのget_dummies関数を用いる。
※なおここでPclass(Ticket class)もカテゴライズされた値
(1 = 1st, 2 = 2nd, 3 = 3rd)なので、get_dummiesの対象列に含めることで
Sex同様に各値の該当非該当状態への展開の対象とする。
x = pd.get_dummies(x, columns=['Pclass', 'Sex'])
→ One-Hot encoding
前述と同様の手順を踏み、訓練・予測を行う
1.訓練用データ分割(学習・テスト)
2.予測モデル決定
3.モデルインスタンスへの訓練用学習データのfit
4.訓練用テストデータでの予測スコア確認
5.課題用データで変数データセットを準備
6.特徴量のうちカテゴライズ値を展開 ★ここを行った
7.予測結果submitとして、課題用データからレコードを一意に定める項目を拾ってくる
8.予測結果submitに予測項目列を作成し、
訓練データをfitさせた機械学習モデルインスタンスへ
課題用データを引数として与えた予測結果を対応付ける。
9.予測結果submitをCSVデータへ変換
10.Kaggleへの提出
データ分割後に正規分布変換処理を挟み、精度を上げる
1.インポート
from sklearn.preprocessing import StandardScaler
2.StandardScalerインスタンスを生成
scaler = StandardScaler()
3.訓練データによるfitting
scaler.fit(x_train)
4.訓練データを正規分布変換
x_train_scaled = scaler.transform(x_train)
5.テストデータを正規分布変換
x_test_scaled = scaler.transform(x_test)
欠損値を持つ項目列はNULL埋めを行う(平均値で埋める)
1.欠損値を持つFareに対してNULL埋めを行っておく(平均値で埋める)
x_for_submit['Fare'] = x_for_submit['Fare'].fillna(x_for_submit['Fare'].mean())
他の機械学習モデルを用いる
1.訓練用データ分割(学習・テスト) ★正規分布変換したり
2.予測モデル決定 ★ここね
3.モデルインスタンスへの訓練用学習データのfit
4.訓練用テストデータでの予測スコア確認
5.課題用データで変数データセットを準備 ★欠損値埋めたり
6.特徴量のうちカテゴライズ値を展開 ★展開したり
7.予測結果submitとして、課題用データからレコードを一意に定める項目を拾ってくる
8.予測結果submitに予測項目列を作成し、
訓練データをfitさせた機械学習モデルインスタンスへ
課題用データを引数として与えた予測結果を対応付ける。
9.予測結果submitをCSVデータへ変換
10.Kaggleへの提出
以上。
動画(再掲)
「Kaggle入門「タイタニックの生存予測」メダリストと一緒に解説!」
→ https://www.youtube.com/watch?v=-QuM_QAC748