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.探索的データ分析 へ。
データの概観
面倒なのでここも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()
データの読み込みで記載した回答の続きを以下に示す。
プラグインをフル活用したあと、結果が出力された。
ヒートマップはこちら。
クラスタリング
主からの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()
(結果として良いのか悪いのかわからない)
5.一次予測
ここで一旦、予測モデルを作らせた。
"特徴量を追加しながら"と頼んだが追加していなかったため、次節より特徴量を追加している。
この時点でモデルの予測精度は 約80.4% 。
改善点も挙げてくれているので、次節では"じゃあそれやって改善して。"と頼んだ。
6.特徴量エンジニアリング
新たな特徴量の作成 → 二次予測
以下、プロンプトと、そのOutput。
新しい特徴量として、"分かりやすいのにして"と言ったら、ごく単純な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。
# 訓練データの読み込み
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)
from sklearn.ensemble import RandomForestClassifier
提出 → スコアの確認
Noteableにアクセスし、提出用のcsvファイル('submission.csv')をダウンロードし、kaggleに提出した。
以下、スコアと順位。
スコア:0.77990
提出時の順位:3535位/約16000人(2023年6月17日時点)
…一応上から数えたほうが早い方だから、良い結果と言えるのかな?
8.まとめ
全然理解できていなくてもできてしまって困惑しています。
あと、スマホだけで出来るけどPCでやった方が絶対楽。
電車乗りながらでもできましたが、おすすめはしません。
最後まで見ていただいた方、ありがとうございました。