さわらブログ

さわら(@xhiroga)の技術ブログ

CourseraのMachine LearningをPythonでやり直す#2

復習した内容+それをどうやってハンド&skleanで実装したかのまとめ

f:id:hiroga_cc:20171221231706p:plain
今回はロジスティック回帰

実装したファイル
github.com

参考資料
qiita.com

ロジスティック回帰

目的変数Yを説明変数Xで説明する回帰分析の手法を分類でも使うための手法。
目的変数Yを 0 ≦ Y ≦ 1 の範囲に収めるため、シグモイド関数を用いて計算結果を変換する。

# シグモイド関数
import math
def sigmoid(z):
    return 1/(1+math.e**(-z))

正則化

説明変数をX2, X3...と増やすことで、100%に近い予測ができるがオーバーフィッティングしてしまう。
オーバーフィットとは説明変数が余分な影響力を持ってしまうことだから、θの値が大きくなりすぎないように工夫すればよい。
そのためには、目的関数でコストを算出する際に、θの2乗を足してしまう。

実装

scikit-learnだとものすごくお手軽。
Pythonに興味ある方はGithub見てください。(正則化サボったけど)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model

# import datasets
df = pd.read_csv("ex2data1.txt", sep=",", header=None) # 説明変数が0,1列目、目的変数が2列目にあるcsvファイル
X = df.values[:,:2]
Y = df.values[:,2:]

logreg = linear_model.LogisticRegression(C=1)
logreg.fit(X,Y)
# 本来なら目的関数の定義と最急降下法のための準備が必要
# fitメソッドを呼ぶだけで良い。

# 予測モデルを用いて散布図の背景に色を塗る。
# メッシュを作成して各点ごとに予測を適用すればよい。
x_min, x_max = X[:,0].min(), X[:,0].max()
y_min, y_max = X[:,1].min(), X[:,1].max()
xx, yy = np.meshgrid(np.arange(x_min,x_max,.02), np.arange(y_min, y_max, .02))

Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure(1, figsize=(4,3))
plt.pcolormesh(xx,yy,Z,cmap=plt.cm.Paired) # カラーメッシュ=要するにモザイク画みたいなもの

plt.scatter(X[:,0], X[:,1], c=Y.ravel(), edgecolors='k', cmap=plt.cm.Paired)
plt.show()

今回はおしまい!次回はいよいよ多クラス分類とニューラルネットワーク

Tech Deep Dive#0でデータグリッドについてお勉強してきた #oratdd

Oracleさんが主催のTech Deep Diveに参加した。次回は未定とのことで、まずは第0回らしい。
connpass.com

ざっくり内容

Oracle技術者のいとうちひろさんが主にクラウド上のアプリケーションで低遅延なアーキテクチャについてプレゼンしてくれた。
大変わかりやすく、結論としては「データへのアクセスをいかに高速化するか。アプリ上の制約(データ整合性の担保・行ロックとか)があるならデータグリッドをどうぞ。なければ単にKVSでもOK」って感じだったと思う。
実測値がたくさん入ったプレゼンで、アプリケーションエンジニアの僕でも理解しやすかった!

Twitter実況も賑わっており、いろんな人に質問に答えてもらってありがたかった。 twitter.com

データグリッドとは

インメモリーの分散KVSかつ式を受け取って実行することもできるものを指すよう。

これはOracle Coherenceではないけど、データグリッドの内部のことが書いてある!
要するにJavaのでっかいプロセスがマップを保持しつつラムダ式を受け取るのを待ち構えてると思えばいいのかな。

www.slideshare.net

Oracle Coherence以外にもOSSを含めていろんな選択肢があるみたいで、まとめてくださってるスライドもあった!(上と同じエンジニアの方のスライド)

www.slideshare.net

スライドによるとこの辺が競合製品らしい。
- Apache GEODO(ジオード) - Apache Ignite(イグナイト) - Oracle Coherence(コヒーレンス) - hazelcast(ヘーゼルキャスト) - Infinispan(インフィニスパン)

でもG2 CROWD(ソフトウェア比較サービス)の評価はOracle Coherenceが一番高いね!(というか他のレビュー件数が少ない)
データグリッドのカテゴリがなくて単にKVSで括られているのを見ると、盛んになるのはこれからのジャンルなのかな?

ともあれ勉強になった!ありがとうございました!

