はじめに
機械学習に関する入門サイト見ていると、難しいことが書いてあったりして、知識0の人がとっつきにくい印象があります。
まあテーマとして確かに難しいのでしょうがないですが....
「数学や機械学習の知識が0でも、pythonの知識さえあれば誰でも実装できる」というのを目標に記事を書いていきたいと思います。
今回の記事では難しいことは説明せず、とりあえず機械学習というものに触れてみるというスタンスで、進めていきます。
対象者
・pythonがある程度わかる
・機械学習に興味があるけど、何も知らない
・大学の授業で概要は学んだけど、実際にどう実装すればいいかわからない
環境
python 3.8.5
scikit-learn 0.231
まずはインストール
pip install scikit-learn
csvファイルの読み込みにnumpyを使うのでインストール済みでない方はインストールしてください。
pip install numpy
用語解説
scikit-learnとは
scikit-learn (サイキット・ラーン)(旧称:scikits.learn) はPythonのオープンソース機械学習ライブラリ[2]である。サポートベクターマシン、ランダムフォレスト、Gradient Boosting(英語版)、k近傍法、DBSCANなどを含む様々な分類、回帰、クラスタリングアルゴリズムを備えており、Pythonの数値計算ライブラリのNumPyとSciPyとやり取りするよう設計されている。(wikipediaより)
うん、まあこれを見ても意味がわからないと思うので、今回は簡単に、「機械学習をサポートしてくれるライブラリ」と覚えておきましょう。
SVMとは
サポートベクターマシン(英: support vector machine, SVM)は、教師あり学習を用いるパターン認識モデルの一つである。分類や回帰へ適用できる。
サポートベクターマシンは、現在知られている手法の中でも認識性能が優れた学習モデルの一つである。サポートベクターマシンが優れた認識性能を発揮することができる理由は、未学習データに対して高い識別性能を得るための工夫があるためである。(wikipediaより)
簡単に言うと、下記の画像のように線を引いて、データを分類していく機械学習手法*のことです。
一口に機械学習といっても様々な方法が存在します。
SVM(サポートベクターマシン)はその一つです。
https://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Kernel_Machine.svg/2880px-Kernel_Machine.svg.png
(wikipediaより)
目的変数とは
機械学習で予測したい対象です。
例えば、天気を予測したいときの目的変数は晴れや、曇りや雨などになります。
説明変数とは
予測するために必要な情報のことです。
例えば、天気を予測したいときに必要な、降水量や湿度などがこれにあたります。
データ
データは基本的には数が多いほど精度が高くなりますが、今回はお試しなので、少なめのデータを用意します。
このデータは今年の天気のデータです。
まあ天気データは気象庁のHPにいくらでもあるので、興味が湧いたら見てみてください。
左から、
気温、降水量、日照時間、湿度、天気(0:晴れ、1:曇り、2:雨)
を表しています。
このデータで言うと、気温、降水量、日照時間、湿度までが説明変数、天気(0:晴れ、1:曇り、2:雨) が目的変数です。
6.6,0,8.2,47,0
7.1,0,5.7,57,1
7.1,0,9.3,62,0
8.1,0,4.7,53,1
6.5,0,9.7,54,0
8,0,8.1,42,1
6.6,1.5,0.5,68,2
5.7,21.5,2.7,94,2
11.2,0,9.3,47,0
9,0,7.9,57,1
8,0,4.5,66,1
7.7,0,1.8,66,2
9.1,0,9.3,70,0
9.1,0,8.3,70,0
7.8,11.5,3.6,79,2
7.6,0,4.4,46,1
7.6,0,3.6,58,1
3.8,13.5,0,87,2
7.3,0,8,62,1
8.3,0,9.7,60,0
ソースコード
weatherを自分の好きな値に変えることで、その条件の時の天気を予測することができます。(ただ、データ数が少ないので、精度は悪いです)
weatherの中でも左から順に
気温、降水量、日照時間、湿度
で並んでいるので、この順に条件を入れてみてください。
import numpy as np
from sklearn import svm
# csvファイルの読み込み
npArray = np.loadtxt("data.csv", delimiter = ",", dtype = "float")
# 説明変数の格納
x = npArray[:, 0:4]
# 目的変数の格納
y = npArray[:, 4:5].ravel()
# 学習手法にSVMを選択
model = svm.SVC()
# 学習
model.fit(x,y)
# 評価データ(ここは自分で好きな値を入力)
weather = [[9,0,7.9,6.5]]
# predict関数で、評価データの天気を予測
ans = model.predict(weather)
if ans == 0:
print("晴れです")
elif ans == 1:
print("曇りです")
elif ans == 2:
print("雨です")
実行結果
$ python3 weather_learn.py
晴れです
おわりに
今回もお疲れ様でした。
実際に自分が作ったものがこうして結果を吐いてくれるのは嬉しいものがありますよね。
自分が機械学習に初めて触れたときはあまりの情報量の多さに行き詰まったことが何度もありました。
この記事では、「知識はないけど、機械学習に触れてみたい」という方に向けてわかりやすく書いたつもりですが、疑問点やミスがありましたらコメントください。