【AIプログラミング】ランダムフォレストでDigitデータを分類、PCAをしてみるとどうなるか?

前回、ランダムフォレストでDigitを分類したけれど、結構いい感じのスコアが出ました。

PCAで特徴量を抽出したらもっとスコアは上がるかな??

前回、ランダムフォレストでDigitデータを分類してみました。サポートベクターマシンほどではなかったのですが、結構良いスコアとなりました。サポートベクターマシンのときは、データにPCAをすることで、スコアの向上が見られました。同様に、ランダムフォレストでもPCAしたデータでどのようになるか試してみたいと思います。

前回のランダムフォレストでDitigデータを分類した記事はこちらをご参考ください。

ぱんだクリップ
【AIプログラミング】いろいろな分類器でDigitを分類、ランダムフォレストで分類 | ぱんだクリップ ランダムフォレストでもDigitデータを分類してみました。 いろいろな分類器で試してみると新しい発見があるかな。 前回は、サポートベクターマシンでテストデータに対して9...

サポートベクターマシンでDigitデータを分類した記事はこちらをご参考ください。

ぱんだクリップ
【AIプログラミング】いろいろな分類器でDigitを分類、サポートベクターマシンでやってみよう | ぱんだクリ... k最近傍法でかなり良い結果が出ましたが、サポートベクターマシンも試してみたいと思います。 いろいろ試してみるのも大事だね! 数字の文字画像分類のDigitをサポートベク...

こんな人の役に立つかも

・機械学習プログラミングを勉強している人

・scikit-learnでPCAをプログラミングしたい人

・scikit-learnでランダムフォレストのプログラミングがしたい人

目次

PCAをしてランダムフォレストで分類

import~データの読み込み、データの分割まで

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
import numpy as np

#結果評価関連
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report

panda_box = datasets.load_digits()

X = panda_box.data
y = panda_box.target

#訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, stratify=y, random_state=0)

次にPCAを行います。PCAを行ったら、抽出した主成分特徴量の寄与率を見てみます。

DigitデータをPCA

PCAについては、こちらの記事もご参考ください。

ぱんだクリップ
【AIプログラミング】乳がんデータの特徴量を変換、PCAで特徴量を削減 | ぱんだクリップ 主成分分析という手法を勉強しているけど、仕組みが難しいよ。 scikit-learnだと、PCAという機能に入れるだけで簡単にできるみたい。 データの標準化を学び、いい感じの結...
import matplotlib.pyplot as plt

#PCA
from sklearn.decomposition import PCA
#白色化
pca = PCA()
pca.fit(X_train)
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)

#寄与率を表示
plt.plot(pca.explained_variance_ratio_)

ここは、サポートベクターマシンの時と同じで、大体30主成分目までがデータに影響していそうな雰囲気です。

パラメータ調整

PCAで特徴量を抽出したDigitデータに対して、パラメータ「n_estimators」の変化でどのようにスコアが変化するかを見ていきます。

また、PCAで抽出した特徴量は、どこまで次元削減できるかも、検討します。

今回は、

①「n_estimators」の変化で一番よい設定を検討

②PCA特徴量の削減

という流れで調整しました。

①パラメータn_estimatorsを変化させてみる

まずは、「n_estimators」パラメータの変化でどのようにスコアが変化するかを可視化します。このプログラムは、3分割交差検証も行っているため、実行するのにGoogle Colabo環境で約3、4分程度かかります^^;

from sklearn.ensemble import RandomForestClassifier

train_dat_array = []

for i in range(50, 150):
    #交差検証へのスコア
    clf = RandomForestClassifier(n_estimators=i, random_state=0)
    score = cross_val_score(clf, X_train_pca, y_train, cv=3)
    train_dat_array.append(np.mean(score))

3分割交差検証のスコアになります。

全体的に、n_estimatorsが120以降が良い雰囲気です。130前後がスコアのピークとなっていますね。今回は、130を利用することにします。

※Google Colaboで、再接続したりすると実行毎に結果が違ってきます。

n_estimators=120としてテストデータスコアをだすと、96.22%でした。

clf = RandomForestClassifier(n_estimators=130, random_state=0).fit(X_train_pca, y_train)
print("{:.4f}" .format(clf.score(X_test_pca, y_test)))
0.9644

②PCAの主成分特徴量の削減

次に、PCAで抽出した主成分特徴量がどこまで削減できるかを検討してみます。

from sklearn.metrics import accuracy_score

clf = RandomForestClassifier(n_estimators=120, random_state=0)

score_array = []

for i in range(10, 50):
  #テストデータ評価
  clf.fit(X_train_pca[:, 0:i+1], y_train)
  predict = clf.predict(X_test_pca[:, 0:i+1])
  score_array.append(accuracy_score(y_test,predict))

#テストデータに対するスコアをプロット
plt.plot(np.linspace(10, 50, 40), score_array)

特徴量が22くらいがピークです。今回は、22個の特徴量を選択します。

clf.fit(X_train_pca[:, 0:22], y_train)
print("{:.4f}" .format(clf.score(X_test_pca[:, 0:22], y_test)))
0.9756

こうして、テストデータへのスコアが97.56%となりました。

まとめ

デフォルトのランダムフォレストに、何もしていないDigitデータを入れたときのスコアが97.33%でしたので、頑張って調整した割には、あまりスコアが上がっていないような感覚です^^;

ランダムフォレストは、ランダム性が存在するため、一概にこのパラメータが最強ということは出来なさそうなのです。

Digitデータの場合は、サポートベクターマシンのほうが良いのかな、と思いました。

勾配ブースティングもどうなるか気になってきました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次