累計

  • 156,636 pv

アクセスカウンター

python 機械学習 プログラミング

[機械学習][python]アヤメの分類(TensorFlow)Part②-(RandomForest)

2019-03-28

 

どうも、solobochiです。

 

 

TensorFlowアヤメの学習について、前回はsequentialモデルで分析を
しましたが、今回は学習モデルをRandom Forestに変更して分析をして
みました。

 

 

目次

    1. 手順1 ライブラリ&データセットのインポート&データ確認
    2. 手順2 モデルの作成
    3. 手順3 学習の実行
    4. 手順4 予測&評価
    5. 実行結果
    6. ソース

     



     

    【概要】

    • アヤメの種類を機械学習(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仮想環境構築について👇

    python仮想環境構築(for Mac)

     

    ・データセットのインポート

    👉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))

     

     

    以上。

     

     

     

     

  • この記事を書いた人
  • 最新記事

solobochi

(名前):solobochi

(説明)
独身アラサー男子
国内大手IT企業中堅社員。
プログラミングやセミナーのアウトプットがしたいと思いブログを開設。
プロジェクトマネジメント関連の資格やディープラーニング、機械学習系の資格取得ノウハウについても発信。


(Like)
・最適化することが好き
・PDCAを回すのが好き


(当サイト)
日々思うことを徒然と発信
└(例)
・学びのアウトプット
・投資・資産運用
・プログラミング
・資格試験の対策
・セミナーのレビュー
・書評
etc...


詳しくは自己紹介記事にて。
自己紹介①
自己紹介②
自己紹介③
自己紹介④

-python, 機械学習, プログラミング
-, , ,

Copyright© そろボチ , 2023 All Rights Reserved Powered by AFFINGER5.