GPT-3.5 vs GPT-4 【有名データセットの機械学習編】

## はじめに
本記事では、有名データセットを用いた機械学習に関して、GPT3.5とGPT4の比較を行います。ChatGPTの有料プラン（[ChatGPT Plus](https://openai.com/blog/chatgpt-plus)）に課金するか迷っている方の参考になれば嬉しいです。
また、機械学習を学び始めた初学者の方向けの機械学習のサンプルコードとしても使用していただければ嬉しいです。


一般的には、GPT3.5と比較してGPT4は、下記の違いがあると言われています。
* 1．GPT-4 vs GPT-3.5：創造性
* 2．GPT-4 vs GPT-3.5：画像入力（ビジュアル入力）
* 3．GPT-4 vs GPT-3.5：より安全な応答
* 4．GPT-4 vs GPT-3.5：応答の事実性
* 5．GPT-4 vs GPT-3.5：コンテキスト・ウィンドウ

参考：[Chat GPT-4 vs GPT-3.5｜5つの大きな違いとは？](https://www.lifehacker.jp/article/2303gpt-tb-4-vs-gpt-35-differences-explained/)


##### GPT-3.5 vs GPT-4 【料理のレシピ編】
本題に入る前に、料理のレシピについて聞いてみました。GPT3.5は箇条書きで返すだけでしたが、GPT4は手順や材料の分量まで丁寧に教えてくれました。GPT4の凄さがわかります。

GPT3.5 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/570f75eb-79f3-1d12-a852-a37beb7744a6.png)


GPT4
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/c48b78aa-d24d-0cc5-64fb-311f0942823b.png)



##### 機械学習における有名データセット
本記事では4つの有名データセットを使用します。

以下は、Titanic、Iris、Boston house prices、Digitsデータセットを比較した表です。それぞれのデータセットの特徴や使用される特徴量、クラス数、使用される機械学習タスクなどを示しています。

| データセット | 特徴 | クラス数 | 使用される特徴量 | 使用される機械学習タスク |
| --- | --- | --- | --- | --- |
| Titanic | 乗客の情報（年齢、性別、乗船クラスなど）と生存したか否か | 2 | Pclass, Sex, Age, Fare | 分類 |
| Iris | アヤメの花の情報（萼片の長さ、萼片の幅、花びらの長さ、花びらの幅）と品種 | 3 | sepal_length, sepal_width, petal_length, petal_width | 分類 |
| Boston house prices | ボストン市内の物件価格の情報（犯罪率、部屋数、教師あたりの生徒数など） | - | CRIM, ZN, INDUS, CHAS, NOX, RM, AGE, DIS, RAD, TAX, PTRATIO, B, LSTAT | 回帰 |
| Digits | 手書き数字の画像とその数字 | 10 | ピクセルの明るさ | 分類、画像認識 |

それぞれのデータセットは異なる特徴を持っており、異なる機械学習タスクに使用されます。
Titanicデータセットは、乗客の情報と生存したか否かを予測する分類タスクに使用されます。
Irisデータセットは、アヤメの花の情報と品種を予測する分類タスクに使用されます。
Boston house pricesデータセットは、ボストン市内の物件価格の情報を用いて、回帰タスクに使用されます。
Digitsデータセットは、手書き数字の画像とその数字を予測する分類または画像認識タスクに使用されます。
また、Boston house pricesデータセットとDigitsデータセットは、連続的な数値データを扱う回帰タスクと、離散的なピクセルデータを扱う分類または画像認識タスクという点で異なっています。

##### ChatGPTに入力するプロンプト
ChatGPTに入力するプロンプトは下記のフォーマットを使用します。

```python:プロンプト
{データセット名}を用いた機械学習のサンプルコードを書いてください
```

## 1. Titanic datasets（タイタニックデータセット）
Titanic datasets（タイタニックデータセット）は、1912年に起こったタイタニック号の沈没事故に関するデータセットです。このデータセットは、機械学習の分野で非常に有名であり、特に分類問題の入門例としてよく使用されます。タイタニックデータセットには、乗客の情報（年齢、性別、チケットのクラス、乗船した港など）と、その乗客が事故で生き残ったかどうかが含まれています。

