0
2

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.

【Python】データサイエンス初学者がChatGPTを頼りにKaggleへ挑戦してみた

Last updated at Posted at 2023-06-04

はじめに

データサイエンス初学者の私だが、chatgptを使用すればpythonを使いKaggleコンペに参加できるか挑戦した。
コンペのテーマは前回記事と同様「タイタニック生存者の予測」で試してみる。

環境

  • Pyton
  • Anaconda
  • pandas
  • Jupyter Notebook
  • Bing AIも補足的に使用

筆者のデータサイエンスに関連するスキル・経験

  • 機械学習:独学レベル(書籍やサイト、無料動画を利用)
  • 数学知識:大学1年生程度
  • 統計学:大学1年生程度
  • プログラミング:Excel VBA独学レベル(書籍やサイト、無料動画を利用)
    ※VBAエキスパート(Excelベーシック)取得
  • ビジネス:前職で自社開発の業務効率化ツールを活用するための社内募集にて、担当業務の効率化を提案した経験あり(開発者と定期的に話し合いツール作成。今までの工数を半分にできた。)

chatgptとは

chatgptとは_スクリーンショット 2023-06-01 072222.png

kaggleコンペのタイタニック問題とは

kaggleコンペのタイタニック問題とは_スクリーンショット 2023-06-01 072743.png

データ処理の工程

以下のような工程でデータ分析を進めていく。

  1. Kaggleからデータをダウンロードする。

  2. ダウンロードしたデータをもとに、最適化したモデルを作成する。

  3. 2.で作成したモデルをもとに、別のデータに対してモデルを適用することで生存しているかを予測する。

  4. 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の回答である。)

  1. Kaggleのウェブサイトにアクセスし、タイタニックのコンペティションページに移動します。

  2. ページ上部の"Data"セクションから、"Download All"を選択してデータセットをダウンロードします。これにより、トレーニングデータ(train.csv)とテストデータ(test.csv)が含まれるZIPファイルがダウンロードされます。

  3. ダウンロードしたZIPファイルを解凍し、必要なデータセット(train.csvおよびtest.csv)を取得します。

  4. Jupyter NotebookなどのPython環境を開き、必要なライブラリ(pandas、scikit-learnなど)をインポートします。

    import pandas as pd
    from sklearn.ensemble import RandomForestClassifier
    
  5. トレーニングデータを読み込みます。

    train_data = pd.read_csv('train.csv')
    
  6. データの前処理を行います。必要な特徴量を選択し、欠損値を補完し、カテゴリカル変数を数値化します。

    # 特徴量の選択
    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})
    
  7. モデルの訓練を行います。ここでは、ランダムフォレストを使用します。

    model = RandomForestClassifier(n_estimators=100, random_state=42)
    model.fit(X_train, y_train)
    
  8. テストデータを読み込み、同様の前処理を行います。

    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})
    
  9. 予測を行います。

    predictions = model.predict(X_test)
    
  10. 予測結果を提出用の形式に変換します。

    submission = pd.DataFrame({
        'PassengerId': test_data['PassengerId'],
        'Survived': predictions
    })
    
  11. 予測結果をCSVファイルとして保存します。

    submission.to_csv('submission.csv', index=False)
    
  12. Kaggleのコンペティションページにアクセスし、"Submit Predictions"または"Submit"を選択します。

  13. 提出フォームに必要事項を入力し、先ほど保存したsubmission.csvファイルをアップロードします。

  14. 提出ボタンをクリックして予測データを提出します。

以上がPythonを使用してKaggleのタイタニック問題に予測データを提出する手順です。この手順に従って実行することで、予測結果をKaggleに提出することができます。

上記chatgptの手順を進めていく上で困ったこと

手順6.について、以下のプログラミングを実行した時エラーが出た

▼プログラミング指示
スクリーンショット 2023-06-01 232715.png

▼エラー文(jupyter notebook)
スクリーンショット 2023-06-01 233224.png

▼そこで上記についてチャットにきいてみた。以下回答。データフレームが影響していたようだ。
スクリーンショット 2023-06-01 233558.png

▼上記のプログラミングで再度実行したら今度はエラー文は表示されなかったので引き続き7.の手順へ進む。

手順7.について、以下のプログラミングを実行した時エラーが出た

