2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

scikit-learnによる機械学習実装 ~ iris編 ~

Last updated at Posted at 2021-02-17

初めに

内容

scikit-learnを用いた機械学習を行います。
データセットはscikit-learnから提供されるデータセットを使用します。

本記事では「iris」を取り扱います。

Bostonデータセットの記事はこちらです。
diabetsデータセットの記事はこちらです。
digitsデータセットの記事はこちらです。
その他のデータセットは別の記事にて更新しようと思います。

対象

主に初心者向けです。が、入門向けではないです。
本記事は友人に向けて作成してますが、
「機械学習したい」と思っている方にも読んでもらえるように書いています。
実装に関しての解説は記載しますが、アルゴリズムなどの解説は(基本的に)しませんのでご理解のほどを。

環境

  • Google Colaboratory
  • Python 3.6.9
  • sklearn 0.22.2

ローカルで環境をそろえるのは難しいので(Dockerやクラウドを使えばできますが)
今回はColaboratoryを用います。
もし、colaboratoryの使い方がわからない場合などは、各自調べていただきたいです。
(たくさん記事があるので大丈夫かと...)
ローカルでも同じようにコードが書けるはずなので参考にしてください。


irisデータセットにつて

ここからはpythonを用いてirisデータをざっくり確認していきます。
ライブラリのインポート、データの読み込み、先頭5行の表示を一気に書きます。

from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()
data = iris.data
feature_names = iris.feature_names
df = pd.DataFrame(data=data, columns=feature_names)
df.head()

このような表が生成されるはずです。
image.png

  • sepal length (cm) : がく片の長さ
  • sepal width (cm) : がく片の幅
  • petal length (cm) : 花弁の長さ
  • petal width (cm) : 花弁の幅

今回のデータセットではこの4つが説明変数になります。

df.shape # => (150, 4)

データは150件あることが確認できますね。

説明変数を確認したので、次は目的変数を見ましょう。

target = iris.target
target_names = iris.target_names
print(target_names) # => ['setosa' 'versicolor' 'virginica']

targetに3つの品種があることがわかります。
(setosa, versicolor, virginica がそれぞれ品種名です)

説明変数と同じようにデータフレームに入れてましょう

df_target = pd.DataFrame(data=target, columns=['target'])
df_target.head()

次のような表が表示されます。
image.png
目的変数にどのような値が入っているかは次のように確認できます。

df_target['target'].unique() # => array([0, 1, 2])

数値はtarget_namesのインデックスになっています。

  • 0 : setosa
  • 1 : versicolor
  • 2 : virginica

機械学習

irisデータセットなのでわざわざ前処理は行いませんが、
実際には行うべきなので、どのような手法があるか各自調べてみましょう。

データの分割

irisデータを学習用とテスト用に分割する必要があります。

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(df_data, df_target)
print('x_train : ', x_train.shape) # => x_train : (120, 4)
print('x_test : ', x_test.shape) # => x_test : (30, 4)
print('y_train : ', y_train.shape) # => y_train : (120, 1)
print('y_test : ', y_test.shape) # => y_test : (30, 1)

scikit-learnではtrain_test_split()で簡単に分割可能です。
デフォルトで25%のデータがテストデータになります。
変更する場合は引数にtest_sizeを追加しましょう。0.2~0.4がおすすめです。

学習

学習モデルを作成しましょう。今回はRandomForestを利用します。

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()

学習にはfitメソッドを使用します。

model.fit(x_train, y_train)

推論

学習したモデルで予測をしましょう。
predictメソッドで推論できます。

pred = model.predict(x_test)

最後にモデルの精度がどれくらいかを確認して終わります。
精度の確認にはaccuracy_scoreを使用します。

from sklearn.metrics import accuracy_score
accuracy_score(y_test, pred) # => 0.9736842105263158

精度は 97.3% でした。
train_test_splitで学習データはランダムに分けられますので予測精度は異なっていると思います。

最後に

今回、特徴量の選定などは行いませんでしたが、機械学習において特徴量の選定は大事です。
その他の前処理と合わせて、各自調べてみましょう。

数時間でまとめたので全体的には簡素になっていて申し訳ないです...m(__)m

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?