ボストン市の住宅価格を線形回帰で予測する

教師あり学習である回帰を利用して実際のデータを予測しましょう。

データの意味は以下の表に書いてあります。

引用:https://pythondatascience.plavox.info/scikit-learn/scikit-learn%E3%81%AB%E4%BB%98%E5%B1%9E%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88

coefficient a = 9.311328
intercept b = -35.994349

RMSE train : 6.492892

RMSE train : 6.858064

価格は1000ドル単位なので、約7000ドルほど誤差があるようです。

今回は部屋の数のみ考慮しましたが、他の変数も考慮すれば、精度が向上する可能性はあるでしょう。

教師あり学習について

教師あり学習には以下の2つがあります。

・回帰
数値を予測する手法です。
例えば、明日のアイスクリームの売上を天気予報の最高気温から予測する時に使います。

・分類
データをカテゴリ分けする手法です。
例えば、人の顔が写った画像が田中さんなのか鈴木さんなのか分類する時に使います。

機械学習について(初心者向け)

こんにちは。

久しぶりの投稿になりますが、今回は機械学習について初歩的な解説をしていこうと思います。

まず、人工知能・機械学習・深層学習の位置づけを整理しますと、以下の図のようになります。(よく見る図かも、、、)

機械学習概観

第三次人工知能ブームの火付け役となった深層学習は機械学習の一部です。
機械学習と深層学習は別々ではないのです。

では、機械学習にはどのようなものがあるのでしょうか。
次の図を見てください。

そうです。
機械学習には3種類の学習方法があるのです。
順番に見ていきましょう。

①教師あり学習
これはインプットとアウトプットとの対応関係を学習する方法です。
例えば、動物の画像認識について考えてみましょう。
この場合は動物画像(インプット)と犬、猫などのラベル(アウトプット)との対応関係を学習します。

②教師なし学習
これはインプットデータの特徴を学習する方法です。
例えば、インプットデータとして20代の男女の身長と体重を考えてみましょう。
縦軸を身長、横軸を体重としてデータをプロットすると、データは2つのグループに別れるでしょう。
教師なし学習であるクラスタリングという手法を使うと、
データの特徴を学習し、データを2つのグループに分けることができます。

③強化学習
エージェントがゴールに沿った行動をとると報酬を与えることで行動規則を学習する手法です。
例としては自動運転が分かりやすいでしょう。

 

今日はここまでですが、次回は教師あり学習について詳しく見ていこうと思います。

Progate

最近プログラミング学習サイトProgateを利用してRuby on Railsを勉強していました。

初めてProgateを利用したのですが、今ではお気に入りのサイトです。

ネットに繋がりさえすればブラウザ上でコーディングから実行までできてしまうため、環境構築の必要がないところが楽です。

また、プログラムの説明をするスライドが分かりやすいため、理解に困ることがありません。

そして、学習を進めるとレベルが上がるため、達成感を感じやすくなっています。

twitterのようなSNSサービスをRuby on Railsで作成するという内容で、最後までやり通したので、次は以下のサイトで勉強しようと思います。

https://railstutorial.jp/chapters/beginning?version=5.1#cha-beginning

「~激論!AI時代の幸せな生き方とは?!~」について

久しぶりにこの動画を見返してみました。2回くらい。

落合陽一さんや堀江貴文さんがAIについてどう考えているのかを確かめたいと思ったからです。

印象に残ったことをつらつらと書きます。

まず、「AIは知能をもつのは難しいのでは?」という疑問を持つ人が多いとおもいますが、例え知能を持たないとしても、

深層学習のような条件反射的に解くAIが湯水のように大量にあれば、それは十分シンギュラリティと呼んでよいだろうと思いました。

なぜなら、世の中の仕事の大半はあるパターンによって解決できるものだと思うからです。

深層学習のモデルを作成するのは人間の仕事だと思いますが、将来的にインプットとアウトプットを用意すれば、

最適なモデルを自動生成することができるだろうし、一度できたモデルは流用することができるので、

モデルが蓄積されればされるほど、モデル作成すらやらなくてよくなるでしょう。

そして、すごいのは、このモデルは世代を超えることができるのです。自分たちが作成したモデルを子供達に受け継がせることができます。

例えば、「生体データ」がインプットで「投与すべき薬」をアウトプットとするAIを作ることができれば、子どもたちは薬剤師になるために勉強しなくても、

そのモデルを使用すればよくなります。これは薬剤師の判断能力が継承可能になったということです。

こうなると、教育は変わらざるをえないでしょう。

人間の定義が変わるという二人の言葉が心に残りました。

Machine Learning 15minutes

「第22回 Machine Learning 15minutes!」に行ってきました。

深層学習の研究者や、元googleの機械学習エンジニア、ロボットエンジニアなどなどいろいろな人が登壇されていましたが、

その中で一際目立ったのが人間中心設計専門家の羽山さんでした。

スライドの内容がとても分かりやすく、プレゼンもうまいので、

気づいたらプレゼンが終わってしまったと思うくらいに話に引きこまれました。

以下がそのスライドです。

 

羽山さんは他のイベントでモテについての発表もしているのですが、こちらもとても面白かったです。

「モテの高みの先に広がっていたのは、寂寞とした砂漠だった。」

どいうことか気になる方はぜひスライドを見てください。

 