機械学習の目的は、タイタニックデータセットを用いて、乗客の属性情報から生存（Survived）か死亡（Not Survived）を予測する分類モデルを構築することです。このデータセットを用いることで、データの前処理、特徴量エンジニアリング、モデルの選択、ハイパーパラメータのチューニング、評価指標の選択など、機械学習の基本的なスキルを学ぶことができます。

タイタニックデータセットは、Kaggleというデータサイエンスコンペティションプラットフォームで提供されており、以下のリンクからダウンロードすることができます。

https://www.kaggle.com/c/titanic/data

### GPT3.5

Titanicデータセットは、乗客の情報を含むデータセットで、生存者と非生存者を予測する二値分類問題として扱うことができます。以下は、Titanicデータセットを使用して、生存者の予測を行う機械学習のサンプルコードです。

```python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# Load the Titanic dataset
titanic_data = pd.read_csv('titanic.csv')

# Remove the 'Name', 'Ticket', and 'Cabin' columns
titanic_data = titanic_data.drop(['Name', 'Ticket', 'Cabin'], axis=1)

# Fill in missing values in the 'Age' column with the median age
titanic_data['Age'] = titanic_data['Age'].fillna(titanic_data['Age'].median())

# Convert 'Sex' to binary values
titanic_data['Sex'] = titanic_data['Sex'].map({'female': 0, 'male': 1})

# Convert 'Embarked' to binary values and fill in missing values with the mode
titanic_data['Embarked'] = titanic_data['Embarked'].fillna(titanic_data['Embarked'].mode()[0])
titanic_data['Embarked'] = titanic_data['Embarked'].map({'S': 0, 'C': 1, 'Q': 2})

# Split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(titanic_data.drop(['Survived'], axis=1),
                                                    titanic_data['Survived'],
                                                    test_size=0.3,
                                                    random_state=42)

# Train a Random Forest model on the training data
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)

# Make predictions on the test data
y_pred = rf_model.predict(X_test)

# Calculate the accuracy of the predictions
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: {:.2f}%".format(accuracy*100))
```

このコードでは、Titanicデータセットを読み込み、必要な前処理を行った後、ランダムフォレストモデルをトレーニングし、テストデータを使用して予測を作成します。前処理には、以下の処理を行っています。

- 不要な列（'Name'、'Ticket'、'Cabin'）を削除する
- 'Age'の欠損値を中央値で埋める
- 'Sex'をバイナリ値に変換する
- 'Embarked'をバイナリ値に変換し、欠損値を最頻値で埋める

これらの前処理により、データをモデルに適した形式に変換しています。最後に、ランダムフォレストモデルをトレーニングし、テストデータを使用して予測を作成します。そして、正解テストデータの予測結果と正解ラベルを比較して、予測の正確性を測定しています。このコードでは、ランダムフォレストモデルを使用して予測を行っていますが、他の分類モデルを使用することもできます。

また、より高度な機能を実装することもできます。たとえば、グリッドサーチを使用して、モデルのハイパーパラメータを最適化することができます。さらに、アンサンブル学習を使用して、複数のモデルの予測を組み合わせることもできます。


### GPT4



このサンプルコードは、Pythonと主要な機械学習ライブラリであるscikit-learnを使用しています。また、データセットはKaggleのTitanicデータセットを使用しています。このデータセットは、タイタニック号の乗客の情報を含んでおり、機械学習モデルを使って生存者を予測します。

まず、必要なライブラリをインポートします：

```python
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix
```

データセットを読み込み、前処理を行います：

```python
# データを読み込む
train_data = pd.read_csv("train.csv")
test_data = pd.read_csv("test.csv")

# 欠損値を埋める
train_data['Age'].fillna(train_data['Age'].median(), inplace=True)
train_data['Embarked'].fillna(train_data['Embarked'].mode()[0], inplace=True)

# カテゴリ変数を数値化
train_data['Sex'] = train_data['Sex'].map({'male': 0, 'female': 1})
train_data['Embarked'] = train_data['Embarked'].map({'S': 0, 'C': 1, 'Q': 2})

# 不要なカラムを削除
drop_columns = ['Name', 'Ticket', 'Cabin', 'PassengerId']
train_data = train_data.drop(drop_columns, axis=1)

# データを分割
X = train_data.drop("Survived", axis=1)
y = train_data["Survived"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
```

