はじめに
データサイエンス初学者の私だが、chatgptを使用すればpythonを使いKaggleコンペに参加できるか挑戦した。
コンペのテーマは前回記事と同様「タイタニック生存者の予測」で試してみる。
環境
- Pyton
- Anaconda
- pandas
- Jupyter Notebook
- Bing AIも補足的に使用
筆者のデータサイエンスに関連するスキル・経験
- 機械学習:独学レベル(書籍やサイト、無料動画を利用)
- 数学知識:大学1年生程度
- 統計学:大学1年生程度
- プログラミング:Excel VBA独学レベル(書籍やサイト、無料動画を利用)
※VBAエキスパート(Excelベーシック)取得 - ビジネス:前職で自社開発の業務効率化ツールを活用するための社内募集にて、担当業務の効率化を提案した経験あり(開発者と定期的に話し合いツール作成。今までの工数を半分にできた。)
chatgptとは
kaggleコンペのタイタニック問題とは
データ処理の工程
以下のような工程でデータ分析を進めていく。
-
Kaggleからデータをダウンロードする。
-
ダウンロードしたデータをもとに、最適化したモデルを作成する。
-
2.で作成したモデルをもとに、別のデータに対してモデルを適用することで生存しているかを予測する。
-
Kaggleにアップロードして生存率(正答率)を判定する。
データ定義の確認
データセットは下記のとおりである。
属性 | 内容 |
---|---|
PassengerId | 乗客ID |
Survived | 生死(0 = No; 1 = Yes)※train.csvのみに存在。test.csvのこの値を予測する。 |
Pclass | 乗客の社会階級(1 = 1st(High); 2 = 2nd(Middle); 3 = 3rd(Low)) |
Name | 乗客の氏名 |
Sex | 性別 |
Age | 年齢 |
SibSp | 船している夫婦、兄弟姉妹の数 |
Parch | 乗船している親、子供の数 |
Ticket | チケットNo |
Fare | 乗船料金 |
Cabin | 船室 |
Embarked | 乗船場所(C = Cherbourg; Q = Queenstown; S = Southampton) |
データの前処理とは
機械学習の元となるデータをAIに学習させる前にデータを加工することである。
また、収集した生のデータをAIが学習しやすいようにきれいに整える作業である。
データ前処理の必要性
収集したデータが完璧な状態でそのまま使える可能性は限りなく低い。ほとんどのデータにはエラーやノイズ、欠損値などが含まれていたり、データによってフォーマットが異なることもある。このようなデータをそのまま機械学習に使用すると学習の精度が下がったり、エラーが出てしまうなどの問題が起こる。
そのため、機械学習を行う前にデータを適切な状態に加工するデータの前処理が欠かせないのである。
chatgptでハンズオン形式で進めていく
手順(以下はchatgptの回答である。)
-
Kaggleのウェブサイトにアクセスし、タイタニックのコンペティションページに移動します。
-
ページ上部の"Data"セクションから、"Download All"を選択してデータセットをダウンロードします。これにより、トレーニングデータ(train.csv)とテストデータ(test.csv)が含まれるZIPファイルがダウンロードされます。
-
ダウンロードしたZIPファイルを解凍し、必要なデータセット(train.csvおよびtest.csv)を取得します。
-
Jupyter NotebookなどのPython環境を開き、必要なライブラリ(pandas、scikit-learnなど)をインポートします。
import pandas as pd from sklearn.ensemble import RandomForestClassifier
-
トレーニングデータを読み込みます。
train_data = pd.read_csv('train.csv')
-
データの前処理を行います。必要な特徴量を選択し、欠損値を補完し、カテゴリカル変数を数値化します。
# 特徴量の選択 features = ['Pclass', 'Sex', 'Age', 'Fare'] X_train = train_data[features] y_train = train_data['Survived'] # 欠損値の補完 X_train['Age'].fillna(X_train['Age'].median(), inplace=True) X_train['Fare'].fillna(X_train['Fare'].median(), inplace=True) # カテゴリカル変数の数値化 X_train['Sex'] = X_train['Sex'].map({'female': 0, 'male': 1})
-
モデルの訓練を行います。ここでは、ランダムフォレストを使用します。
model = RandomForestClassifier(n_estimators=100, random_state=42) model.fit(X_train, y_train)
-
テストデータを読み込み、同様の前処理を行います。
test_data = pd.read_csv('test.csv') X_test = test_data[features] X_test['Age'].fillna(X_test['Age'].median(), inplace=True) X_test['Fare'].fillna(X_test['Fare'].median(), inplace=True) X_test['Sex'] = X_test['Sex'].map({'female': 0, 'male': 1})
-
予測を行います。
predictions = model.predict(X_test)
-
予測結果を提出用の形式に変換します。
submission = pd.DataFrame({ 'PassengerId': test_data['PassengerId'], 'Survived': predictions })
-
予測結果をCSVファイルとして保存します。
submission.to_csv('submission.csv', index=False)
-
Kaggleのコンペティションページにアクセスし、"Submit Predictions"または"Submit"を選択します。
-
提出フォームに必要事項を入力し、先ほど保存したsubmission.csvファイルをアップロードします。
-
提出ボタンをクリックして予測データを提出します。
以上がPythonを使用してKaggleのタイタニック問題に予測データを提出する手順です。この手順に従って実行することで、予測結果をKaggleに提出することができます。
上記chatgptの手順を進めていく上で困ったこと
手順6.について、以下のプログラミングを実行した時エラーが出た
▼そこで上記についてチャットにきいてみた。以下回答。データフレームが影響していたようだ。
▼上記のプログラミングで再度実行したら今度はエラー文は表示されなかったので引き続き7.の手順へ進む。
手順7.について、以下のプログラミングを実行した時エラーが出た
▼回答。モデルは数値データを扱うため、文字列データは扱えないとのこと。
▼上記回答のプログラミングを実行するとエラー文は表示されなかったので、手順8.へ進む。
手順8.エラー
▼回答。DataFrameのスライスのコピーに値を設定している影響が原因とのこと。
▼回答。これは上記とは違うエラーだと思われる。特徴量の列が影響しているとのこと。
▼回答。予測データセットで使用される特徴量の列がモデルの訓練時と異なっているとのこと。
▼実行後、エラー表示はなかったので手順9.へ進む。
手順9.
▼回答。モデルの訓練時に使用された特徴量が予測データセットに存在しないとのこと。
▼実行後、エラーが表示されなかったので、手順10.へ進む。
手順10.
▼回答。predictionsという変数が定義されていないとのこと。
▼回答。モデルを学習する際に使用された特徴量の名前と、予測を行うために渡されたデータの特徴量の名前が一致していないとのこと
▼実行後、カラムを確認した。削除対象カラム名があるので実行する。
▼実行後、エラーが表示されなかったので手順11.へ進む。
手順11.
▼回答。先程の回答に誤りがあったので再度回答が得られたので実行する。
▼実行後、エラーが出なかったので、手順12.へ進む。
実行結果のファイルが生成されていなかったので質問した。以下回答。
▼回答。model.predict() メソッドに渡された X_test_copy のデータ形式が正しくない可能性があるとのこと。
▼回答。X_test_copy の特徴量の数が0であり、少なくとも1つの特徴量が必要であるということが原因のこと。
▼回答に今までのようなコードがなかったのでお願いしたら、教えてくれた。
(以降のやり取りは省略)
その後、チャットと何度もやり取りをし、以下の回答となった。
▼その後も何度もやり取りし、やはりデータ前処理が必要と回答があり、その例が以下に提示された。
ここからは上記のコードを区分けして実行していく。
- 欠損値の処理
- カテゴリカルデータの変換
- 特徴スケーリング
- 不要なカラムの削除
まずは欠損値の処理についてのコードを実行する。
→エラー表示はなかった。
カテゴリカルデータの変換についてのコードを実行する。
→エラー表示はなかった。
特徴スケーリングについてのコードを実行する。
→エラー表示はなかった。
スケーリングした特徴量を元のデータフレームに戻すについてのコードを実行する。
→エラー表示はなかった。
不要なカラムの削除についてのコードを実行する。
▼回答。削除する必要があるカラムを判断しなければならないようだ。
▼テストデータのカラムリストは以下である。これらから不要なカラムを削除するか判断する必要がある。
['PassengerId', 'Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked']
上記の中から不要なカラムを探し、先ほどのコードを修正する。以下コード。
X_test_copy.drop(['Ticket', 'Cabin'], axis=1, inplace=True)
つまり、つまり、不要なカラムの削除コードから「Name」を除いたコードで実行した。以下コード。
X_test_copy.drop(['Ticket', 'Cabin'], axis=1, inplace=True)
上記コード実行後、エラー表示されなかった。
▼実行後、エラー表示がなかったので次の処理を仰いだ。以下回答。
▼上記、上段のコード実行後エラー発生。
※以後エラー文表示は処理時間効率を考え掲載は省略。
▼上記、上段のコードは実行成功。下段はエラー発生。
▼上記、手順1.成功。
▼手順2.エラー発生
▼修正コードの回答をもらい再度実行。エラーなし。
▼手順3.を実行。成功。
▼手順4.を実行。→エラー発生
▼上記、手順1.を実行→エラー発生。
▼先ほどのカラム削除コードを使いコードを実行してみる。既に'Ticket'と'Cabin'のカラムが削除されているので'PassengerId'のみ削除する。
X_test_copy.drop(['PassengerId'], axis=1, inplace=True)
▼上記、コード成功した。次の処理を仰いだ。
▼上記、手順1.を実行する。→エラー発生
(以降のやり取り省略)
どうやらスケーリングが必要らしい。
▼今度は、ChatGPTは今までの質問、回答の流れがあり途絶えるのがこわかったので、Bing AIで以下聞いた。
スケーリングを行う「正規化」について、タイタニックデータを扱うpythonコード
▼上記コード実行。→エラー発生。このコードをChatGPTへ確認し修正コードを教えてもらう。
▼次に標準化を行う。
再度Bing AIで以下聞いたコード→エラー出なかった。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df[['Age', 'Fare']] = scaler.fit_transform(df[['Age', 'Fare']])
(以降のやり取り省略)
なぜkaggleのタイタニックのtest.csvにはなぜSurvived列がないのか。
▼以下、Bing AIの回答。ネットでも検索したが似たような内容であった。
▼上記の内容をChatGPTへ提供してみたら以下の回答があった。
以下の壁にぶつかっている。以下はChatGPTの回答。
X_test_encodedデータフレームに'Sex_female'と'Sex_male'の列が存在することを確認してください。もし存在しない場合は、データの前処理の段階でエンコーディングや特徴量の選択の手順に誤りがある可能性があります。必要な列を> 追加または修正する必要があります。
▼存在していなかったということはデータの前処理の段階で誤りがあったということ。
'Sex_female'と'Sex_male'の列が存在しません。
(以降のやり取り省略)
ようやく提出データ作成が完了した
ChatGPTのやり取りは数えきれないほど行い、途中で諦めようかと思うほどであった。
しかし、作成できてホッとした。精度どころか提出データ作成まで辿り着けないかと途中はとても不安になった。
恥ずかしい話である。
kaggleへ提出してみる
▼ChatGPTに上記の結果を報告したら以下の回答をもらった。今後はこちらを参考にスキル向上を目指したい。
今回で得られたもの
- データ処理の重要さ(特にスキル習得度)
機械学習のスキルがあってこそChatGPTを上手く活用できるのだと痛感した。
所感
ChatGPTで教えてもらった指示で進めて行けば比較的簡単に処理が終ると思っていたが、予想以上にエラーが発生し大変であった。
実際に手入力でのプログラミング、そしてエラー対処をする作業を想像すると想像しきれないほど相当の大変さがあるのだと感じた。
現状は、補足として自分でネット等で調べる必要がある。たとえばkaggleのタイタニックデータのダウンロード方法はChatGPTの回答だけ見て行うのは難しく感じた。さらにChatGPTの回答精度が上がると作業効率化が上がると感じた。
また、ChatGPTへの質問の仕方にも気を付けなければいけない。大体は詳細な回答がかえってくるが、たまに自らすすんで詳細な回答を求めないと反応してくれない時があった。なので、質問の仕方にも気を付ける必要がある。
しかし、ChatGPTの回答によるコードをコピーし、jupyterへ貼り付けるだけで実行できることは、かなりの効率化であると感じた。初学者レベルの私でもコードを手入力する大変さを知っているので、これはかなりの利便性があるし、ここから業務の成果へ貢献するための効率化ができるであろうと感じた。
もちろん、プログラミングスキルや機械学習の知識/スキルがなければ、これらを扱えないので知識/スキル、さらに経験は必要である。今回でいえばエラー文が表示された時、対処できる知識/スキルがないと正しい処理ができない可能性が出てくる。今回はエラーが出てもなんとか対処はできたが(初学者なりに)、やはりしっかりとした知識/スキルがなければ業務レベルの仕事はできないと感じた。
逆に言えば、ChatGPTを上手く活用できるのなら、初学者/未経験の私にとって強力な武器/希望の星になり得ると感じた。
今回、ChatGPTを活用しPythonやJupyter Notebookで機械学習、Kaggleへの挑戦ができたことは大きな収穫であった。
結果は散々ではあったが、経験した価値はあると思う。
おわりに
あまりに酷い結果だったので、次回(次回の記事はこちら)はハンズオン形式のPythonを使ったkaggleコンペ(タイタニック問題)に挑戦したい。
現状では前回記事で挑戦したPrediction Oneを使った方が遥かに精度がよいことがわかった。
初学者である私の現状では、ChatGPTをメインに使うのではなくPrediction OneなどAutoML(自動機械学習)ツールをメインに使い、補助的に使うのがよいと思った。