どうも、solobochiです。
TensorFlowアヤメの学習について、前回はsequentialモデルで分析を
しましたが、今回は学習モデルをRandom Forestに変更して分析をして
みました。
目次
-
【概要】
- アヤメの種類を機械学習(Random Forest)によって分類する。
⚠️Random Forestとは?
👉機械学習アルゴリズムの1つ。決定木をいくつも作り、多数決で分類・予測する。
scikit-learnアルゴリズムチートシートの、赤枠の部分でアンサンブル学習の手法。・Classification(教師あり学習、クラス分類)
・Clustering(教師なし学習、クラスタリング)
・Regression(教師あり学習、回帰)
・Dimensionality Reduction(教師なし学習、次元圧縮)※画像はscikit-learn公式サイトより引用
はてな
⚠️Classificationとは?
👉教師あり学習の分類問題。正解ラベルが存在している分類問題。
すなわち、既に有用な分類が発見されていてそれを再現すること。(=その法則に従ってラベリングする。)
例)犬か猫かの判別問題、男性 or 女性の分類問題、アヤメの分類問題(Setosa/Versicolour/Virginicaのいずれかに分類する)などはてな
⚠️Clusteringとは?
👉教師なし学習の分類問題。正解データがないのでデータから法則性を見出してデータの集まりを見つける。(=データを分類する。)(=グループ分けをする。)
既知の分類法では見えて来ないことを発見しようとすること。
※クラスタ:データの集まり
例)アヤメの分類問題(ラベルは分からず、Aグループ/Bグループ/Cグループに分ける)はてな
⚠️Regressionとは?
👉教師ある学習で連続データの予測問題。
過去の実績データ等を教師データとして学習して予測する。
例)株価予測、住宅価格予想、需要予測、売上予測etc...
※回帰問題では連続データを扱う(予測する)、分類問題では離散データを扱う。はてな
⚠️次元圧縮とは?
👉データの次元を削減/圧縮して特徴/主要因子を発見する。
(=説明変数を減らす)(=各対象次元の重要度に応じて比重を持たせることで実現する)
(=本質的な構造を抽出する、例えば猫の猫らしさを学習し特報量抽出する。)
例)教師なし学習の手書き文字認識など
→主成分分析(PCA(Principal Component Analysis))、DeepLearningなど※参考:機械学習アルゴリズム
(引用:https://products.sint.co.jp/aisia/blog/vol1-9)
(引用:https://thinkit.co.jp/article/13280)
※⛑詳しくは別記事でまとめるかも?
ちょい待ち
❓決定木とは?
👉木構造で、意思決定を助けるためのモデル。(wikipediaより)
※分類問題に使われるときは分類木、回帰問題に使われるときは回帰木と言う👉木の深さ(depth)を調整して過学習を防ぐ
👉木の枝のように条件分岐を増やしていくことで分類する。
※一番下のリーフノードでターゲットのラベルを決定する(引用:http://www.nag-j.co.jp/nagdmc/ketteigi.htm)
ちょい待ち
❓アンサンブル学習とは?
👉複数モデルを作成して学習器に重みをつけて統合(≒多数決)して予測する。
※色々な学習器・識別器の結果を集め、重みつけることで高精度モデルを構築する
※複数の決定木の多数決がRandom Forestモデル👉アンサンブル学習に、バギングとブースティングがある
・バギング(Bootstrap-Aggregating):データの一部を訓練データとして使って学習し、それを繰り返し、複数の学習器から得られた結果を最終的に集約することで高精度での予測を行う。
└例)Random Forest:各学習器の特徴量の重要度を確認できるので調整して精度を上げる。・ブースティング:データの一部を訓練データにして学習し、最終的に集約する点はバギングと同じ。特徴はバギングと違って、前回のデータを再利用して学習する点。
└例)Adaboost、LightGBM等
※参考にしたサイト
https://analytics-and-intelligence.net/archives/678では、早速。
学習の流れは以下の通り。
step
1ライブラリ&データセットのインポートstep
2モデルの作成(今回はRandom Forestモデル)step
3学習の実行step
4予測&評価※今回はGridSearchCVはかまさないのでハイパーパラメータの設定等はなしのため
結果的にほぼほぼ、前回のSequeintialモデルと同じ<手順1>ライブラリ&データセットのインポート&データ確認
・ライブラリのインポート⚠️💡
使用するライブラリは、sklearnのRandom Forestのみfrom sklearn.ensemble import RandomForestClassifier
※事前にscikit-learnをインストールしておく必要があります
└ー環境構築についてはこちらの記事を参照。【参考】⬇️python仮想環境構築について👇
・データセットのインポート
👉scikit-learnからデータセットをインポートする
from sklearn import datasets iris = datasets.load_iris()
※irisはアヤメという意味
scikit-learnのdatasetについて詳細は公式ページ参照。
・データの確認(前回のSequetialモデルで入れ忘れたので)
👉データセットのキー(keys)、データセットの説明(DESCR)を見てみる
#ソース print(iris.keys()) #結果 dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename']) #ソース print(iris.DESCR) #結果 Iris plants dataset -------------------- **Data Set Characteristics:** :Number of Instances: 150 (50 in each of three classes) :Number of Attributes: 4 numeric, predictive attributes and the class :Attribute Information: - sepal length in cm - sepal width in cm - petal length in cm - petal width in cm - class: - Iris-Setosa - Iris-Versicolour - Iris-Virginica :Summary Statistics: ============== ==== ==== ======= ===== ==================== Min Max Mean SD Class Correlation ============== ==== ==== ======= ===== ==================== sepal length: 4.3 7.9 5.84 0.83 0.7826 sepal width: 2.0 4.4 3.05 0.43 -0.4194 petal length: 1.0 6.9 3.76 1.76 0.9490 (high!) petal width: 0.1 2.5 1.20 0.76 0.9565 (high!) ============== ==== ==== ======= ===== ====================
DESCRの結果から、
・3つのクラス(Setosa/Versicolour/Virginica)ごとに50のデータがあり、
合計150のインスタンス(サンプルデータ)がある
・sepal length(cm) / sepal width(cm) / petal length(cm) / petal width(cm)の4つの特徴(説明変数)があると言うことがわかる。
👉データセットのキー(keys)より、target_names、deature_namesを確認してみる
#ソース(コマンド) print(iris.target_names) #結果 ['setosa' 'versicolor' 'virginica'] #ソース print(iris.feature_names) #結果 ['sepal length (cm)', 'sepal width (cm)','petal length (cm)', 'petal width (cm)']
・target_nameは、
'setosa' / 'versicolour' / 'virginica'の3種類・feature_nameは、
'sepal length' / 'sepal width' / 'petal length' / 'petal width' の4つと言うことがわかる。
<手順2>モデルの作成
・Random Forestモデルを構築する👉この1行のみ!(なんと簡単っ)
rf = RandomForestClassifier(random_state=0)
※random_stateとは:乱数生成時のシード(乱数算出時の引数のようなもの)
└※参考:https://qiita.com/HotAllure/items/ca5462b33d8b0a14631f<手順3>学習の実行
・訓練データとテストデータの分割
👉train_test_split関数を使って分割
(※訓練データ、テストデータはランダムに選ばれる)
(※random_stateを指定すると選定される訓練データを固定できる)from sklearn.model_selection import train_test_split train_data, test_data, train_label, test_label = train_test_split(iris.data, iris.target, test_size=0.2)
※train_data :訓練データ
※test_date :テストデータ
※train_label :訓練データの正解ラベル
※test_label :テストデータの正解ラベル・学習の実行!!
👉rf.fit(x,y)
rf.fit(train_x,train_y)
<手順4>予測&評価
・評価の実行
👉pre = rf.predict(x)
pre = rf.predict(test_x) ac_score = metrics.accuracy_score(test_y,pre) print('正解率{0:.1f}%'.format(ac_score*100))
・predictした結果:preと、実際の結果:test_yを比べて、正解率を表示させる。
<実行結果>
実行結果は以下の通り。
"10 in version 0.20 to 100 in 0.22.", FutureWarning) 正解率95.6% (env1-py3.6.6)
いい感じですね♪
<ソース>
#--アヤメの分類-- ##--RandomForest-- ##Step1 ライブラリ&データセットのインポート&データ確認 #ライブラリ&データセットのインポート from sklearn import datasetsiris = datasets.load_iris() from sklearn import model_selectionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn import metrics #データ確認 print(iris.keys()) print(iris.DESCR) #Step2 モデルの作成 rf = RandomForestClassifier(random_state=0) #Step3 学習の実行 #訓練データとテストデータの分割 train_x,test_x,train_y,test_y = model_selection.train_test_split(iris.data,iris.target,test_size=0.3) #学習! rf.fit(train_x,train_y) #Step4 予測&評価・予測 pre = rf.predict(test_x) #評価 ac_score = metrics.accuracy_score(test_y,pre) print('正解率{0:.1f}%'.format(ac_score*100))
以上。