LoginSignup
1
1

More than 1 year has passed since last update.

[備忘録] スマホだけでkaggleのタイタニック号生存者予測コンペやってみた

Last updated at Posted at 2023-06-18

Kaggleのコンペのほぼすべての工程を、スマホだけでやってみたときの備忘録。

ChatGPTを使用したため、主にChatGPTに対してのInput、ChatGPTのOutputを記載していく。
なお当記事の章構成も、ChatGPTに作らせました。(一部改修)

・当記事はPCで作成したため、挿入している画像はPCでのスクショになります。
・ちなみに、主はデータ分析の超初心者。
・Qiitaで記事を作るのも初めてなので、所々見づらいかもしれません。
 予めご了承ください。

対象のコンペはお馴染みのタイタニック号のやつ。

0.使用したもの

・ChatGPT (GPT-4)
・ChatGPTプラグイン - Noteable、WebPilot
・GitHub (ファイル共有用。)

・Google Cloud StorageやAmazon S3などでも可。
・Noteableに直接アップロードするのも、勿論可。

・コンペのデータセット
・スマホ!!!!!

1.はじめに

コンペティションの概要

ざっくりと説明…。

タイタニック号の乗客データ(年齢、性別、乗客クラス、等)を使用し、乗客が生存したかどうかを予測するコンペ。

2.データの準備

データの読み込み

[手順]
・kaggleからデータセットをダウンロード
・自分のGitHubにデータをアップロード
・そのリンクをChatGPTに教える

以下、実際のプロンプト文、及び回答。
プラグインをぶん回している様子。
回答の続きは 4.探索的データ分析 へ。
image.png

データの概観

面倒なのでここもChatGPTに書かせる。

---以下よりChatGPT---

この章では、Kaggleのタイタニック号生存者予測コンペティションで使用するデータセットの読み込みと初期の探索を行います。

まず、3つのデータセットをダウンロードします。
次に、Pandasのread_csv関数を使用して、これらのCSVファイルをデータフレームとして読み込みます。

import pandas as pd

# Load the data
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')

データが正しく読み込まれたことを確認するために、head関数を使用して、各データフレームの最初の数行を表示します。

# Display the first few rows of the train data
print(train_data.head())

# Display the first few rows of the test data
print(test_data.head())

これにより、データの概観を把握することができます。各列の名前、データ型、そしてデータの一部を確認することで、次のステップであるデータの前処理や探索的データ分析(EDA)に進む前に、データの理解を深めることができます。

---ここまで---

3.データの前処理

欠損値の処理

実際にChatGPTがNoteableに書いたコードを見てみる。

# Fill missing values
train_data['Age'].fillna(train_data['Age'].median(), inplace=True)
train_data['Fare'].fillna(train_data['Fare'].median(), inplace=True)
test_data['Age'].fillna(test_data['Age'].median(), inplace=True)
test_data['Fare'].fillna(test_data['Fare'].median(), inplace=True)

中央値で補完してるぽい。

データの標準化

先ほどと同様に、実際にChatGPTがNoteableに書いたコードを見てみる。

# Standardize the data
scaler = StandardScaler()
scaled_data = scaler.fit_transform(train_data[['Pclass', 'Age', 'SibSp', 'Parch', 'Fare']])

こんな感じ。

4.探索的データ分析

相関分析

まずコード。

import seaborn as sns
import matplotlib.pyplot as plt

# Calculate the correlation matrix
corr_matrix = train_data.corr()

# Visualize the correlation matrix
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt=".2f")
plt.show()

データの読み込みで記載した回答の続きを以下に示す。
プラグインをフル活用したあと、結果が出力された。
image.png
ヒートマップはこちら。
IMG_3323.PNG

クラスタリング

主からのInputは、"クラスタリングと可視化をして。"のみ。
以下、ChatGPTのOutputしたコード。

from sklearn.cluster import KMeans
from sklearn.decomposition import PCA

# Perform clustering
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(scaled_data)

# Use PCA for visualization
pca = PCA(n_components=2)
reduced_data = pca.fit_transform(scaled_data)
reduced_data = pd.DataFrame(reduced_data, columns=['Dimension 1', 'Dimension 2'])
reduced_data['Cluster'] = kmeans.labels_

# Visualize the clusters
plt.figure(figsize=(10, 8))
sns.scatterplot(data=reduced_data, x='Dimension 1', y='Dimension 2', hue='Cluster', palette='viridis')
plt.title('Clusters of Titanic Dataset')
plt.show()

クラスタリングの結果が以下。
IMG_3324.PNG

(結果として良いのか悪いのかわからない:joy:)

5.一次予測

ここで一旦、予測モデルを作らせた。
スクリーンショット 2023-06-18 140500.png
"特徴量を追加しながら"と頼んだが追加していなかったため、次節より特徴量を追加している。
この時点でモデルの予測精度は 約80.4%
改善点も挙げてくれているので、次節では"じゃあそれやって改善して。"と頼んだ。

6.特徴量エンジニアリング

新たな特徴量の作成 → 二次予測

以下、プロンプトと、そのOutput。
スクリーンショット 2023-06-18 141129.png
新しい特徴量として、"分かりやすいのにして"と言ったら、ごく単純なFamilySizeを作成した。
用いたアルゴリズムはランダムフォレスト分類器。
この時点で予測精度は 約81.1% となり、0.7%改善できたみたい。

コードを以下に示す。

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import LabelEncoder

# Preprocess the data
train_data['FamilySize'] = train_data['SibSp'] + train_data['Parch'] + 1
le = LabelEncoder()
train_data['Sex'] = le.fit_transform(train_data['Sex'])

# Define the features and the target
X = train_data[['Pclass', 'Sex', 'Age', 'FamilySize', 'Fare']]
y = train_data['Survived']

# Split the data into training and validation sets
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=0)

# Train the model
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X_train, y_train)

# Make predictions on the validation set
predictions = model.predict(X_val)

# Calculate the accuracy of the model
accuracy = accuracy_score(y_val, predictions)

7.Kaggleへの提出

提出ファイルの作成

"提出用のファイルを作成して"とだけ頼んだら、トライアンドエラーを繰り返して、Noteable内に作ってくれた。
以下、Output。
スクリーンショット 2023-06-18 143141.png

# 訓練データの読み込み
train_data = pd.read_csv('train.csv')

# モデルの訓練
model = RandomForestRegressor(n_estimators=100, random_state=0)
model.fit(train_data[features], train_data[target])

# テストデータに対する予測
predictions = model.predict(test_data[features])

# 提出ファイルの作成
output = pd.DataFrame({'Id': test_data.Id, 'SalePrice': predictions})
output.to_csv('submission.csv', index=False)

スクリーンショット 2023-06-18 143336.png

from sklearn.ensemble import RandomForestClassifier

スクリーンショット 2023-06-18 143345.png

提出 → スコアの確認

Noteableにアクセスし、提出用のcsvファイル('submission.csv')をダウンロードし、kaggleに提出した。
以下、スコアと順位。
スコア:0.77990
提出時の順位:3535位/約16000人(2023年6月17日時点)

…一応上から数えたほうが早い方だから、良い結果と言えるのかな?:thinking:

image.png

8.まとめ

全然理解できていなくてもできてしまって困惑しています。

あと、スマホだけで出来るけどPCでやった方が絶対楽。
電車乗りながらでもできましたが、おすすめはしません。

最後まで見ていただいた方、ありがとうございました。

付録

今後kaggleをChatGPTにやらせるときの指示は、どんな内容が最適か聞いてみた。ご参考までに。
スクリーンショット 2023-06-18 152304.png

1
1
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
1
1