📝

Code interpreterを使ってプロンプトのみで機械学習を行う

2023/07/18に公開

TL; DR

Code Interpreterを使うと、次の二つのプロンプトとデータセットをアップロードするだけで、EDA、欠損値処理、分布の変換、カテゴリ変数の変換、データの分割、学習、評価と一通りの機械学習を解説付きでやってくれた。

このデータは機械学習の練習によく用いられるカリフォルニアの住宅価格データセットです。このデータセットから住宅価格を予測するモデルを構築し、住宅の条件に合わせた適切な住宅価格を設定したいと思っています。では、まず何を始めたらいいでしょうか?

では次に何をしたらいいですか?

はじめに

先日、ChatGPTの新機能としてCode Interpreterという機能のβ版がリリースされました。
これまでのChatGPTではテキストに対する応答でしたが、
Code Interpreterによりユーザーが実際にコードを書いて実行することを可能にし、AIとの対話をより具体的で実用的になったようです。

今回のブログでは、このCode Interpreterを用いて、どのようにして機械学習を行えるのかを実際に体験してみます。具体的には、ユーザーの質問に対してAIがコードを生成し、それを実行して結果を提供するという流れを紹介します。さてどうなるでしょうか・・・

今回の題材と条件

  • データセット:カリフォルニアの住宅価格データセット
    • もはや古典ともなったボストンの住宅価格データセットはいろいろと問題があるので、
      代わりにカリフォルニアの住宅価格データセットを使います。
  • LLM:GPT-4 (CharGPT)

やりとり1:まずはデータを渡してみる

プロンプト1

このデータは機械学習の練習によく用いられるカリフォルニアの住宅価格データセットです。このデータセットから住宅価格を予測するモデルを構築し、住宅の条件に合わせた適切な住宅価格を設定したいと思っています。では、まず何を始めたらいいでしょうか?

(回答は長いので、区切りのいいところで分割しています)

回答1-1:データの読み込みと全体像の確認

まず、データを理解することから始めましょう。次のステップは次のとおりです:

データの読み込み:まず、アップロードされたデータを読み込みます。
探索的データ分析 (EDA):データの概要を把握し、各特徴の分布や相関関係を調べます。
データの前処理:欠損値の処理、カテゴリ変数のエンコーディング、特徴量のスケーリングなど、モデルがよりよく学習できるようにデータをクリーニングします。
モデルの訓練と評価:いくつかの機械学習モデルを訓練し、その性能を評価します。最も性能が良いモデルを選びます。
それでは、最初のステップとして、データを読み込んでみましょう。

データセットは以下の特徴量を含んでいます:

longitude:経度
latitude:緯度
housing_median_age:住宅の中央値年齢
total_rooms:部屋の総数
total_bedrooms:寝室の総数
population:人口
households:世帯数
median_income:収入の中央値
median_house_value:住宅価格の中央値(これが我々の予測ターゲットとなる)
ocean_proximity:海への近接性

回答1-2:EDA

次に、データの探索的分析 (EDA) を行います。このステップでは、データの分布や特徴量間の関係を理解します。また、欠損値や異常値の存在をチェックします。それでは始めてみましょう。

データセットは以下の特徴量を含んでいます:

longitude:地理的な情報。
latitude:地理的な情報。
housing_median_age:地域の住宅の年齢の中央値。
total_rooms:地域の部屋数の合計。
total_bedrooms:地域のベッドルーム数の合計。
population:地域の人口。
ocean_proximity:地域が海に近いかどうか。
median_income:地域の所得の中央値。
これらの特徴量は、住宅価格の推定に有用な情報を提供します。

データの全体的な特徴を理解するために、次のステップは、データの探索的解析を行うことです。これには、個々の特徴量の分布を確認するためのヒストグラム、および各特徴量間の関係を確認するための散布図行列(scatterplot matrix)を作成します。

また、各特徴量の分布を調べることで、その特徴量が正常な分布を持っているか、またはいくつかの外れ値を持っているかを確認することができます。この情報は、特徴量のスケーリングや変換に役立ちます。

やりとり2:続きを解析してもらう

プロンプト2

では次に何をしたらいいですか?

回答2-1:EDAの続きの段取りの提示

データの探索的分析を深めるために、次に以下のステップを行います:

