目次
- イントロダクション
1.1 前回の結果
1.2 上手く行かなかった原因に対する仮説 - 事前準備
2.1 ライブラリのインストールとOpenAI APIの設定
2.2 データセットの準備 - ランダムフォレストの予測モデルを作成してみる 再挑戦
3.1 Memory機能を実装する
3.2 ChatGPTに順番に指示を与える - 上手くいった要因の検証
- まとめ
1. イントロダクション
1.1 前回の結果
前回のブログでは、LangChainからChatGPT APIを呼び出して、自然言語からランダムフォレストのコードの生成・実行を試してみました。
以下のように指示を投げたところ、APIの繰り返し実行回数の上限に達してしまい、上手くいきませんでした。
■python
text=""" 生存したかどうかを、RandomForestで予測してください。 生存したかどうかは、変数Survivedです。1なら生存、0なら死亡です。 入力データセットはdfです。 データセットを訓練用とテスト用に分割してください。データセットの70%を訓練用、30%をテスト用としてください。 訓練用データセットを使って予測モデルを作成し、テスト用データセットを使って予測精度を計算してください。 予測精度は、AUCを計算してください。 """ agent.run(text)
'Agent stopped due to iteration limit or time limit.'
1.2 上手く行かなかった原因に対する仮説
前回の実行結果を確認すると、生成するコードが複雑なため、コードの実行・修正を内部で繰り返しているうちにAPIの繰り返し実行回数の上限に達してしまっていたことがわかります。
この結果から、コードを繰り返し施行する回数が増えて、実行回数の上限に達してしまった原因として、以下の仮説が考えられます。
- 一度の指示で、多くの情報を投げてしまったため
- 曖昧な指示を投げてしまったため
上記の仮説を元に以下のように実行方法を改善してみます。
- LangChainのMemory機能を利用して、情報を小分けにして与える。
- 予測モデルを作成するときの手順をより詳細に書くようにする。
2. 事前準備
2.1 ライブラリのインストールとOpenAI APIの設定
まずは、LangChainでOpenAIのAPIを使用する手順に従って、langchainのインストール、OpenAIのAPIキーの発行と設定を行います。
※ 以前に上記の設定をしている場合、この手順はスキップして構いません。
2.2 データセットの準備
前回のブログと同様、タイタニックデータセットを使用します。
3. ランダムフォレストの予測モデルを作成してみる 再挑戦
3.1 Memory機能を実装する
前回も使用したcreate_pandas_dataframe_agentに、メモリを追加します。メモリを追加するには、ConversationBufferMemoryを使います。
■python
from langchain.memory import ConversationBufferMemory # メモリの設定 memory = ConversationBufferMemory(memory_key='chat_history') # データフレームを操作するエージェントの作成 agent = create_pandas_dataframe_agent( OpenAI(temperature=0, max_tokens=1000), df, verbose=True, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, memory=memory, )
3.2 ChatGPTに順番に指示を与える
順番にデータフレームに関する情報を与えます。
まずは、型を調べます。
■python
agent.run("dfの各列の型を表示してください。")
次に、データセットを訓練とテストに分割する方法を返してもらいます。
■python
入力データセットはdfです。 dfを訓練用とテスト用に分割してみてください。データセットの70%を訓練用、30%をテスト用としてください。 生存したかどうかの目的変数は、変数Survivedです。1なら生存、0なら死亡です。 最後に、実行したpythonコード全体を返してください。 """ )
モデルを作成するために、以下のように指示を出します。今回はランダムフォレストの予測モデルを作成することができました。予測精度も自動で計算することができ、AUCが0.837という結果が得られました。
■python
agent.run(""" RandomForestで予測をするクエリを作成してください。 入力データセットはdfです。 生存したかどうかは、変数Survivedです。1なら生存、0なら死亡です。 1. Object型の列を削除してください。 2. dfを訓練用とテスト用に分割してください。データセットの70%を訓練用、30%をテスト用としてください。 3. 訓練用データセットを使って予測モデルを作成し、テスト用データセットを使って予測精度を計算してください。 4. 予測精度は、AUC_ROCを計算してください。 結果のAUC_ROCを返したあとに、実行したpythonコード全体を返してください。 """ )
最後に、インポータンスを描画させます。
■python
# インポータンスを計算する agent.run(""" RandomForestの予測結果に対して、各特徴量の重要度を計算してください。 各特徴量の重要度を棒グラフで描画してください。 RandomForestを予測するPythonコードは以下を参考にしてください。 The python code to generate this result is:\n\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.impute import SimpleImputer\n\n# remove object type columns\ndf = df.select_dtypes(exclude=['object'])\n\n# split data into training and test sets\nX = df.drop('Survived', axis=1)\ny = df['Survived']\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n\n# fill in missing values\nimputer = SimpleImputer(strategy='mean')\nX_train = imputer.fit_transform(X_train)\nX_test = imputer.transform(X_test)\n\n# create a prediction model using the training set\nmodel = RandomForestClassifier(random_state=42)\nmodel.fit(X_train, y_train)\n\n# calculate the AUC_ROC using the test set\ny_pred = model.predict_proba(X_test)[:,1]\nauc_roc = roc_auc_score(y_test, y_pred) """ )
4. 上手くいった要因の検証
「メモリ機能を使って情報をあたえること」と「予測手順の指示を具体的に書く」の2点を変更したところ、予測モデルを上手く作成することができました。
ここでは、前回上手く行かなかった要因に対する以下の2つの仮説のうち、どちらに問題があったかを特定します。
- 一度の指示で、多くの情報を投げてしまったため
- 曖昧な指示を投げてしまったため
どちらが原因であるかを特定するために、「メモリ機能を使わず、予測手順の指示を具体的に書く」を試してみます。
■python
# エージェントの作成 agent = create_pandas_dataframe_agent( OpenAI(temperature=0, max_tokens=1000), df, verbose=True, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, ) agent.run(""" RandomForestで予測をするクエリを作成してください。 入力データセットはdfです。 生存したかどうかは、変数Survivedです。1なら生存、0なら死亡です。 1. Object型の列を削除してください。 2. dfを訓練用とテスト用に分割してください。データセットの70%を訓練用、30%をテスト用としてください。 3. 訓練用データセットを使って予測モデルを作成し、テスト用データセットを使って予測精度を計算してください。 4. 予測精度は、AUC_ROCを計算してください。 結果のAUC_ROCを返したあとに、実行したpythonコード全体を返してください。 """ )
その結果、メモリ機能を使わなくても実行することができました。この結果から、ChatGPTが上手く予測モデルを作成できなかった原因は、「曖昧な指示を投げてしまったこと」であることがわかります。
5. まとめ
前回のブログと今回の結果から、LLMに指示を出す際には、手順を明確かつ具体的に記述することが重要であることがわかりました。