人工知能とブロックチェーン

人工知能とブロックチェーンについて分かりやすく解説している動画があったので、紹介します。

印象に残ったのは動画の24:20あたりのスライドでSirajが解説しているOpenMinedの仕組みです。

データサイエンスをしたいけど、データがなかなか手に入らないため、モデルの訓練ができないというのはよくあると思います。データを提供する人にとってはプライバシーが気になりますから、、、

そんな問題をOpenMinedは解決しようとしています。

データがもっとオープンになれば、人工知能の活用が進み、新しいサービスを提供したり、作業を自動化することができると思うので、OpneMinedの今後の動向に注目していきたいです。

OpenMinedのgithub
https://github.com/OpenMined/Docs

スマートコントラクト

ブロックチェーンの勉強をしていると、スマートコントラクトという言葉が出てくるのですが、
これがいまいちイメージが湧きにくいです。

スマートコントラクトの例として自動販売機がよく挙げられますが、それでもピンと来ません。

ということで以下のサイトを参考にして、簡単なスマートコントラクトを書いてみました。

https://book.ethereum-jp.net/first_use/contract.html

簡単にいうと、スマートコントラクトというのはオブジェクト指向のクラスのようなもので、クラス変数とメソッドを持っています。

今回はSingleNumRegisterというクラス(コントラクト)を作成しました。
クラス変数は整数値を格納するものが1つ。
メソッドはクラス変数を書き換えるものと読み込むもので2つ。

コントラクトの実行までの流れは以下の通りです。

1.コントラクト・コードの作成

2.コントラクト・コードのコンパイル

3.「Contract」アカウントを作成

4.スマートコントラクトへのアクセスと実行

1~4をやってみると最初よりはスマートコントラクトのイメージが湧いてきました。

例えば、雇用契約をスマートコントラクトで表現するとすれば、
クラス変数には契約内容を格納する変数(String型)と、同意するかどうかの変数(boolean型)を用意し、
メソッドには読み書きできるものを用意すればよいのかなと思いました。

ただ、その場合誰が採掘してくれるのだろうかという疑問は残りました。

スマートコントラクト以外では、
Dappsにも興味があるので、以下のサイトでゾンビと一緒に勉強しようと思います。

https://cryptozombies.io/jp/

ベイズ推定

ベイズ推定は個人的に面白い考え方だなと思うので、今日はこの話をします。

ベイズ推定とは「今までの経験と、新しい情報からある事象の確率を推定するもの」です。

例えば、あなたがお医者さんだとします。あなたの目の前には患者さんAがいて、あなたはAさんが健康が否か判断する必要があります。

1. 今までの経験
・診察に来る人の8割は健康、2割は不健康(よって現時点ではAさんが健康である確率は80%)
・健康な人のうちで喫煙者は4割存在する
・不健康な人のうちで喫煙者は8割存在する

2. 新しい情報
あなたはAさんに喫煙しているかどうか聞いてみました。すると、喫煙していることがわかりました。

3.確率推定
今までの経験と新しい情報からAさんが健康である確率は約67%となりました。

今までの流れを図でもう一度解説します。
青は健康エリア、オレンジは不健康エリアです。
①は喫煙エリア、②は禁煙エリアです。

新しい情報が来る前はAさんが健康である確率は80%でした。
上の図でいうと、青①②とオレンジ①②の面積の割合が4:1だからです。

そして。Aさんが喫煙してるという情報が得られたことによって、起こりえるのは青①かオレンジ①です。
青①とオレンジ①の面積の割合は2:1です。
よってAさんが健康である確率は2/(2+1) = 0.666…より、約67%です。

最初80%であった確率が新しい情報を得たことで、約67%に更新されました。

これがベイズ推定の考え方です。

参考文献↓

gensim

自然言語処理のプログラムを書くなら、gensimというライブラリがとても便利です。

例えば以下のような分かち書きされた2つの文章があるとします。

texts = [[“羽生”, “竜王”, “が”, “藤井”, “五段”, “に”, “負け”, “ました”],
[“羽生”, “さん”, “は”, “金メダル”, “を”, “取り”, “ました”]]

 

この文章を辞書に登録するのは2行で完了してしまいます。

from gensim import corpora
dictionary = corpora.Dictionary(texts)

辞書の中身は以下のように、単語ごとにIDが振られています。

{‘が’: 0, ‘に’: 1, ‘ました’: 2, ‘五段’: 3, ‘竜王’: 4, ‘羽生’: 5, ‘藤井’: 6, ‘負け’: 7, ‘さん’: 8, ‘は’: 9, ‘を’: 10, ‘取り’: 11, ‘金メダル’: 12}

 

bag_of_wordsを作成するのも簡単。

bows = []
for i, text in enumerate(texts):
bows.append(dictionary.doc2bow(text))

bowsの中身は(ID, 出現回数)となっています。

[[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1)], [(2, 1), (5, 1), (8, 1), (9, 1), (10, 1), (11, 1), (12, 1)]]

 

昔、大学での自然言語処理の授業では、rubyを使って文章分類のコードを作成しましたが、
その時はbag_of_wordsを作るための関数を自分で定義していました。
今なら絶対pythonとgensimを使いますね。

自然言語処理がしたいという人はぜひ活用してみてください!