- 公開日: 2018年09月28日
【Python入門】機械学習をはじめる前に知っておきたい行列
Pythonの基礎学習を終えて、いざ機械学習にディープラーニング、データ分析といってもなかなか難しいもの。
中でも取り扱うデータ操作で悩まれる方も多いのでは。
Pythonでは、CSVファイルにテキストファイル、配列に行列、そしてそれらを効率的に処理するライブラリ、と登場してくる専門用語が満載。
今回は、機械学習を効率よく学ぶために「行列」や「データの取り扱い」についてご紹介したいと思います。
【Python入門】機械学習をはじめる前に知っておきたい行列
Pythonで行列が使われているケース
- 画像認識の機械学習
- ニューラルネットワークでの処理
- ボード系のゲーム
Python学習者の多くは、画像認識や画像解析の機械学習で「行列」に出会うと思います。しかし、「行列」についてなんとなくの知識で学習を進めていくと、チンプンカンプンになる可能性も。
Python入門書などでも配列については紹介されていますが、「行列」については説明が少ないもの。 そして手元には「行列」を駆使した本格的な機械学習本。その結果、Python初学者に対して「行列」知識のギャップで大きなストレスがかかり『挫折』となりかねません。
せっかく Python の基礎を習得したのに、学習目的である「機械学習」で躓くのはイヤですよね。 以下に知識ギャップを埋めるためのメソッドをご紹介していきます。
行列とは
まずは行列の定義について。「何をいまさら」と思う方も多いかもしれませんが、Pythonで扱う「行列」は奥が深いです。
【行列の定義】
エクセルをイメージすると「行列」は簡単な様式のように思うかもしれませんが、言葉やコードで説明しようと思うとチョット難しいもの。 「行列」は、『2次元の配列』という点から広義でいうと「配列の一種」であることが確認できます。今後学習を進めていく上で混乱しないように行列(matrix)と配列(array)を自分の頭の中で整理しておくことは大事です。
以下に Python で行列と配列を表現してみます。
** -- 行列 -- **
matrix = [[1,2,3,4,5],[10,9,8,7,6]]
print(type(matrix))
print(matrix)
** -- 配列 -- **
array = [1,2,3,4,5]
print(type(array))
print(array)
行列については確かに行と列で構成されているデータなのでしょうが、あまりにも今までいてきたエクセルなどの行列と見た目が違うので、ちょっと抵抗を感じますよね。 ここで少し行列の項目でつまづきやすい点を整理しておきます。うまくかわして下さいね。
Python初学者が押さえておきたい行列のポイント
見た目
Pythonに限らずプログラミング処理でよく登場してくる行列ファイルの CSV。このCSV、普段はエクセルやGoogleシートなどの表ソフトで見ていますでしょうか? 以下に同じ CSVファイルを異なるソフトで開いた結果を紹介します。
見た目は異なりますが、すべて同じデータ。チョット不思議な感じがしますよね。この違和感を感じている内は、チョット「行列」処理が疲れやすいかもしれません。今一度「CSVとは」を再認識しておく必要があるかもしれませんね。
ライブラリやフレームワークによる混乱
機械学習などで「行列」が登場する段階では、複雑なアルゴリズム処理に当たり前のように行列が使われているケースをよくみます。 この時 scikit-learn や Pandas、Numpy、scipy など複数のライブラリやモジュールが使用。 どれも機械学習に必要なライブラリ、モジュールであることに変わりはありませんが、役割は違ってきます。
- scikit-learn は機会学習用のフレームワーク
- Pandasは、データ解析ライブラリ
- Numpyは、scikit-learn用のデータを作成する数値計算ライブラリ
- Scipyは、数値計算補助ライブラリ など
つまり「行列」学習や処理で注意するライブラリとしては、主に Pandas と Numpy になるんですね。また機械学習に伴う行列学習であれば、scikit-learnとの関係からNumpyになることが多いです。
要は、複雑な機械学習処理に加えて乱立する Python のライブラリやモジュールに惑わされないようにすることが必要。これには正直学習時間とある程度の慣れが必要になると思います。
データ加工が意外と難しい
エクセルなどの表計算ソフトで行や列、セルの値を変えたり追加したりすることは容易。しかし、プログラム上でデータを追加したり、変更したりするとなると色々乗り越えないといけない学習要素が登場してきます。恐らく最初にぶつかる壁は「数値」と「文字」が混在したデータの取り扱い。 エクセルなどの表計算ソフトでは気にもしなかったことを、気をつけないといけなくなります。
また標準のPythonモジュールで行列を加工する場合と Numpy などのライブラリを用いて行列加工する場合では、プログラム処理が違ってきます。はじめの内は参考書などの写経で難なくプログラム処理できたとしても、自分で行列をプログラムしようとした時、データセットしようとした時、事前に「処理がチョット複雑になる」という認識を持っておかないと、大きなストレスとなって開発が遅れる可能性も。
試しにPython標準モジュールと Numpy で CSV ファイルにデータを追加して比較してみます。 同じデータ追加の処理でも、コードが違ってきますね。
** -- Python標準モジュールで CSV にデータ追加 -- **
import csv
csvfile = open('mini_data.csv')
for row in csv.reader(csvfile):
print(row)
print('---------------------')
col1 = 3333333333
col2 = 777777777
col3 = 8888888888
with open('mini_data.csv', 'a') as File:
writer = csv.writer(File)
writer.writerow([col1, col2, col3])
File = open('mini_data.csv')
for row2 in csv.reader(File):
print(row2)
csvFile.close()
** -- Numpyで CSV にデータ追加 -- **
import numpy as np
filename = 'mini_data.csv'
data = np.genfromtxt(filename,delimiter=',')
print(data)
print(data.size)
print('-----------------------')
data = np.append(data, [[3333333333,777777777,8888888888]],axis=0)
np.savetxt(filename, data)
print(data)
print(data.size)
Pythonで「行列」が登場した時、「行列」を使ってプログラム処理をしようと考えた時、上記のようなことを事前に踏まえておくとスムーズな学習に期待できます。逆にエクセル感覚の「行列」でいくと、予想以上の学習負荷と時間で萎えるかもしれません。
ExcelでなくCSVな理由
ここまで読んで「そんなに行列の取り扱いが大変なら、エクセルを使えばいいじゃん」と思われた方も多いのでは。確かに見慣れたエクセルでデータセット、機械学習できれば学習時間を短縮できていいと思います。しかし、エクセルには”上限”があることをご存知でしょうか?公式サイトで公表されているエクセルの仕様について以下にご紹介。
項目 | Excel | CSV |
行と列の上限 | 1,048,576行 × 16,384列 | 上限なし |
容量の上限 | 32bit 2GB 64bit 上限なし |
32bit 2GB 64bit 上限なし |
参考ページ:Microsoft
100万行、というと想像つかない行数ですが、Pythonの機械学習ではビッグデータを扱うことも。そのとき上限がない方が安心ですよね。
また同じ内容のデータもエクセルより CSV の方が、ファイル軽いです。
項目 | Excel | CSV |
iris | 8.6 KB | 4.0 KB |
BigDataSample | 8.2 MB | 6.4 MB |
その他には、CSVは表計算ソフトがなくてもテキストソフトがあればデータを視聴できたり、Numpyを使って scikit-learn 用データに使えたりと開発側にとっては好都合なことばかりです。
以上のことより、開発サイドではエクセルでなく CSV が好んで使用されますね。ただし、Microsoft社提供の「Azure Machine Learning」であればエクセルを使って機械学習を実行可能です。
Numpy が使われる理由
データセットや行列計算には、よく Numpy というライブラリが使われます。主な理由は以下のことでしょう。
- 機械学習ライブラリの scikit-learn は、基本 Numpyで処理したデータを取り扱い
- Numpyで下処理したデータは、演算速度が早い
機械学習の基礎でよく登場してくるライブラリの scikit-learn。こちらで扱うデータは、Numpyで下処理したデータが基本。
そして機械学習の中でも難易度の高いディープラーニングを経験された方なら分かると思いますが、プログラムの処理時間って結構かかりますよね。数字認識の MNIST でも数分かかる処理が、動画やもっと大きい画像処理となるとすごく時間がかかります。その時 Numpy でデータ処理を行っておくと、早い、というわけです。
** -- Numpy VS TensorFlow VS Pure Python Speed Competision-- **
項目 | 処理時間 |
Numpy | 0.32 s |
TensorFlow | 1.2 s |
Pure Python | 18.65 s |
データ引用:Real Python
この他にはデータ編集機能が豊富だったり、演算機能が備わっていたりと余計なコードを足さなくても、Numpyの機能で処理できるというメリットがあります。
\AIエンジニアに必要なスキルが身に付く/
まとめ
Pythonというかプログラムで扱う行列は、多くの場合で思っている以上に大変です。それはエクセルで行列処理に慣れているためと考えます。
ここは精神論になるかもしれませんが、「大変」だからこそ学ぶことも多いではないでしょうか。
ライブラリや for
文などのループ処理、それから CSV や文字フォーマットについてなど、行列には広範囲な知識が必要に。頭では直ぐにイメージできることも、Pythonのプログラミング下では複数の要素が絡み、頭の中を混んがらせてきます。
混乱しないためも Python の基礎は大事と思いますし、応用という意味でも基礎は欠かせません。「Pythonの基礎、自信ないな・・・」という方、一度 CodeCampで Python の基礎を固めてみませんか? 「オンライン × マンツーマン」の CodeCamp なら効率よく学習を進めていけると思いますよ。
- この記事を書いた人
- オシママサラ