【コード公開】【Python】機械学習入門〜構造化データを分類・評価〜





機械学習については一度記事にしているのですが、今回は分類器も作成する記事構成となっているので、ぜひ参考にしていただければ幸いです。

 

独学に限界を感じたなら...
とりあえず独学でプログラミング学習を始めたけど、右も左も分からずあなたの時間が無駄に終わるどころか挫折するかもしれません。

あなたが時間を無駄にした分を回収したいなら【Python】2022年最新!おすすめのオンラインプログラミングスクールをご確認ください!

※期間限定で学習ロードマップを記載しています!

機械学習とは

改めて機械学習(machine learning)とは、人工知能における研究課題の一つになります。人間の脳が自然に行なっている「学習」の能力をコンピュータによって実現しようと言う手法になります。

 

今回、具体的な例を下記に記していこうと思いますが、まずは準備段階として今回のタイトル内容に対して解説を行なっていきます。機械学習をざっくりプロセスベースで説明すると、ある程度の量があるサンプルデータを入力して解析を行います。

その際、データの中に一定の規則であったりルールが存在していないか調べていきます。そして、見つけ出した規則や特徴・ルールを基に別のデータを分類したり、将来を予測したりするわけですね。

 

▼ 教師あり学習

「教師あり学習」とは、事前に与えられたデータを基に学習を行う手法です。教師あり学習では一般的にデータを入力した際、そのデータが何に分類されるのか、答えとなるラベル(タグ)とデータをセットで与えて学習させます。

 

▼ 教師なし学習

「教師なし学習」とは、「教師あり学習」とは違い、出力すべきものがあらかじめ決まっていないという点で大きく異なります。

データの中に存在する本質的な構造を抽出するために用いられます。つまり、与えられたデータを外的基準なしに自動的に分類するわけですね。

 

▼ 強化学習

「強化学習」とは、現在の状態を観測して、取るべき行動を決定する問題に利用します。

「強化学習」は「教師あり学習」に類似していますが、完全な答えが提示されていないという点で異なります。「強化学習」は、対象の問題と環境(状況や状態)を利用します。対象のもんだいは環境を観察し、それに基づいて意思決定を下します。

すると環境が変化して対象の問題に何らかの報酬が与えられます。対象の問題は、より多くの報酬を得るたびにより良い行動を学習していきます。

 

機械学習の応用分野

近年、機械学習をお応用したシステムが増えてきていますが、その機械学習を利用して何ができるのかざっくり説明します。

 

▼ クラス分類

与えられたデータにラベル(タグ)を付与して分類することができます。例えば、迷惑メールの分類や、文字の認識、画像判定等です。

 

▼ グループ分け – クラスタリング

値の類似性を基にしてデータを複数のグループに分けることができます。例として、あるユーザーをその嗜好によってグループ分けを行い、それによってユーザーの嗜好に合わせたダイレクトメールの送信に活用するなどです。

他にも、株におけるチャート分析にて、チャート図を銘柄ごとにクラスタリングし、酒田五法などのチャート分析に関わる判断手法に酷似しているものとそうでないものに分けることができます。

 

▼ 推薦

与えられたデータ群から異なる情報を推薦するものになります。ネットショッピングで、ユーザーの嗜好から別の商品を推薦を行う昨日などに利用されます。みなさんもネット通販などであなたにオススメの商品はこれみたいなので日常的に見られているかと思います。

 

▼ 回帰

過去のデータを基に将来の数値を予測するといった手法になります。ある商品の販売予測や株価の変動、ある機器の異常検知などを予測するのに用いられます。

 

▼ 次元削減

データの特徴を維持しつつ、データ量を減らすことができるものです。これは、ある情報を保持しつつ、高次元のデータを低次元のデータに変換することを指します。データの可視化や、構造抽出、計算の高速化、メモリ節約等に利用されます。

 

過学習について

「過学習」とは、訓練データは学習されているものの、未知のデータに適合していない状況・状態を指します。つまり、訓練データに依存しすぎて、それ以外のデータに対して正しい判断ができなくなってしまうわけです。

これは、機械学習にとって避けなければならない事象になります。訓練データではかなりの精度評価が行えているのに対し、本番運用の中で、未知のデータに全く利用できないモデル構築を行ってしまった状況となるわけです。

 

「過学習」が起きる理由としては以下のことが挙げられます。

・データが少ない(あるいは偏っている)ケース
・モデルに対して問題が複雑なケース

前者は、教師データの件数を増やすことで解決できる可能性があります。後者は、問題も含めてより適切なモデルあるいは手法の選択を考える必要があります。

 

手法と学習データについて

さて、今回作成するモデルですが、まず利用する手法としてクラス分類を選択しました。

一番わかりやすくポピュラーな手法だからですね。実際に、人工知能(厳密的には拡張知能ですが)であるWatsonのNLCと呼ばれるAPIもこのクラス分類をより高度化したプログラムを実装しているので、応用していけばかなりの機械学習システムにもなると思います。(まあ個人レベルで作れるものは限界があるかと思いますが、考え方的には方向性は一緒です。)

 

次に、利用するサンプルデータについてですが、よく本などでも機械学習のサンプルとしてよく利用されるアヤメの品種に関するデータをここでは利用します。Googleで、iris.csvと検索すれば、ネット上にデータが落ちているので取得して利用してみてください。