FESTA 2017 by Mashup Awards 参加レポート! #MA_2017

12/16(土)にFESTA 2017に参加したよ!今回は設営/Twitterのボランティア🕊 mashupawards.connpass.com

きっかけ

運営のまなみんさん・伴野さんにTwitter実況ボランティア入りませんか?って誘ってもらったのがきっかけ!
それまでFESTAのことは何となくしか知らなかったけど、Twitter実況楽しそう〜と思って参加することに。

イベントの様子

PRO決勝は空飛ぶ箒がめっちゃかっこよかった

一般決勝で一番記憶に残ったのは個人的にはこれ

プレゼンで発電はじめて爆笑した!

プレゼン眉毛描いた人、プロダクトも普通にすごかった

総評

来年はまなみんさんがリーダー予定の一般社団法人がMAの運営主体になるそうです

そして審査員さんのブログ

参加して

機械学習とハードウェアのプロトタイピングが普通になってきてる流れは開発現場にも来ると思った。

大手ベンダーは機械学習をサービスとして提供することに勤しんでるけど、(まさにWatsonとか)
それより先に自社のエンジニアに機械学習ライブラリの使い方と統計の基礎を学び直させた方がいいんじゃないかな。

ハードウェア製作をSIerみたいな業態でやってる会社さんには明るくないけど、大手ベンダーがそういう会社を取得してもおかしくない流れだと思う。
個人的にもなんか挑戦したいな〜。また一人暮らし始める予定だから、おうちハックを皮切りにハードウェア作ってみよう。

Twitter実況では反省することが多い...座ってツイートするより、(それはもう一人の方が自分より上手だったので)
もっといい写真を体を動かして撮りに行かねばならなかった。

あとは仕組み的なところで、公式アカウントが複数人ログインに厳しかったのも辛かったな...。
複数人が公式アカウントにログインするより、MA公式ツイッタラーを定めてその人がツイート→公式垢はメイン実況+公式ツイッタラーをRT,という構成がいいかもしれないと思う。作品実況なんかは公式ツイッタラーであることがわかる腕章とかあるとやりやすかった...?

ともあれ最高に楽しかったので来年もなんらかの形(願わくば出場者)で参加したい!おしまい。

弊社推しのPython for Data Scienceオンラインコースやってみた

勤務先が推してるオンラインコースがあるらしいことを最近知り、やってみたら結構学びがあった!

きっかけ

最近IBMでは社員にオンラインコースの受講を勧めていて、 クリアするとバッジがもらえる。 「そんなん効果あるのか?」って懐疑派だったんだけど、同期がすごい推してくるのでやったら良かった!

やったこと

最近Kaggleに出るのを目標にしているので、Pythonの基礎をやってみた!
Python 101 for Data Science

中身はCourseraとかUdacityとかとそんなに変わらない。ちゃんとテストもあるよ!
教師が出てきて教えるんじゃないのがちょっと残念かな。(CourseraとかUdacityとかはその辺でやる気を引き出すのがうまい)

学んだこと

特にデータ構造体について発見があった!
行き当たりばったりで勉強してきたのでset型を知らなかった。

>>> s = {1,2,3,}
>>>s
{1,2,3}
>>> e = set([1,2,4,5,5]) # List, Tuple, Setはそれぞれコンストラクタがあり、お互いを引数に取れる。 
>>> e
{1,2,4,5} #重複を許さない

スライスもようやく理解した!

>>> li = [2,4,6,0,1,]
>>> li[0:4:2] # 0番目の要素から4番目の要素に触れるまでを2づつインクリメントして取得
[2,6]
>> li[-5:-1:2] #上記と同じ
[2,6] 

講義とは関係ないけど、help() コマンドが便利だと思った!

>>> a = 1
>>> help(a)
class int(object)
 |  int(x=0) -> integer
 |  int(x, base=10) -> integer
...(以下続く)

>>> b = [1,2,3]
>>> help(b.append) # ここで()をつけない!
Help on built-in function append:

append(...) method of builtins.list instance
    L.append(object) -> None -- append object to end
(END)

世界中のUFO目撃情報をk-mean法でクラスタリング

先に言うとデータの外れ値が邪魔で思ったような結果にはなりませんでした。

やりたかったこと

KaggleにUFOの目撃情報の自由に使えるデータセットがある!

