Pythonは機械学習用のライブラリが充実していて、初心者の方でもライブラリを使っていけば、簡単なものであれば学習から予測まで難なく実装できてしまうと思います。初心者であれば、まずは、学習用データと評価用データを最低限のサイズにして、Pythonのライブラリの動作を追っていくと、理解が早いと思います。
今回は初めて機械学習に触れた頃を思いだして、その頃に書いたサンプルコードを紹介したいと思います。

スポンサーリンク

Pythonのscikit-learnの使い方を簡単に紹介

Pythonには機械学習用のライブラリがいくつかありますが、ここではscikit-learnの使い方を簡単に紹介したいと思います。
順を追って説明していきたいと思います。

データセットをcsvファイルで用意

まずは、学習用と評価用のデータセットを用意しましょう。
今回は、ある架空上の飲食店の気温と天気と一番売れる商品との関係を、下記の表のように用意しました。
(あくまでも架空上の例として、作成したものです)
ある日の気温と天気から、一番売れる商品を予測するのが目的になります。

気温 天気 一番売れる商品
30 0 :晴れ 0 :かき氷
31 1 :雨 1 :アイス
20 2 :曇り 2 :ドーナツ
16 0 :晴れ 2 :ドーナツ
35 2 :曇り 0 :かき氷
25 1 :雨 2 :ドーナツ
13 1 :雨 3 :お汁粉
22 0 :晴れ 2 :ドーナツ
28 2 :曇り 1 :アイス
32 2 :曇り 1 :アイス
10 0 :晴れ 3 :お汁粉
38 1 :雨 0 :かき氷

上記データセットをcsvファイルで表現し、下記のようにin.csv を用意します。

 $ cat in.csv 
30,0,0
31,1,1
20,2,2
16,0,2
35,2,0
25,1,2
13,1,3
22,0,2
28,2,1
32,2,1
10,0,3
38,1,0 

スポンサーリンク

まずは、scikit-learnのモジュールをimport

続いてPythonの実装についてです。
まずは、必要なモジュールをimportして行きます。
numpyとsklearnを使っていきますので、インストールしていない場合はインストールが必要です。
参考:ModuleNotFoundError: No module named 'sklearn'のエラーメッセージが表示

 $ cat sample.py 
#!/usr/bin/env python3
# coding: UTF-8

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import tree
from sklearn.metrics import accuracy_score

csvファイルのデータセットを読み込む

先程のcsvファイルにしたデータセットを読み込みます。
numpyを使ったcsvファイルの読み込みについては、下記の記事を書いています。
Pythonのnumpyでcsvファイルを読み込む方法

#csvファイルの読み込み
npArray = np.loadtxt("in.csv", delimiter = ",", dtype = "float")
print("csvファイルが格納された配列を出力")
print(npArray)

上記を実行すると、下記のようにprint出力されて、csvファイルが配列に格納されているのが確認できます。
csvファイルが格納された配列を出力
[[ 30.   0.   0.]
 [ 31.   1.   1.]
 [ 20.   2.   2.]
 [ 16.   0.   2.]
 [ 35.   2.   0.]
 [ 25.   1.   2.]
 [ 13.   1.   3.]
 [ 22.   0.   2.]
 [ 28.   2.   1.]
 [ 32.   2.   1.]
 [ 10.   0.   3.]
 [ 38.   1.   0.]]

スポンサーリンク

説明変数の格納

続いて説明変数の格納です。
今回であれば、要因とした気温と天気のデータになります。
1行目と2行目をスライスを使って配列xに格納しています。
列の取得方法については、下記の記事を書いています。
Pythonのnumpy配列をスライスで行と列の取得をする方法

# 説明変数の格納
x = npArray[:, 0:2]
print("説明変数を出力\n", x)

上記を実行すると、print出力されて、配列xに説明変数とした気温と天気のデータが格納されているのが確認できます。
説明変数を出力
 [[ 30.   0.]
 [ 31.   1.]
 [ 20.   2.]
 [ 16.   0.]
 [ 35.   2.]
 [ 25.   1.]
 [ 13.   1.]
 [ 22.   0.]
 [ 28.   2.]
 [ 32.   2.]
 [ 10.   0.]
 [ 38.   1.]]

目的変数の格納

続いて目的変数の格納です。
今回であれば、予測したい一番売れた商品のデータになります。
3列目をスライスを使って取得し、ravel関数で1次元のデータにして配列yに格納しています。
Pythonのnumpy配列をスライスで行と列の取得をする方法