1. **欠損値の確認**:データに欠損値があるかどうかを確認し、それらを適切に処理します。ここでは、'total_bedrooms'に欠損値があることがわかっています。
2. **カテゴリ変数の確認**:カテゴリ変数(ここでは'ocean_proximity')の各カテゴリの頻度を確認します。
3. **相関の確認**:各特徴量が目的変数('median_house_value')とどの程度相関しているかを確認します。これは、特徴量が目的変数をどの程度説明できるかの指標となります。
4. **データの可視化**:データの分布や特徴量間の関係を理解するために、ヒストグラムや散布図を作成します。

回答2-2:欠損値の確認と補完

それでは、これらのステップを進めていきましょう。まずは欠損値の確認から始めます。

'total_bedrooms' の列に 207 の欠損値が存在しています。これらの欠損値を適切に処理する方法はいくつかありますが、一般的な方法は以下の通りです:

1. **欠損値を持つ行を削除する**:これは最も簡単な方法ですが、欠損値がランダムに分布していない場合(つまり、欠損が何らかのパターンを持つ場合)や、欠損値が多い場合には適していません。これらの場合、この方法を使用すると、重要な情報が失われる可能性があります。

2. **欠損値を補完する**:欠損値を他の値で置き換えます。最も一般的な補完方法は、平均(mean)、中央値(median)、最頻値(mode)などの統計的な指標を使用する方法です。これらの方法は欠損値がランダムに分布している場合に最も適しています。

3. **予測モデルを使用する**:他の特徴量を基に欠損値を予測するモデルを訓練することも可能です。これは他の方法に比べて時間とリソースが必要ですが、欠損がランダムに分布していない場合や欠損が多い場合には有効な方法です。

それでは、ここでは最も一般的でシンプルな方法である中央値による補完を行いましょう。この方法は外れ値の影響を受けにくいため、'total_bedrooms' のような右に歪んだ分布を持つ特徴量に適しています。

'total_bedrooms' の欠損値が中央値で補完され、データセットにはもう欠損値が存在しません。

回答2-3:カテゴリ変数の分布の確認

次に、カテゴリ変数 'ocean_proximity' の各カテゴリの頻度を確認します。これにより、各カテゴリがデータセット内でどれだけ頻繁に現れるかを理解することができます。それでは、カテゴリの頻度を確認してみましょう。

'ocean_proximity' の各カテゴリは次のように分布しています:

1. **<1H OCEAN**:9136 件
2. **INLAND**:6551 件
3. **NEAR OCEAN**:2658 件
4. **NEAR BAY**:2290 件
5. **ISLAND**:5 件

この情報は、各カテゴリがどれだけデータセットに対して代表的であるかを理解するのに役立ちます。

回答2-4:相関の確認

次に、各特徴量が目的変数('median_house_value')とどの程度相関しているかを確認します。これは、特徴量が目的変数をどの程度説明できるかの指標となります。それでは、特徴量の相関を確認してみましょう。

'median_house_value'と他の特徴量との相関は以下のようになっています:

- 'median_income' は正の相関が最も高く(約0.69)、収入の中央値が高い地域では住宅価格も高い傾向があることを示しています。
- 'total_rooms' と 'housing_median_age' も正の相関を示していますが、これらの特徴量は 'median_income' ほど強くはありません。
- 'latitude' は負の相関を示しており、これは北に行くほど住宅価格が低くなる傾向があることを示しています。

回答2-5:変数の分布の確認

次に、これらの特徴量間の関係をさらに理解するために、データの可視化を行います。具体的には、各特徴量のヒストグラムと、'median_house_value'と最も相関が高い特徴量('median_income')との散布図を作成します。これにより、データの分布や特徴量間の関係をより具体的に把握することができます。それでは、可視化を行ってみましょう。

ヒストグラムから、いくつかの特徴量が右に歪んだ分布を持っていることがわかります(例:'median_income', 'total_rooms', 'total_bedrooms', 'population')。これらの特徴量は、前処理の段階で対数変換をすることで、正規分布に近づけることができます。

また、'median_house_value' のヒストグラムを見ると、最大値付近(500,000ドル)で値が大きく上昇していることがわかります。これは、データセットが500,000ドル以上の住宅価格を全て500,000ドルとしてクリップ(上限値を設定)しているためです。このようなクリップされた値は、モデルが高価格帯の住宅価格を正確に予測することを難しくする可能性があります。