手順7のエラー_スクリーンショット 2023-06-02 001521.png

▼回答。モデルは数値データを扱うため、文字列データは扱えないとのこと。
手順7のエラーの回答_スクリーンショット 2023-06-02 001944.png

▼上記回答のプログラミングを実行するとエラー文は表示されなかったので、手順8.へ進む。
手順8のエラー文_スクリーンショット 2023-06-02 002732.png

手順8.エラー

▼エラー文
手順8のエラー文_スクリーンショット 2023-06-02 002732.png

▼回答。DataFrameのスライスのコピーに値を設定している影響が原因とのこと。
手順8のエラーの回答スクリーンショット 2023-06-02 003208.png

▼上記を実行すると再度エラー表示された。
手順8のエラーその2_スクリーンショット 2023-06-02 003615.png

▼再度回答。臨機応変な回答が出て驚いた。
手順8のエラーその2の回答_スクリーンショット 2023-06-02 003819.png

▼上記を実行すると、再度エラーが表示された。
手順8エラーの回答その3_スクリーンショット 2023-06-02 004401.png

▼回答。これは上記とは違うエラーだと思われる。特徴量の列が影響しているとのこと。
手順8エラーの回答その4_スクリーンショット 2023-06-02 004840.png

▼実行後、エラー。
手順エラーその四_スクリーンショット 2023-06-02 005430.png

▼回答。予測データセットで使用される特徴量の列がモデルの訓練時と異なっているとのこと。
手順8エラー回答その5_スクリーンショット 2023-06-02 005822.png

▼実行後、エラー表示はなかったので手順9.へ進む。

手順9.

▼エラー
[加工]手順9エラー_スクリーンショット 2023-06-02 011331.png

▼回答。モデルの訓練時に使用された特徴量が予測データセットに存在しないとのこと。
手順9エラーの回答_スクリーンショット 2023-06-02 011706.png

▼実行後、エラーが表示されなかったので、手順10.へ進む。

手順10.

▼実行後、エラー。
手順10のエラー_スクリーンショット 2023-06-02 012054.png

▼回答。predictionsという変数が定義されていないとのこと。
手順10エラーの回答_スクリーンショット 2023-06-02 012241.png

▼実行後、再度エラー。
[加工]手順10エラーその2_スクリーンショット 2023-06-02 013534.png

▼回答。モデルを学習する際に使用された特徴量の名前と、予測を行うために渡されたデータの特徴量の名前が一致していないとのこと
手順10エラーその2の回答_スクリーンショット 2023-06-02 012858.png

▼実行後、再度エラー。
[加工]手順10エラーその3_スクリーンショット 2023-06-02 013345.png

▼回答。指定したカラムが存在しないとのこと。
手順10のエラー3の回答_スクリーンショット 2023-06-02 014211.png

▼実行後、カラムを確認した。削除対象カラム名があるので実行する。
赤枠加工_カラム削除対象_スクリーンショット 2023-06-03 101837.png

▼実行後、エラーが表示されなかったので手順11.へ進む。

手順11.

▼エラー
スクリーンショット 2023-06-02 015601.png

▼回答
スクリーンショット 2023-06-02 015738.png

▼コード上段実行後、エラー
スクリーンショット 2023-06-02 015936.png

▼回答。先程の回答に誤りがあったので再度回答が得られたので実行する。
スクリーンショット 2023-06-02 020049.png

▼実行後、エラーが出なかったので、手順12.へ進む。

実行結果のファイルが生成されていなかったので質問した。以下回答。

スクリーンショット 2023-06-02 021422.png

▼実行後、エラー発生。
スクリーンショット 2023-06-02 021749.png

▼回答。model.predict() メソッドに渡された X_test_copy のデータ形式が正しくない可能性があるとのこと。
スクリーンショット 2023-06-02 021857.png

▼実行後、再度エラー。
スクリーンショット 2023-06-02 022203.png

▼回答。X_test_copy の特徴量の数が0であり、少なくとも1つの特徴量が必要であるということが原因のこと。
スクリーンショット 2023-06-02 022427.png

▼回答に今までのようなコードがなかったのでお願いしたら、教えてくれた。
スクリーンショット 2023-06-02 022729.png

▼実行後、エラー
スクリーンショット 2023-06-02 023005.png