データを標準化し、モデルに適用します：

```python
# データを標準化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# ロジスティック回帰モデルを作成
model = LogisticRegression()
model.fit(X_train, y_train)

# 予測と評価
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)

print("Accuracy: ", accuracy)
print("Confusion Matrix: \n", conf_matrix)
```

このサンプルコードは、タイタニック号の乗客データを使って生存者を予測するロジスティック回帰モデルを作成しています。データセットは前処理され、不要なカラムが削除され、カテゴリ変数が数値化されています。最後に、データを標準化し、モデルを適用して予測を行い、精度と混同行列を出力して評価しています。



次のステップとして、このモデルを改善するために以下のことができます。

1.特徴量エンジニアリング：新しい特徴量を作成し、既存の特徴量をより効果的に表現できるかどうかを評価します。例えば、家族のサイズや敬称などの特徴量を作成することができます。

```python
# タイトルの抽出
train_data['Title'] = train_data['Name'].str.extract(' ([A-Za-z]+)\.', expand=False)
train_data['Title'] = train_data['Title'].replace(['Lady', 'Countess', 'Capt', 'Col', 'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
train_data['Title'] = train_data['Title'].replace('Mlle', 'Miss')
train_data['Title'] = train_data['Title'].replace('Ms', 'Miss')
train_data['Title'] = train_data['Title'].replace('Mme', 'Mrs')
title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Rare": 5}
train_data['Title'] = train_data['Title'].map(title_mapping)

# 家族サイズの特徴量を作成
train_data['FamilySize'] = train_data['SibSp'] + train_data['Parch'] + 1
```

2.ハイパーパラメータチューニング：ロジスティック回帰のハイパーパラメータを調整し、モデルの性能を向上させることができます。例えば、`C`パラメータを調整することで正則化の強度を変更することができます。

```python
from sklearn.model_selection import GridSearchCV

# パラメータグリッドを定義
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]}

# グリッドサーチを実行
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)

# 最適なパラメータを使用してモデルを再訓練
best_model = grid_search.best_estimator_
best_model.fit(X_train, y_train)

# 予測と評価
y_pred = best_model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)

print("Best Parameters: ", grid_search.best_params_)
print("Accuracy: ", accuracy)
print("Confusion Matrix: \n", conf_matrix)
```

3.他の分類アルゴリズムを試す：ロジスティック回帰以外の機械学習アルゴリズム（ランダムフォレスト、SVM、XGBoostなど）を試して、最適なモデルを見つけることができます。異なるアルゴリズムは、データセットの異なる特徴を捉えるため、異なる性能を発揮することがあります。

```python
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from xgboost import XGBClassifier

# クラス分類モデルのリストを作成
models = [
    {"name": "Random Forest", "model": RandomForestClassifier(random_state=42)},
    {"name": "SVM", "model": SVC(random_state=42)},
    {"name": "XGBoost", "model": XGBClassifier(random_state=42)}
]

# 各モデルの性能を評価
for m in models:
    m["model"].fit(X_train, y_train)
    y_pred = m["model"].predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    conf_matrix = confusion_matrix(y_test, y_pred)
    
    print(f"{m['name']} Accuracy: ", accuracy)
    print(f"{m['name']} Confusion Matrix: \n", conf_matrix)
```

4.アンサンブル学習：複数のモデルを組み合わせて、より正確な予測を行うことができるアンサンブル学習を試すことができます。例えば、バギング、ブースティング、スタッキングなどの手法を用いることができます。

5.クロスバリデーション：モデルの性能評価にクロスバリデーションを使用することで、より信頼性の高い評価が得られます。これは、データセットを複数のフォールドに分割し、それぞれのフォールドで訓練と検証を繰り返すことで行われます。

```python
from sklearn.model_selection import cross_val_score

# ロジスティック回帰モデルでクロスバリデーションを実行
logreg = LogisticRegression()
cv_scores = cross_val_score(logreg, X, y, cv=5, scoring='accuracy')

print("Cross-Validation Scores: ", cv_scores)
print("Average Accuracy: ", np.mean(cv_scores))
```