#目的変数の格納
y = npArray[:, 2:3].ravel()
print("目的変数を出力\n", y)

上記を実行すると、下記のようにprint出力されて、配列yに説明変数とした一番売れた商品のデータが格納されているのが確認できます。
目的変数を出力
 [ 0.  1.  2.  2.  0.  2.  3.  2.  1.  1.  3.  0.]

スポンサーリンク

データセットを学習用データと評価用データに分割

train_test_splitを使って、データセットを学習用データと評価用データに分割します。
評価用データを使って予測を行い、学習結果を精度を測定します。
x,yには先程の説明変数と目的変数をセットします。test_size=0.3としているので、3割が評価用のデータとなります。
学習用と評価用のデータはランダムに分割されます。

参考:train_test_split()でValueError: Found input variables with inconsistent numbers of samples: のエラーメッセージ

#学習用データと評価用データに分割
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
print("学習用の目的変数を出力\n", y_train)
print("学習用の説明変数を出力\n", x_train)
print("評価用の目的変数を出力\n", y_test)
print("評価用の説明変数を出力\n", x_test)

x_trainには学習用説明変数、x_testには評価用説明変数、y_trainには学習用目的変数、y_testには評価用目的変数がそれぞれ格納されます。
上記を実行すると、下記のように、データセットが学習用と評価用のデータに分割されているのが確認できます。
学習用の目的変数を出力
 [ 1.  1.  3.  0.  3.  2.  0.  2.]
学習用の説明変数を出力
 [[ 32.   2.]
 [ 28.   2.]
 [ 13.   1.]
 [ 35.   2.]
 [ 10.   0.]
 [ 25.   1.]
 [ 38.   1.]
 [ 16.   0.]]
評価用の目的変数を出力
 [ 0.  2.  2.  1.]
評価用の説明変数を出力
 [[ 30.   0.]
 [ 22.   0.]
 [ 20.   2.]
 [ 31.   1.]]

機械学習用のモデルを選択

今回は、モデルに決定木を採用しました。
下記のように書くだけです。

#モデルに決定木を選択
clf = tree.DecisionTreeClassifier()

実際に学習させる

下記のように、学習用の説明変数と目的変数をセットします。

#学習
clf.fit(x_train, y_train)

スポンサーリンク

評価用データを使って予測する

それでは、train_test_splitで分割して作成した評価用データを使って予測してみます。
下記のように、clf.predictに評価用説明変数をセットします。
clf.predictの戻り値は予測結果になります。

#評価用データを使って予測
predict = clf.predict(x_test)
print("評価結果を出力\n", predict)

実行すると、評価結果(予測結果)が下記のように出力されます。
評価結果を出力
 [ 1.  2.  2.  1.]

下記のように、正解率も出力してみます。
print("正解率を出力\n", accuracy_score(y_test, predict))

下記のように、正解率が0.75と出ました。
先頭の一つが間違っているので、正解率は1/5で0.75となりました。
正解率を出力
 0.75

学習用と評価用のデータはランダムに分割されますので、評価結果は毎回異なります。

いかがだったでしょうか?単純なデータセットだったので学習させるまでもなかったかもしれませんが、まずはこのような最低限のデータと最低限の実装で、動作を追っていくのが、機械学習を学習する近道の一つだと思います。

Pythonのサンプルコード

今回解説したコードを、サンプルコードとして下記に書きます。

 $ cat sample.py 
#!/usr/bin/env python3
# coding: UTF-8

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import tree
from sklearn.metrics import accuracy_score

#csvファイルの読み込み
npArray = np.loadtxt("in.csv", delimiter = ",", dtype = "float")
print("csvファイルが格納された配列を出力")
print(npArray)

# 説明変数の格納
x = npArray[:, 0:2]
print("説明変数を出力\n", x)

#目的変数の格納
y = npArray[:, 2:3].ravel()
print("目的変数を出力\n", y)

#学習用データと評価用データに分割
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
print("学習用の目的変数を出力\n", y_train)
print("学習用の説明変数を出力\n", x_train)
print("評価用の目的変数を出力\n", y_test)
print("評価用の説明変数を出力\n", x_test)

#モデルに決定木を選択
clf = tree.DecisionTreeClassifier()

#学習
clf.fit(x_train, y_train)

#評価用データを使って予測
predict = clf.predict(x_test)
print("評価結果を出力\n", predict)
print("正解率を出力\n", accuracy_score(y_test, predict))

スポンサーリンク