0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Kaggleデータ分析の手法について動画視聴したのでオススメしつつ個人理解をまとめてみた。

Posted at

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?