▼回答
スクリーンショット 2023-06-02 023236.png

▼実行後、再度エラー
スクリーンショット 2023-06-02 023412.png

▼回答
スクリーンショット 2023-06-02 023545.png

▼実行後、再度エラー
スクリーンショット 2023-06-02 023815.png

▼回答。修正に漏れがあったとのこと。
スクリーンショット 2023-06-02 024120.png

▼実行後、再度エラー
スクリーンショット 2023-06-02 024229.png

▼回答
スクリーンショット 2023-06-02 024418.png

▼実行後、再度エラー
スクリーンショット 2023-06-02 024624.png

▼回答
スクリーンショット 2023-06-02 024827.png

▼実行後、再度エラー
スクリーンショット 2023-06-02 024942.png

(以降のやり取りは省略)

その後、チャットと何度もやり取りをし、以下の回答となった。

 データ前処理がポイントのようである。
スクリーンショット 2023-06-02 031655.png

▼その後も何度もやり取りし、やはりデータ前処理が必要と回答があり、その例が以下に提示された。

スクリーンショット 2023-06-02 033030.png

ここからは上記のコードを区分けして実行していく。

  • 欠損値の処理
  • カテゴリカルデータの変換
  • 特徴スケーリング
  • 不要なカラムの削除

まずは欠損値の処理についてのコードを実行する。

→エラー表示はなかった。

カテゴリカルデータの変換についてのコードを実行する。

→エラー表示はなかった。

特徴スケーリングについてのコードを実行する。

→エラー表示はなかった。

スケーリングした特徴量を元のデータフレームに戻すについてのコードを実行する。

→エラー表示はなかった。

不要なカラムの削除についてのコードを実行する。

→エラー表示された。ここに問題があるのがわかった。
スクリーンショット 2023-06-02 053746.png

▼回答。削除する必要があるカラムを判断しなければならないようだ。
スクリーンショット 2023-06-02 054245.png

▼テストデータのカラムリストは以下である。これらから不要なカラムを削除するか判断する必要がある。

