結論
- AIを作る経験が浅いときは、色々なアルゴリズムを試すしかない
- 色々なアルゴリズムで、精度を比較する
- 経験を積むことで、AIの要件や入力データから向いているアルゴリズムの当たりを付けることができるようになる
経緯
AIを構築するうえで、どのアルゴリズムを選択するか。アルゴリズムは、AIの精度に関わる重要なポイントとなります。認知度の高いアルゴリズムとしては、下記が挙げられます。
- ニューラルネットワーク
- ロジスティック回帰
- サポートベクターマシン
- XGBoost
- 決定木
- ランダムフォレスト
- ナイーブベイズ分類器
- k近傍法
AIの要件や入力データで変わってくるので、AIの作成経験が浅い時は、まずは仕組みを理解している、あるいは扱いやすいアルゴリズムを試すしかないと感じました。
アルゴリズムの選択眼を養うためのには、色々なアルゴリズムを試し精度を比較しそれぞれのアルゴリズムの特徴を理解していくのが、遠回りのようで近道だと思います。
アルゴリズムを精度を比較する手順を掲載しました。参考になれば幸いです。
方法
作成したプログラムの概要は下記となります。
- 各アルゴリズムに必要なライブラリを読み込む
- 乳がんの診断データを読み込む
- 読み込んだデータを訓練データ、テストデータ、予測検証データの3つに分割する
- 各アルゴリズムでAI(モデル)を作成する
- 訓練データで各AI(モデル)を学習する
- テストデータで作成した各AI(モデル)の精度を計算する
- 精度を表示する
作成したプログラム
# 警告表示を無効にする
import warnings
warnings.simplefilter('ignore')
# ライブラリを読み込む
import numpy as np
# sklearnを読み込む
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from xgboost import XGBClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
# 乱数の種
# 実行っ結果の値を合わせるために指定する
random_seed = 777
# 乳がんのサンプルデータを読み込む
cancer = load_breast_cancer()
# 入力データ:x (30次元)
# 正解データ:y (1次元)
x_orig = cancer.data
y_orig = cancer.target
# 最後のデータは、予測する際に使用するので、除外する
x = x_orig[:-1, :]
y = y_orig[:-1]
# 最後のデータを保存する
x_last = x_orig[-1, :]
y_last = y_orig[-1]
# predict関数で扱えるデータは2次元なので、
# 1次元で保存された最後のデータを、2次元に変換する
x_last = np.array(x_last).reshape(1, 30)
# 入力データ、正解データを訓練データとテストデータに分割する
# 訓練データとテストデータの比率が、9対1となるように分割する
# x_train:訓練データ
# y_train:訓練データの正解データ
# x_test:テストデータ
# y_test:テストデータの正解データ
# train_test_split:訓練データとテストデータを分割する
# test_size:テストデータの比率
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.1, random_state=random_seed)
# 分割後の情報を表示する
print('■ load_breast_cancerで読み込んだ乳がんの診断データ')
print(f'全データの数\t\t: {x.shape[0]}')
print(f'訓練データの数\t\t: {x_train.shape[0]}')
print(f'テストデータの数\t: {x_test.shape[0]}')
print(f'検証データの数\t\t: {x_last.shape[0]}\n')
# ニューラルネットワーク
# モデルを作成するときのアルゴリズムにニューラルネットワークを指定する
algorithm_NeuralNetwork = MLPClassifier(solver='sgd', random_state=random_seed, max_iter=1000)
# サポートベクターマシン
# モデルを作成するときのアルゴリズムにサポートベクターマシンを指定する
algorithm_SVC = SVC(kernel='rbf', random_state=random_seed)
# 回帰
# モデルを作成するときのアルゴリズムに回帰を指定する
algorithm_Regression = LogisticRegression(random_state=random_seed)
# XGBoost
# モデルを作成するときのアルゴリズムにXGBoostを指定する
# eval_metric:検証データに対する評価基準を設定する。デフォルトのままだとwarningが表示されるので、設定しておく。rmseは2乗平均平方根誤差。
algorithm_XGB = XGBClassifier(eval_metric='rmse', random_state=random_seed)
# 決定木
# モデルを作成するときのアルゴリズムに決定木を指定する
algorithm_DecisionTree = DecisionTreeClassifier(random_state=random_seed)
# ランダムフォレスト
# モデルを作成するときのランダムフォレストに決定木を指定する
algorithm_RandomForest = RandomForestClassifier(random_state=random_seed)
# ナイーブベイズ分類器
# モデルを作成するときのナイーブベイズ分類器を指定する
algorithm_GaussianNB = GaussianNB()
# k近傍法
# モデルを作成するときのk近傍法を指定する
algorithm_knn = KNeighborsClassifier()
# アルゴリズムのリストを作成する
algorithms = [algorithm_NeuralNetwork,
algorithm_SVC,
algorithm_Regression,
algorithm_XGB,
algorithm_DecisionTree,
algorithm_RandomForest,
algorithm_GaussianNB,
algorithm_knn]
# 各アルゴリズムの学習と精度を行う
print('■ 各アルゴリズムの精度')
for algorithm in algorithms:
# アルゴリズム名(オブジェクトのクラス名)を取得する
name = algorithm.__class__.__name__
# fit関数で訓練データを学習する
algorithm.fit(x_train, y_train)
# テストデータを用いて、score関数で精度を測定する
score = algorithm.score(x_test, y_test)
# 精度を表示する
print(f'score: {score:.4f} {name}')
実行結果
■ load_breast_cancerで読み込んだ乳がんの診断データ
全データの数 : 568
訓練データの数 : 511
テストデータの数 : 57
検証データの数 : 1
■ 各アルゴリズムの精度
score: 0.7368 MLPClassifier
score: 0.8772 SVC
score: 0.9298 LogisticRegression
score: 0.9298 XGBClassifier
score: 0.8596 DecisionTreeClassifier
score: 0.9123 RandomForestClassifier
score: 0.8772 GaussianNB
score: 0.9123 KNeighborsClassifier
各AI(モデル)を作成する際のパラメータは、デフォルトパラメータです。
精度が高いのは、ロジスティック回帰とXGBoost。
精度が低いのは、ニューラルネットワーク。
ニューラルネットワークが一番低かったのは、意外でした。
AI(モデル)を作成する際のパラメータを変更することで、精度がどれくらい変わってくるのか、まとめたいと思います。
コメント