「あやめ」の種類判別(その2)

iris(菖蒲:アヤメ)データセットを使って進める
  (その2)は行番号28~51までを解説する

#
#   1.データの読み込み
#
import pandas as pd
import numpy  as np
import matplotlib.pyplot as plt
import seaborn as sns
#
from sklearn import datasets
#      
%matplotlib inline
#
iris_datasets =  datasets.load_iris()
#
#
#print("***詳細*****",flush=True)
#print(iris_datasets.DESCR)
#print("********",flush=True)
#
#
#   2.データの確認
#
iris = pd.DataFrame(iris_datasets.data,columns = iris_datasets.feature_names)
iris['target'] = iris_datasets.target
#
iris.head()
#
#
#   3.モデルの学習
#
target = iris['target']
data = iris[iris_datasets.feature_names]
#
from sklearn import model_selection
data_train,data_test,target_train,target_test = \
        model_selection.train_test_split(data,target,train_size=0.8)
#
print(target_train.shape,target_test.shape)
print(data_train.shape,data_test.shape)
#
from sklearn.svm import SVC
model = SVC(gamma='scale')
model.fit(data_train,target_train)
#
target_predict = model.predict(data_test)
#
print(target_predict)
print(np.array(target_test))
#
model.score(data_test,target_test)
#
#
#   4.モデルの評価
#
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
#
precision = precision_score(target_test,target_predict,average='micro')
recall = recall_score(target_test,target_predict,average='micro')
f1 = f1_score(target_test,target_predict,average='micro')
#
print('適合率(precision)',precision)
print('再現率(recall)',recall)
print('F値(F-measure)',f1)
#
#
#
# データの先頭
#print("***先頭****",flush=True)
#iris.head()
#print("********",flush=True)
#
# データの概要
#print("***概要****",flush=True)
#iris.info()
#print("********",flush=True)
#
# データの要約統計量
#print("***統計*****")
#iris.describe()
#print("********")
#
# データの形状
#print("***形状*****")
#iris.shape
#print("********")
#
# データ要素の取り出し
#print("***要素*****")
#iris.iloc[:10]
#print("********")
#
# 条件に合う行の取得
#print("***条件*****")
#iris.query("target==1")
#print("********")
#
#

以下にサンプルコードと解説を載せます

3.モデルの学習

#
target = iris['target']
data = iris[iris_datasets.feature_names]

 irisデータを機械学習用に準備する
  今回は評価用データは設けず、全て機械学習用とする
    目的変数(target)、説明変数(data)の2つを用意する
      目的変数:結果(推論を行う対象) 
      説明変数:要因(推論を行うために用いる変数)   

#
from sklearn import model_selection
data_train,data_test,target_train,target_test = \
        model_selection.train_test_split(data,target,train_size=0.8)

 分割用のオブジェクトをsklearnから読み込む
   model_selectionを呼び出す

 データの分割にはtrain_test_split関数を使用する
   ランダムにデータをピックアップする関数
     ※記述した計算結果の数値は都度異なる結果になる

   目的変数と説明変数は以下の様に分割される
     target_train・・・80%、学習データ
     target_test ・・・20%、検証データ

     data_train・・・80%、学習データ
     data_test ・・・20%、検証データ

#
print(target_train.shape,target_test.shape)
print(data_train.shape,data_test.shape)

 分割の結果を確認する
   目的変数の形状(shape)を各々出力する
   説明変数の形状(shape)を各々出力する

 以下はprint文による出力例

(120,) (30,)
(120, 4) (30, 4)

 150行のデータが各々120行と30行に分割されている
     target_train・・・80%(120行)
     target_test ・・・20%(30行)

     data_train・・・80% (120行、4列)
     data_test ・・・20% (30行、4列)

#
from sklearn.svm import SVC
model = SVC(gamma='scale')
model.fit(data_train,target_train)

 sklearn.svmモジュールに含まれるSVCクラスを呼び出す

 サポートベクターマシン(SVM)を使って学習する
   SVM・・・予測に必要なデータに絞り込んでいくこと
     例:1本の境界線で2つに分類できるとして、
       最もよく分類できる直線を求める

 モデルとしてガンマ分布(gamma)を使用する

 fit関数に学習データ(data_trainとtarget_tran)を渡す
   モデルのデータ関連性を学習する

#
target_predict = model.predict(data_test)

 検証データを使って予測する
   predict関数に説明変数の検証データを与えると
   予測結果がtarget_predictに返ってくる

#
print(target_predict)
print(np.array(target_test))

 予測結果(target_predict)データと
 正解(目的変数の検証データ:target_test)を並べて比較する
   検証データは配列に変換する

 以下はprint文による出力例


[0 0 2 2 1 1 1 2 2 1 0 1 1 1 2 0 0 1 1 1 1 0 0 0 0 1 0 0 2 0]
[0 0 2 2 1 1 1 2 2 1 0 1 1 1 2 0 0 1 1 1 1 0 0 0 0 1 0 0 2 0]
#
model.score(data_test,target_test)

 正解率(決定係数)を計算する
   説明変数の検証データ(data_test)と
   目的変数の検証データ(target_test)とで正解率を求める

 以下は正解率(score関数の出力)

0.9666666666666667