['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)

上記コード実行後、エラー表示されなかった。

▼続きの処理をチャットで仰いだ。以下回答。
スクリーンショット 2023-06-02 061458.png

▼実行後、エラー表示がなかったので次の処理を仰いだ。以下回答。
スクリーンショット 2023-06-02 061858.png

▼上記、上段のコード実行後エラー発生。
※以後エラー文表示は処理時間効率を考え掲載は省略。

▼以下、回答
スクリーンショット 2023-06-02 062219.png

▼上記、上段のコードは実行成功。下段はエラー発生。

▼回答
スクリーンショット 2023-06-02 062652.png
スクリーンショット 2023-06-02 062718.png

▼上記、手順1.成功。

▼手順2.エラー発生

▼修正コードの回答をもらい再度実行。エラーなし。

▼手順3.を実行。成功。

▼手順4.を実行。→エラー発生

▼回答。
スクリーンショット 2023-06-02 063808.png

▼上記、手順1.を実行→エラー発生。

▼回答
スクリーンショット 2023-06-02 064200.png

▼先ほどのカラム削除コードを使いコードを実行してみる。既に'Ticket'と'Cabin'のカラムが削除されているので'PassengerId'のみ削除する。

X_test_copy.drop(['PassengerId'], axis=1, inplace=True)

▼上記、コード成功した。次の処理を仰いだ。

▼回答
スクリーンショット 2023-06-02 065241.png

▼上記、手順1.を実行する。→エラー発生

(以降のやり取り省略)

どうやらスケーリングが必要らしい。

スクリーンショット 2023-06-02 073245.png

▼今度は、ChatGPTは今までの質問、回答の流れがあり途絶えるのがこわかったので、Bing AIで以下聞いた。

スケーリングを行う「正規化」について、タイタニックデータを扱うpythonコード

スクリーンショット 2023-06-02 073552.png

▼上記コード実行。→エラー発生。このコードをChatGPTへ確認し修正コードを教えてもらう。
スクリーンショット 2023-06-02 074318.png

▼以下がAgeとFareの正規化されたデータの一部分。
スクリーンショット 2023-06-02 074413.png

【正規化前】
スクリーンショット 2023-06-02 074836.png

▼次に標準化を行う。
再度Bing AIで以下聞いたコード→エラー出なかった。

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df[['Age', 'Fare']] = scaler.fit_transform(df[['Age', 'Fare']])

(以降のやり取り省略)

なぜkaggleのタイタニックのtest.csvにはなぜSurvived列がないのか。

▼以下、Bing AIの回答。ネットでも検索したが似たような内容であった。
スクリーンショット 2023-06-02 080732.png

▼上記の内容をChatGPTへ提供してみたら以下の回答があった。
スクリーンショット 2023-06-02 081212.png

以下の壁にぶつかっている。以下はChatGPTの回答。

X_test_encodedデータフレームに'Sex_female'と'Sex_male'の列が存在することを確認してください。もし存在しない場合は、データの前処理の段階でエンコーディングや特徴量の選択の手順に誤りがある可能性があります。必要な列を> 追加または修正する必要があります。

▼存在していなかったということはデータの前処理の段階で誤りがあったということ。

'Sex_female'と'Sex_male'の列が存在しません。

(以降のやり取り省略)

ようやく提出データ作成が完了した

スクリーンショット 2023-06-02 100336.png

スクリーンショット 2023-06-02 100507.png

ChatGPTのやり取りは数えきれないほど行い、途中で諦めようかと思うほどであった。
しかし、作成できてホッとした。精度どころか提出データ作成まで辿り着けないかと途中はとても不安になった。
恥ずかしい話である。

kaggleへ提出してみる

▼結果は「0.37799」と散々であった。
スクリーンショット 2023-06-02 100904.png

▼ChatGPTに上記の結果を報告したら以下の回答をもらった。今後はこちらを参考にスキル向上を目指したい。
スクリーンショット 2023-06-02 101816.png

今回で得られたもの

  • データ処理の重要さ(特にスキル習得度)

機械学習のスキルがあってこそChatGPTを上手く活用できるのだと痛感した。

所感

ChatGPTで教えてもらった指示で進めて行けば比較的簡単に処理が終ると思っていたが、予想以上にエラーが発生し大変であった。
実際に手入力でのプログラミング、そしてエラー対処をする作業を想像すると想像しきれないほど相当の大変さがあるのだと感じた。

現状は、補足として自分でネット等で調べる必要がある。たとえばkaggleのタイタニックデータのダウンロード方法はChatGPTの回答だけ見て行うのは難しく感じた。さらにChatGPTの回答精度が上がると作業効率化が上がると感じた。
また、ChatGPTへの質問の仕方にも気を付けなければいけない。大体は詳細な回答がかえってくるが、たまに自らすすんで詳細な回答を求めないと反応してくれない時があった。なので、質問の仕方にも気を付ける必要がある。

しかし、ChatGPTの回答によるコードをコピーし、jupyterへ貼り付けるだけで実行できることは、かなりの効率化であると感じた。初学者レベルの私でもコードを手入力する大変さを知っているので、これはかなりの利便性があるし、ここから業務の成果へ貢献するための効率化ができるであろうと感じた。

もちろん、プログラミングスキルや機械学習の知識/スキルがなければ、これらを扱えないので知識/スキル、さらに経験は必要である。今回でいえばエラー文が表示された時、対処できる知識/スキルがないと正しい処理ができない可能性が出てくる。今回はエラーが出てもなんとか対処はできたが(初学者なりに)、やはりしっかりとした知識/スキルがなければ業務レベルの仕事はできないと感じた。
逆に言えば、ChatGPTを上手く活用できるのなら、初学者/未経験の私にとって強力な武器/希望の星になり得ると感じた。

今回、ChatGPTを活用しPythonやJupyter Notebookで機械学習、Kaggleへの挑戦ができたことは大きな収穫であった。
結果は散々ではあったが、経験した価値はあると思う。

おわりに

あまりに酷い結果だったので、次回(次回の記事はこちら)はハンズオン形式のPythonを使ったkaggleコンペ(タイタニック問題)に挑戦したい。
現状では前回記事で挑戦したPrediction Oneを使った方が遥かに精度がよいことがわかった。
初学者である私の現状では、ChatGPTをメインに使うのではなくPrediction OneなどAutoML(自動機械学習)ツールをメインに使い、補助的に使うのがよいと思った。

参考

https://blog.kikagaku.co.jp/python-import

0
2
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
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?