~Part2~ OCIのデータ・サイエンスを使ってアヤメを品種判別してみる

 2021.11.11  株式会社テリロジー 技術統括部

みなさま、こんにちは
Tachanです。
今回はOCIのデータ・サイエンスサービスを使い、アヤメの品種判別を機械学習させる記事を書いていこうと思います。
Part2はサンプルデータからアヤメの品種判別、分類を行っていきます。

Conda環境の設定

機械学習ライブラリをインストールしたConda環境を作成します。

ノートブックを開き、NotebookカテゴリのEnvironment Explorerを選択します。
「General Machine Learning for CPUs」を検索し、インストール欄に書かれてあるコマンドをコピーします。

Conda環境の設定 画像01

Conda環境の設定 画像02

画面左上の「+」ボタンからランチャーを開き、OtherにあるTerminalを選択します。
Terminalで、先ほどコピーしたコマンドを張り付け、実行します。

Conda環境の設定 画像03

インストールが終わったらscikit-learnもインストールします。

Conda環境の設定 画像04

アヤメのデータの中身

scikit-learnをインストールしたら、アヤメのサンプルデータを読み込み、中身を確認します。

from sklearn import datasets iris=datasets.load_digits() dir(iris)

Conda環境の設定 画像05

実行すると、データセットには5種類のデータが入っていることが分かります。
['DESCR', 'data', 'feature_names', 'frame', 'images', 'target', 'target_names']

それぞれに何が入っているのでしょうか。
DESCRでは、データセットの説明が記載されています。

Conda環境の設定 画像06

Conda環境の設定 画像07

説明では以下の記述がされています。

**Data Set Characteristics:** :Number of Instances: 150 (50 in each of three classes)    #3種類のデータが50個ずつ計150個入っている :Number of Attributes: 4 numeric, predictive attributes and the class    #データには4つの数値がある :Attribute Information: #4つの数値の詳細 - sepal length in cm #アヤメのがく片の長さ - sepal width in cm #アヤメのがく片の幅 - petal length in cm #花弁の長さ - petal width in cm #花弁の幅 - class: #3種類のデータの名前(アヤメの名前) - Iris-Setosa - Iris-Versicolour - Iris-Virginica (以下略)

Dataにはアヤメのがく片と花弁のデータが入っています。

Conda環境の設定 画像08

feature_namesでは上記の4つがどの項目の数値なのかを表しています。

Conda環境の設定 画像09

targetでは0、1、2の数値が入っています。
target_namesでは上記のtargetの0、1、2の名前情報が入っています。
つまり、0がsetosa、1がversicolor、2がvirginicaに該当します。

Conda環境の設定 画像10

データセットの中身は以上になります。

学習モデルの作成と評価

今回はデータを訓練用とテスト用に分け、ロジスティック回帰でモデルを生成・評価します。
ロジスティック回帰とは、説明変数に基づき、目的変数が0もしくは1・YES/NOのように
2つの値で分類できる場合に使われる学習法です。
説明変数とは目的変数の予測のために使われる変数であり、
目的変数とは予測したい変数を指します。

今回データに含まれている、がくの長さと幅、花弁の長さと幅をそれぞれ散布図にすると以下のようになり、この4つの値を使って種類の判別ができそうです。

<がくの長さと幅の散布図>

from sklearn import datasets import matplotlib.pyplot iris=datasets.load_iris() a = iris.data b = iris.target matplotlib.pyplot.scatter(a[:50, 0], a[:50, 1], color='r', marker='o', label='setosa') #iris.dataの0番目から49番目のデータ範囲で、各データの0番目と1番目を使用 matplotlib.pyplot.scatter(a[50:100, 0], a[50:100, 1], color='g', marker='^', label='versicolour') #50番目から99番目のデータ範囲 matplotlib.pyplot.scatter(a[100:, 0], a[100:, 1], color='b', marker=',', label='virginica') #100番目から最後のデータ範囲 matplotlib.pyplot.title("Iris Plants Database") matplotlib.pyplot.xlabel('sepal length(cm)') matplotlib.pyplot.ylabel('sepal width(cm)') matplotlib.pyplot.legend() matplotlib.pyplot.show()

学習モデルの作成と評価 画像01

<花弁の長さと幅の散布図>

matplotlib.pyplot.scatter(a[:50, 2], a[:50, 3], color='r', marker='o', label='setosa') matplotlib.pyplot.scatter(a[50:100, 2], a[50:100, 3], color='g', marker='^', label='versicolour') matplotlib.pyplot.scatter(a[100:, 2], a[100:, 3], color='b', marker=',', label='virginica') matplotlib.pyplot.title("Iris Plants Database") matplotlib.pyplot.xlabel('petal length(cm)') matplotlib.pyplot.ylabel('petal width(cm)') matplotlib.pyplot.legend() matplotlib.pyplot.show()

学習モデルの作成と評価 画像02

では、データを分けて、学習させていきます。
今回は、全体の75%を訓練データ、25%をテストデータに分割します。

from sklearn.model_selection import train_test_split a_train, a_test, b_train, b_test = train_test_split(iris['data'], iris['target'], test_size=0.25, random_state=0)

printで出力してみると、問題なく分けられています。

学習モデルの作成と評価 画像03

次にロジスティック回帰で訓練データを学習させ、テストデータを用いてモデルを評価します。

from sklearn.linear_model import LogisticRegression logreg = LogisticRegression().fit(a_train, b_train) #訓練データ学習 score = logreg.score(a_test, b_test) #テストデータで評価 print('Test set score: {}'.format(score))

学習モデルの作成と評価 画像04

実行すると、結果は出たものの、「STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.」という
Warningが表示されました。
学習させた際に、最大反復回数に到達せずモデルが収束しなかったようです。
なので、max_iterで学習の反復の最大回数を200に設定してみました。

from sklearn.linear_model import LogisticRegression logreg = LogisticRegression(max_iter=200).fit(a_train, b_train) score = logreg.score(a_test, b_test) print('Test set score: {}'.format(score))

すると警告は出ず、モデルの評価だけ表示されました。
品種判別させる学習モデルができました!

学習モデルの作成と評価 画像05

さいごに

以上でアヤメの品種判別分類を学習させることができました。
次はADSの特徴を生かしたモデルの構築・評価ができるような記事を書いていきたいと思います。
最後までお読みいただきありがとうございました。

 


RECENT POST「OCIで作ってみた」の最新記事


OCIで作ってみた

OCVSにブロック・ボリュームをアタッチして、vSphereのデータストアに追加してみた

OCIで作ってみた

Fn Projectを使用したAPI開発

OCIで作ってみた

OCVSをデプロイしてみた 前半

OCIで作ってみた

OCVSをデプロイしてみた 後半

~Part2~ OCIのデータ・サイエンスを使ってアヤメを品種判別してみる