これらの手法を組み合わせることで、タイタニックデータセットに対する予測性能を向上させることができます。最適なモデルとパラメータを選択した後、最終的にKaggleのテストデータセットを用いて、モデルの予測性能を評価し、コンペティションに提出できます。


## 2. Iris plants datasets（アヤメの品種データセット）
Iris plants datasets（アヤメの品種データセット）は、1936年に英国の統計学者・植物学者ロナルド・フィッシャー（Ronald Fisher）が発表した、アヤメの花の分類問題に関するデータセットです。このデータセットは、機械学習やデータマイニングの分野で非常に有名であり、特に分類問題の入門例としてよく使用されます。

アヤメの品種データセットには、150個のサンプルが含まれており、各サンプルはアヤメの花の4つの特徴（がく片の長さ・幅、花びらの長さ・幅）と、そのアヤメの花が属する品種（Iris setosa, Iris versicolor, Iris virginicaの3種類）に関する情報が含まれています。

機械学習の目的は、アヤメの品種データセットを用いて、花の特徴からそのアヤメの花が属する品種を予測する分類モデルを構築することです。このデータセットを用いることで、データの前処理、特徴量選択、モデルの選択、ハイパーパラメータのチューニング、評価指標の選択など、機械学習の基本的なスキルを学ぶことができます。

### GPT3.5

以下は、Iris plantsデータセットを使用して、単純な機械学習アルゴリズムであるロジスティック回帰モデルを構築するサンプルコードです。

```python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# Load the Iris dataset
iris = load_iris()

# Split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)

# Train a logistic regression model on the training data
logistic_regression_model = LogisticRegression(random_state=42)
logistic_regression_model.fit(X_train, y_train)

# Make predictions on the test data
y_pred = logistic_regression_model.predict(X_test)

# Calculate the accuracy of the predictions
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: {:.2f}%".format(accuracy*100))
```

このコードでは、Iris plantsデータセットを読み込み、トレーニングセットとテストセットに分割します。次に、トレーニングデータを使用してロジスティック回帰モデルをトレーニングし、テストデータを使用して予測を作成します。最後に、正解率を計算して、モデルのパフォーマンスを評価します。

このコードを実行することで、Iris plantsデータセットを使用した単純な機械学習実装例を確認できます。ただし、モデルの性能を向上させるためには、より複雑なアルゴリズムを使用することや、より多くの前処理を行うことが必要になる場合があります。

### GPT4

ここでは、Iris plants datasetを用いて分類問題を解くための機械学習のサンプルコードを提供します。この例では、サポートベクターマシン（SVM）を使用しますが、他の分類アルゴリズムも適用可能です。

```python
# 必要なライブラリのインポート
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# データセットの読み込み
iris = load_iris()
X = iris.data
y = iris.target

# データセットを訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# サポートベクターマシンのインスタンスを作成
model = SVC(kernel='linear', C=1, random_state=42)

# モデルの訓練
model.fit(X_train, y_train)

# テストデータでの予測
y_pred = model.predict(X_test)

# 評価指標の計算
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)

# 評価指標の表示
print("Accuracy: ", accuracy)
print("Classification Report: \n", report)
print("Confusion Matrix: \n", conf_matrix)
```

このサンプルコードでは、まず必要なライブラリをインポートし、Iris plants datasetをロードします。次に、データセットを訓練データとテストデータに分割し、サポートベクターマシンのインスタンスを作成してモデルを訓練します。モデルを訓練した後、テストデータでの予測を行い、評価指標（正解率、分類レポート、混同行列）を計算して表示します。

このサンプルコードは、サポートベクターマシンを使用した単純な例ですが、他の分類モデルや前処理手法を試すことで、予測性能を向上させることができます。また、ハイパーパラメータチューニングや特徴量選択などの手法を適用して、モデルの最適化を行うことができます。

## 3. Boston house prices datasets（ボストン市の地区別住宅価格データセット）
Boston house prices datasets（ボストン市の地区別住宅価格データセット）は、アメリカのボストン市における地区ごとの住宅価格の中央値を予測する回帰問題に適したデータセットです。このデータセットは、機械学習の教育や研究を目的として、1970年代に収集されました。データセットは、ボストン市内の506地区からなり、各地区について13の特徴量と住宅価格の中央値が記録されています。

