はじめに
環境工学専攻の修士2年です。
学部時代はプログラミングとは無縁でしたが、指導教員のせい(=おかげ)で機械学習を学び始めました。(いつもありがとうございます)
最近Kaggleを始めたので、学習記録として残していこうと思います。
初心者の方・これから始めようと思っていた方は一緒に頑張りましょう!!
有識者の方々、アドバイス等ございましたらぜひお願いいたします。
今日やったこと
- Kaggle登録
- Predicting F1 Pit StopsのEDAなど
ここでお詫びがあります。本来Kaggle登録の後にTitanicやHouse Pricesというチュートリアルコンペを行うのですが、すでにやったことがあったので先に行っています・・追ってチュートリアルについて【Day0】を作成しようと思います。
Kaggle登録
-
メアドなどを登録
英弱なのでさっそく挫折しかけるが、なんとか
learn to compete on Kaggle(チュートリアル的なやつ)をクリック -
実際にコンペを解く
Begginerを選択すると
TitanicやHouse Prceなどの典型的なチュートリアルを解くことが出来ます。Begginerでは先人が作っているチュートリアル用のノートブックが存在するので、それを実行するだけで教師あり学習の概要が分かるようになっていました。今回はIntermediateからPredicting F1 Pit Stops(F1のピットインを予測せよ)を選択。
Predicting F1 Pit Stops
260501から始まり260531まで続くコンペらしい。何回投稿できるやら。
どうやら開催中のコンペでは核心に触れるようなことを記載するのは規約上ダメっぽいのでさらっと流すかも知れません。(私程度が核心に触れられるのか微妙ですが一応)
ここではどういう風にKaggleを使用するのか・勉強するのかについて記載しようと思います。
あんまよく分かってないんですけど、ノートブックは新規作成でいいんですかね?画面左上の+Createからnotebookを選択すると作成できました。
作成するとデフォルトでnumpy・pandasがimportされていた。またデータ取得用のpathも書かれている。
全体的な流れ
教師あり学習の基本的な流れについてはこのページを参考にしてください。
まずは問題設定について確認ですね。
問題設定の理解
今回の問題はF1ドライバーが次に周でピットインするかどうか予測するです。YES or Noの分類タスクと言えます。
上記のサイトでも触れていますが、問題理解は特徴用エンジニアリングの観点から非常に重要と言えます。私はF1についてよく知らないので、簡単にchatGPTに聞いてみました。
■ F1(フォーミュラ1)とは
- 世界最高峰の自動車レース
- サーキットを約50〜70周走行し、最も早くゴールしたドライバーが勝利
- 単純なスピードだけでなく「戦略」が非常に重要
● 重要な特徴
- レース中にタイヤ交換(ピットストップ)が必要
- タイヤは使うほど劣化し、ラップタイムが遅くなる
- 「いつタイヤ交換するか」が勝敗を左右する
だそうです(笑)。つまり与えられたデータから次のラップでタイヤ交換しに行くか当てろと言われています。確かにラップタイムやレースの進行状況などで当てられるかもしれませんね。
データはどこだ
次に訓練データの中身をチェックします。がその前に、データどこやねん。Kaggleというプラットフォームを使い始めたばかりなのでシンプルにKaggleの使い方が分かっていません。
10分後・・・
ありました。下の画像のDataに訓練・評価データがあります。右からそれぞれのデータセットの概要を確認できます。

ノートブックでどう使うかなんですが、画面右の+Add Inputから問題のタイトルを入力するとOKです。

ここからデータを読み込み・確認していきます。
# read_csv in training data
path = "/kaggle/input/competitions/playground-series-s6e5/train.csv"
df_train = pd.read_csv(path)
print(df_train.head(3)) # 上から3行出力
print(df_train.columns) # 列名チェック
df_train.info() # その他いろいろ確認
いろいろ出てきますが重要なのは列名とデータの型とかかな?
データの列名
Index(['id', 'Driver', 'Compound', 'Race', 'Year', 'PitStop', 'LapNumber',
'Stint', 'TyreLife', 'Position', 'LapTime (s)', 'LapTime_Delta',
'Cumulative_Degradation', 'RaceProgress', 'Position_Change',
'PitNextLap'],
dtype='object')
データの型
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 439140 entries, 0 to 439139
Data columns (total 16 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 id 439140 non-null int64
1 Driver 439140 non-null object
2 Compound 439140 non-null object
3 Race 439140 non-null object
4 Year 439140 non-null int64
5 PitStop 439140 non-null int64
6 LapNumber 439140 non-null int64
7 Stint 439140 non-null int64
8 TyreLife 439140 non-null float64
9 Position 439140 non-null int64
10 LapTime (s) 439140 non-null float64
11 LapTime_Delta 439140 non-null float64
12 Cumulative_Degradation 439140 non-null float64
13 RaceProgress 439140 non-null float64
14 Position_Change 439140 non-null float64
15 PitNextLap 439140 non-null float64
dtypes: float64(7), int64(6), object(3)
memory usage: 53.6+ MB
列名が英語すぎてつらいですが、生成AIに解説お願いすると以下のよう教えてくれました。
● 基本情報
-
id
データ識別用のID -
Driver
ドライバー名 -
Race
レース名 -
Year
開催年
● タイヤ・走行状態(重要)
-
Compound
タイヤの種類- Soft:速いが劣化が早い
- Medium:バランス型
- Hard:遅いが長持ち
-
TyreLife
タイヤ使用開始からの周回数
→ 大きいほど劣化している -
Stint
タイヤ交換ごとの区間番号
→ 1回目のタイヤ、2回目のタイヤなど
● レース進行
-
LapNumber
現在の周回数 -
RaceProgress
レース進行度(0〜1)
→ 例:0.5 = レースの半分
● ピット関連(非常に重要)
-
PitStop
そのラップでピットに入ったか- 1:入った
- 0:入っていない
-
PitNextLap
次のラップでピットに入るか
→ 戦略予測に利用される
● パフォーマンス
-
LapTime (s)
1周にかかった時間(秒)
→ 小さいほど速い -
LapTime_Delta
前のラップとの差分
→ 正:遅くなった(劣化など) -
Cumulative_Degradation
タイヤ劣化の累積量
→ パフォーマンス低下の指標
● 順位・結果
-
Position
現在の順位(1位がトップ) -
Position_Change
順位変動
→ 正:順位アップ、負:ダウン
いろいろ情報が多いので工夫のしがいがありそうです。
ということで今回はここまで。次回からEDAと呼ばれる基本的なデータセットの確認を行おうと思います。が、どうやら問題の核心に触れるようなことは規約上ダメっぽいのでさらっと流すかも知れません。(私程度が核心に触れられるのか微妙ですが一応)