やったこと

使って何かしたかったので、機械学習で教師なし学習をさせてみた。
k-mean法というクラスタリングの手法を使った。

やり方

pandasでKaggle上のcsvを読み込んで、pandasで整形して、sklearnで学習させた。
データは80000件ほどあったのに、読み込みは一瞬で終わった!

結果

gist.github.com

f:id:hiroga_cc:20171209223720p:plain
UFO目撃情報(緯度、経度、継続目撃時間)

グラフ中の緑色の点はゴミデータ。参ったな...。

分かったこと

  • データの正規化が大事。(ここでの正規化はゴミデータを除外する、の意)
    例えば今回は、80000件のデータの中に3件数字列に文字が入っているものがあり、それが邪魔になった。
  • まずはプロットしないと始まらない。
  • k-meanは外れ値にすこぶる弱い。標準偏差とか使って外れ値をどかす方法があるっぽい。

CourseraのMachine LearningをPythonでやり直す #1

そろそろ機械学習に再チャレンジする時が来た!と思い立ち、CourseraのMachine Learningをやり直しています。

背景

実は2016年前半にCourseraのMachine Learningを完走した。当時は業務でプログラミングをした経験がなかったのを考えると我ながらスゴイ。
それ以降何もしてなかったんだけど、Webアプリとか作れるようになって来たし、いよいよ機械学習を組み込みたい!

CourseraではOctaveというMatlab互換のプログラミング言語でやったので、同じ教材を今度はPythonでやる。
目標は...
1. MNIST(手書き数字の画像認識)くらいは手組みで作れるようになる。
2. ニューラルネットワークが出てくるようになったらライブラリを使いこなして頑張る。
3. 上記を踏まえ、Kaggleでコンテスト参加できるようになる!

初回の感想

全8回のうち1回目をやり直した!初回は線形回帰(ある変数とそれによって変化する変数の関係をy=ax+bに落とし込むこと)
楽しいけど本筋関係ないところでつまづきがちなのがいただけない。でもPythonの方がOctaveよりドキュメントは多いね〜!

成果物!

f:id:hiroga_cc:20171209080609p:plain
最小二乗法!

やった内容はどんどん追記していくよ。
github.com

つまづきどころ

  • numpy.ndarrayの.transpose() が、一行の配列には対応していないこと!reshape()っての代わりに使うといいらしい。
  • グラフを出力するときは、一次関数の傾きと切片だけでは出力してくれない(matplotlibの話)。代わりに、x,yの組み合わせの配列を作って渡す。
  • numpy.sum()を多次元配列に対して使うと、全要素を合計してしまう!行毎の合計ならsum(axis=0)とか、指定する必要あり。

楽しくやってます( ´ ▽ ` )ノ

Eclipseは使わない!Mavenでサンドボックス作るよー!

これがめちゃめちゃ躓いたので備忘録。

きっかけ

Javaでライブラリ調査しようと思ったら、クラスパスの指定がめんどくさいってことに気が付いた。
サンドボックスのプロジェクトを作るのがいいらしいのでやってみた。

流れはこんな感じ
1. サンドボックスプロジェクトの構築
2. ライブラリを取得
3. プラグイン "exec:java" で実行

ちなみにMavenを使わないと...

$ javac -classpath commons-csv-1.5/commons-csv-1.5.jar Csv.java
  • 実行!コンパイル時とクラスパスの指定方法が違うの毎回戸惑うんだけど!
java -classpath .:commons-csv-1.5/commons-csv-1.5.jar Csv

Mavenを使うと...

1. サンドボックスプロジェクトの構築

mvn archetype:generate

2. 依存ライブラリの記述

Maven のセントラルリポジトリからpom.xmlにコピペする記述を持ってきて...コピペ! The Central Repository Search Engine

3. プラグイン "exec:java" で実行

そもそもMaven単体だとプログラムの実行はできないらしい。テストはできるけど... pom.xmlプラグインを追加します。

  <build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2.1</version>
            <configuration>
                <mainClass>Csv</mainClass>
            </configuration>
        </plugin>
    </plugins>
  </build>

にmain持ちの実行したいプログラムを記述します。そしたら

mvn exec:java

雑感

なんか細かい計算はPythonとかの方が楽だな〜と思いつつ、Java9の対話実行はとっとと導入しようと思った。