### GPT3.5

Boston house prices datasetは、住宅価格を予測するための有名なデータセットです。以下は、Scikit-learnライブラリを使用して、このデータセットを用いた機械学習のサンプルコードです。

```python
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# Load the Boston Housing dataset
boston = load_boston()

# Split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.3, random_state=42)

# Define the preprocessing pipeline
preprocessing_pipeline = make_pipeline(StandardScaler())

# Fit the preprocessing pipeline on the training data
preprocessing_pipeline.fit(X_train)

# Preprocess the training and test data using the preprocessing pipeline
X_train_preprocessed = preprocessing_pipeline.transform(X_train)
X_test_preprocessed = preprocessing_pipeline.transform(X_test)

# Train a linear regression model on the preprocessed data
linear_regression_model = LinearRegression()
linear_regression_model.fit(X_train_preprocessed, y_train)

# Make predictions on the test data
y_pred = linear_regression_model.predict(X_test_preprocessed)

# Calculate the mean squared error of the predictions
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error: {:.2f}".format(mse))
```

このコードでは、まずBoston Housingデータセットを読み込んで、トレーニングセットとテストセットに分割します。次に、データの前処理にStandardScalerを使用するパイプラインを定義し、トレーニングセットに適合させます。その後、トレーニングデータとテストデータを前処理します。次に、前処理されたトレーニングデータを使用して線形回帰モデルをトレーニングし、テストデータを使用して予測を作成します。最後に、平均二乗誤差を計算して、モデルのパフォーマンスを評価します。

このコードを実行することで、Boston house prices datasetを用いた簡単な機械学習の実装例を確認できます。ただし、モデルの性能を向上させるためには、より多くの前処理を行うことや、より複雑なモデルを構築することが必要になる場合があります。


### GPT4

ここでは、Boston house prices datasetを用いて線形回帰モデルを訓練し、住宅価格を予測するサンプルコードを提供します。

```python
# 必要なライブラリのインポート
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# データセットの読み込み
boston = load_boston()
X = boston.data
y = boston.target

# データセットを訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 線形回帰モデルのインスタンスを作成
model = LinearRegression()

# モデルの訓練
model.fit(X_train, y_train)

# テストデータでの予測
y_pred = model.predict(X_test)

# 評価指標の計算
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)

# 評価指標の表示
print("Mean Squared Error: ", mse)
print("Root Mean Squared Error: ", rmse)
print("R2 Score: ", r2)
```

このサンプルコードでは、まず必要なライブラリをインポートし、Boston house prices datasetをロードします。次に、データセットを訓練データとテストデータに分割し、線形回帰モデルのインスタンスを作成してモデルを訓練します。モデルを訓練した後、テストデータでの予測を行い、評価指標（平均二乗誤差、二乗平均平方根誤差、決定係数）を計算して表示します。

このサンプルコードは、線形回帰モデルを使用した単純な例ですが、他の回帰モデルや前処理手法を試すことで、予測性能を向上させることができます。また、ハイパーパラメータチューニングや特徴量選択などの手法を適用して、モデルの最適化を行うことができます。

## 4. Digits datasets（数字の手書き文字データセット）
Digits datasets（数字の手書き文字データセット）は、機械学習の分類問題に適したデータセットです。このデータセットは、手書きの数字（0から9まで）のグレースケール画像から構成されており、画像認識や分類アルゴリズムの性能評価に広く利用されています。

Digits datasetsの代表的なものに、以下の2つがあります。

MNISTデータセット：Modified National Institute of Standards and Technology（MNIST）データセットは、手書き数字の画像データセットとして広く知られています。MNISTデータセットには、60,000枚のトレーニング画像と10,000枚のテスト画像が含まれています。各画像は、28x28ピクセルのグレースケール画像で、数字のラベル（0から9まで）が付与されています。

scikit-learnのdigitsデータセット：scikit-learnライブラリには、digitsデータセットが含まれており、これは8x8ピクセルのグレースケール画像からなる手書き数字のデータセットです。このデータセットには、1,797の画像が含まれており、各画像には0から9までの数字のラベルが付与されています。