次に、'median_income'と'median_house_value'の散布図を見ると、これら二つの特徴量間には明確な正の相関があることがわかります。つまり、収入が高い地域ほど住宅価格が高い傾向があります。ただし、上述のように、'median_house_value'が500,000ドルでクリップされているため、この価格以上の住宅価格については正確な相関関係を把握することが難しいです。

以上の情報を元に、次のステップはデータの前処理を行うことです。具体的には以下の処理を行います:

1. **特徴量エンコーディング**:カテゴリ変数 'ocean_proximity' を数値に変換します。
2. **特徴量スケーリング**:各特徴量が異なるスケールを持っているため、これらの特徴量を同じスケールに揃えます。これにより、モデルの学習が容易になります。

回答2-6:特徴量の作成

それでは、これらの前処理を行っていきましょう。まずは特徴量エンコーディングから始めます。

'ocean_proximity' というカテゴリ変数は One-hot エンコーディングによって数値に変換され、新たな特徴量 'ocean_proximity_<1H OCEAN'、'ocean_proximity_INLAND'、'ocean_proximity_ISLAND'、'ocean_proximity_NEAR BAY'、'ocean_proximity_NEAR OCEAN' としてデータセットに追加されました。

次に、特徴量のスケーリングを行います。これは、各特徴量が異なるスケールを持っているため、これらの特徴量を同じスケールに揃えることで、モデルの学習が容易になります。ここでは、最小最大スケーリング(Min-Max Scaling)を使用します。この方法は特徴量の範囲を [0, 1] に変換します。

特徴量のスケーリングは、特徴量のスケールがモデルの性能に大きな影響を与える一部の機械学習アルゴリズム(例えば、線形回帰、ロジスティック回帰、サポートベクターマシンなど)で重要となります。しかし、ここではランダムフォレストや勾配ブースティングなどの決定木ベースのモデルを使用する予定であるため、特徴量のスケーリングは必須ではありません。そのため、このステップは省略します。

回答2-5:モデルの作成

これで、データは機械学習モデルの訓練に使用できる状態になりました。次のステップは、訓練データとテストデータに分割し、モデルの訓練を開始することです。それでは、データの分割を行いましょう。

データは訓練セット(16512サンプル)とテストセット(4128サンプル)に分割されました。これらのデータを使用して、機械学習モデルの訓練と評価を行います。

一般的な戦略としては、複数の機械学習アルゴリズムを試し、それぞれのモデルの性能を評価します。このプロセスを通じて、最も性能の良いモデルを選択します。ここでは、以下の2つのアルゴリズムを試します:

1. **ランダムフォレスト**:ランダムフォレストはアンサンブル学習アルゴリズムの一つで、多数の決定木を訓練し、それらの予測を平均化(回帰の場合)または多数決(分類の場合)して予測を行います。ランダムフォレストは一般的に強力で、過学習に対して比較的ロバストです。

2. **勾配ブースティング**:勾配ブースティングもアンサンブル学習アルゴリズムの一つで、弱い予測モデル(通常は決定木)を逐次的に訓練し、それらの予測を組み合わせて強い予測モデルを作ります。勾配ブースティングはパラメータの設定に敏感ですが、適切に設定された場合には非常に高い性能を発揮します。

それでは、これらのモデルの訓練と評価を行いましょう。まずはランダムフォレストから始めます。

ランダムフォレストモデルの訓練セットに対する RMSE(Root Mean Square Error、平均二乗誤差の平方根)は約18,077で、テストセットに対する RMSE は約48,978です。

これは、モデルが訓練データに対しては非常に良い性能を示していますが、テストデータに対しては性能が低下していることを示しています。これは過学習(overfitting)の典型的な兆候で、モデルが訓練データに過度に適合してしまい、新しいデータ(ここではテストデータ)に対する予測性能が低下してしまう現象を指します。

こ

途中で回答が切れました。

感想

EDAから欠損値処理、分布の変換、データの分割、モデルの学習と想像以上にきちんと解析してくれている印象でした。少なくとも通り一辺倒の解析であれば、基本的なツボを押さえつつ完全に自然言語のみで機械学習することは可能そうです。

すごい世界だ・・・。

Discussion