また、機械学習でもっとも面倒なのが、学習データの収集・整形となります。そのため、ある程度出来上がったデータで機械学習に慣れてから自分なりに応用プログラムを作成していただくと理解しやすいと思います。

 

プログラムの概要

 

★ classification.py

■ 処理の流れ
1. csvファイルを読み込む
2. 任意の列を抽出
3. 学習用とテスト用に分割
4. データを学習・予測
5. 正解率を求める
6. 未知のデータを予測

 

import pandas as pd
import numpy as np
from sklearn import svm, metrics, cross_validation
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)

 

まずはじめに、必要なライブラリをインポートします。pandasはデータの読み込みや分割を行うのに便利なモジュールになります。

さらに「scikit-learn」と呼ばれる機械学習のフレームワークをインポートします。また、今回はscikit-learnに用意されているk-最近傍法を用います。インポートする前に、事前に使えるようインストールを行ってください。

 

# csvファイルを読み込む
csv = pd.read_csv("iris.csv")

 

次に、データ収集を行ったiris.csvをPandasを用いて読み込みます。

 

# 任意の列を抽出
csv_data = csv[["SepalLength", "SepalWidth", "PetalLength", "PetalWidth"]]
csv_label = csv["Name"]

 

二つの変数にて、任意の列を抽出します。このcsvファイルには先頭行にヘッダーが記載されているため、このヘッダーを利用して任意の列を分割します。

 

# 学習用とテスト用に分割
train_data, test_data, train_label, test_label = \
cross_validation.train_test_split(csv_data, csv_label)

 

訓練データとテストデータに分割するのは面倒な作業になります。そこで、この作業を簡単に行うメソッドがscikit-learnに用意されているので、利用したいと思います。

それが、cross_validationモジュールにあるtrain_test_split()メソッドです。このメソッドを利用して訓練用データとテスト用データを分割します。

 

# データを学習し、予測
clf = svm.SVC()
clf.fit(train_data, train_label)
pre = clf.predict(test_data)

 

ここでは、SVMというアルゴリズムを用いて機械学習を行います。そのために、SVMのオブジェクトを得てfit()メソッドを用いて学習します。fit()メソッドは第1引数に学習するデータの配列、第2引数にラベルの配列を与えます。

次に、predict()メソッドを用いて学習した結果を基にデータを予測します。predict()メソッドに予測したいデータの配列を与えるとデータの数だけ予測結果を返します。

 

# 正解率を求める
ac_score = metrics.accuracy_score(test_label, pre)
print("正解率 =", ac_score)

 

ここでは、分類結果と正解を照合して正解率を求めます。

このように訓練データとテストデータを分けることは、そもそも訓練データでどれだけの精度があったとしても、実際に未知のデータを使って予測するとうまく分類できないということを避けるためです。

そこで、最後に未知のデータを使用してうまく学習できているか確認を行います。

 

# 未知のデータを予測
newdata = np.array([[5.8,2.6,4.0,1.2]])
print("newdata.shape: {}".format(newdata.shape))

knn.fit(train_data, train_label)

prediction = knn.predict(newdata)
print("Predicted target name: {}".format(prediction))

 

ここで、新たに未知のデータとして変数newdataを作成し、分類できるか行ってみます。

すでに精度評価を行っている分類器なので、問題ないと判断しどのような結果を返してくれるか試しているだけですね。上記では、サンプルの個数1個と特徴量4個となっています。

 

★ classification.py

# classification.py

import pandas as pd
import numpy as np
from sklearn import svm, metrics, cross_validation
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)

# csvファイルを読み込む
csv = pd.read_csv("iris.csv")

# 任意の列を抽出
csv_data = csv[["SepalLength", "SepalWidth", "PetalLength", "PetalWidth"]]
csv_label = csv["Name"]

# 学習用とテスト用に分割
train_data, test_data, train_label, test_label = \
cross_validation.train_test_split(csv_data, csv_label)

# データを学習し、予測
clf = svm.SVC()
clf.fit(train_data, train_label)
pre = clf.predict(test_data)

# 正解率を求める
ac_score = metrics.accuracy_score(test_label, pre)
print("正解率 =", ac_score)

# 未知のデータを予測
newdata = np.array([[5.8,2.6,4.0,1.2]])
print("newdata.shape: {}".format(newdata.shape))

knn.fit(train_data, train_label)

prediction = knn.predict(newdata)
print("Predicted target name: {}".format(prediction))

 

出力結果

出力結果は以下の画像になります。

 

最後まで読んで頂き、ありがとうございました。

実務における精度の高い成果をデータから算出したい場合に、おすすめするPython本は以下のものになります。

・Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

・すぐに使える! 業務で実践できる! Pythonによる AI・機械学習・深層学習アプリのつくり方

・直感でわかる! Excelで機械学習

 

機械学習や分析の分野に興味があり、pythonを学びたいと思っている方は是非こちらもどうぞ↓

誰でも30日間で習得出来るpython学習法



ABOUTこの記事をかいた人

sugi

大学卒業後、IT企業に就職を果たす。システム開発・人工知能に触れながら大手企業と業務をこなす。2年半後脱サラし、フリーランス活動経験を経て 2019年2月から起業し、今に至る。 自社サービス及び製品を開発、ブログ収入、クラウドソーシングなど、多方面で売り上げを立てている。