Digits datasetsを用いて、様々な分類アルゴリズム（ロジスティック回帰、サポートベクターマシン、ランダムフォレスト、ニューラルネットワークなど）を試すことができます。また、画像データの前処理や特徴量抽出、ハイパーパラメータチューニングなどの手法を学ぶこともできます。Digits datasetsを使って、機械学習やデータサイエンスのスキルを磨くことができます。

### GPT3.5

Digitsデータセットは、0から9までの手書き数字の画像を含む、非常に人気のあるデータセットです。以下は、Digitsデータセットを使用して、サポートベクトルマシン（SVM）アルゴリズムを使用して数字を分類するサンプルコードです。

```python
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# Load the digits dataset
digits = load_digits()

# Split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.3, random_state=42)

# Train an SVM model on the training data
svm_model = SVC(kernel='linear', random_state=42)
svm_model.fit(X_train, y_train)

# Make predictions on the test data
y_pred = svm_model.predict(X_test)

# Calculate the accuracy of the predictions
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: {:.2f}%".format(accuracy*100))
```

このコードでは、Digitsデータセットを読み込み、トレーニングセットとテストセットに分割します。次に、トレーニングデータを使用してSVMモデルをトレーニングし、テストデータを使用して予測を作成します。最後に、正解率を計算して、モデルのパフォーマンスを評価します。

このコードを実行することで、Digitsデータセットを使用したSVMによる機械学習実装例を確認できます。ただし、SVMモデルもモデルの性能を向上させるためには、適切なカーネル関数の選択やパラメータの選択、過剰適合を防ぐための正則化などの手法を使用することが必要になる場合があります。

### GPT4

ここでは、Digits datasetを用いて手書き数字の分類問題を解くための機械学習のサンプルコードを提供します。この例では、ロジスティック回帰を使用しますが、他の分類アルゴリズムも適用可能です。

```python
# 必要なライブラリのインポート
import numpy as np
import pandas as pd
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# データセットの読み込み
digits = load_digits()
X = digits.data
y = digits.target

# データセットを訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# ロジスティック回帰のインスタンスを作成
model = LogisticRegression(max_iter=10000, random_state=42)

# モデルの訓練
model.fit(X_train, y_train)

# テストデータでの予測
y_pred = model.predict(X_test)

# 評価指標の計算
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)

# 評価指標の表示
print("Accuracy: ", accuracy)
print("Classification Report: \n", report)
print("Confusion Matrix: \n", conf_matrix)
```

このサンプルコードでは、まず必要なライブラリをインポートし、Digits datasetをロードします。次に、データセットを訓練データとテストデータに分割し、ロジスティック回帰のインスタンスを作成してモデルを訓練します。モデルを訓練した後、テストデータでの予測を行い、評価指標（正解率、分類レポート、混同行列）を計算して表示します。

このサンプルコードは、ロジスティック回帰を使用した単純な例ですが、他の分類モデルや前処理手法を試すことで、予測性能を向上させることができます。また、ハイパーパラメータチューニングや特徴量選択などの手法を適用して、モデルの最適化を行うことができます。


## まとめ

本記事では、4つの有名データセット（Titanic、Iris、Boston house prices、Digits）を用いた機械学習を行い、GPT3.5とGPT4の比較を行いました。ChatGPTの有料プラン（[ChatGPT Plus](https://openai.com/blog/chatgpt-plus)）に課金するか迷っている方の参考になれば嬉しいです。

有名データセットの機械学習に関して、GPT3.5とGPT4は、下記の違いがあると感じました。
* GPT3.5は、正答率やMSEなど指標一つだけを出力していましたが、GPT4は複数の指標を出力してくれています。
* GPT3.5は、英語でコメントを書いていましたが、GPT4は日本語でコメントを書いてくれています。
* どちらのサンプルコードもクオリティが大きく異なるというわけではないです。理由としては、ネットに豊富なサンプルコードが存在しているためだと考えられます。
* より複雑なケースやあまりネットに情報がないようなケースでは、GPT3.5とGPT4の差が広がると予想されます。