機械学習に挑戦する① scikit-learn
R5.2月からPythonの勉強をしているプログラミング初心者です。
勉強した内容を備忘メモ程度にアウトプットしていきます。
参考書籍はこちら。
(さすがに全てまるまる写してしまうとまずいので部分的に抽出していきます。)
機械学習に挑戦する
機械学習とは人間が知識を教えるのではなく、コンピュータにたくさんのデータを与えてコンピュータ自身が学習する方法です。
学習方法は主に3種類あります。
1つ目は「教師あり学習」です。これは「問題と答えのペア」を大量に与えて特徴を学習させる方法です。答えのことを「教師データ」と呼ぶので教師あり学習と言います。新しいデータを与えた時、その特徴からそれが何なのか答えることができます。文字認識や音声認識、翻訳などで使われています。
2つ目は「教師なし学習」です。これは答えのない大量のデータを調べるので答えを見つけるための学習ではありません。大量のデータから似たデータをまとめて特徴を抽出したり、グループ分け(クラスタリング)したりする時に使う方法です。
3つ目は「強化学習」です。これは色々試行錯誤させて、良い結果が出た時に「報酬」を与えて強化していく学習方法です。よりよい方法を見つけるための方法で、ロボットの制御や将棋や囲碁などで使われています。例えば将棋のAIなどは何億回も対局してより良い手を学習していくので人間よりも強くなったりするわけですね。
ではライブラリを使って機械学習に挑戦してみましょう。
(ライブラリのインストール方法は割愛します。)
一言メモ
なんかPythonの真骨頂みたいな分野来ましたね。AIを通じて好きなエピソードは藤井総太竜王(当時七段)の指した手を「AIで4億手読ませた段階では5番手にも挙がらなかったのに、6億手読ませると、突如最善手として現れる手だった」というエピソード。しかもAIが6億手かかった手を藤井竜王は23分の考慮時間で指したとか。今後AIは人間を超えていくのは確実だと思いますが、藤井総太竜王のこのエピソードは天才棋士として箔がつく素晴らしいエピソードだと思いました。
学習データを読み込んで表示する
これから作る「手書きの数字を認識するアプリ」は特徴を見て「それが何なのか」を答えるものなので「教師あり学習」で作ります。
大量の「数字の画像」と「それが何の数字か」のペアを与えて、「数字の特徴」を学習させるのです。
学習させるには大量のデータが必要なのですが、今回使用する「scikit-learn(sklearn)」(サイキットラーン)にはすでに学習用のデータがあるのでこれを使います。この中には「手書きの数字画像(data、images)」と「それが何の数字か(target)」がペアで沢山入っています。
まずは、sklearnにどんなデータが用意されているのか確認してみましょう。データを読み込んで、そのデータを表示します。「データの個数」と「1つ目の画像データ」と「1つ目の数字が何なのか」を表示します。
import sklearn.datasets
digits = sklearn.datasets.load_digits()
print("データの個数",len(digits.images))
print("画像データ",digits.images[0])
print("何の数字か=",digits.target[0])
これで出力すると
数字がいっぱい出てきましたね~。
データの個数を見るとsklearnには数字の画像データが1797個入っているようです。
画像データを見ると8x8で数値が並んでいます。これは濃淡を数値で表しています。0が一番明るい白で16が一番黒です。こう見るとうっすら輪っかになっているよう感じがします。
「何の数字か」を見ると0です。このデータは数字の「0」を表しているのです。
一行ごとの解説
参考書籍にも解説がないので正直あまり自信がないのですが解説していきます。
「import sklearn.datasets」これはライブラリのインポートですね。ほぼ毎回出てきますね。
「digits = sklearn.datasets.load_digits()」sklearnの中に入っている学習用データを読み込む命令を変数「digits」に代入しています。
「print("データの個数",len(digits.images))」ここで初めて出てきたlen()関数。これはPythonに標準で備わっている関数のようで、リストの中の個数を数えてくれたりかなり便利な関数のようです。今回の場合はsklearnに組み込まれている学習用データの個数を数えてくれています。便利!
「print("画像データ",digits.images[0])」これは画像データの1番目([0])のデータを開く命令ですね。この命令だと数値が8x8で並ぶことになりますね。
「print("何の数字か=",digits.target[0])」これは画像データの1番目([0])のデータの答えを見る命令ですね。
なんとなくそんな感じかなぁという解説にもなっていない解説…。笑
何か間違いがあればご指摘ください。
まとめ
今回は機械学習ができるライブラリを使ってまずはライブラリのデータの中身を見ていきました。内容がかなりボリューミーなので次回に続いていきます。次回は自分で書いた数字をAIがきちんと数字として判断してくれるか試してみたいと思います!