15022017 Python
週末はShizuoka.pyですので、SLに乗るなり、燕でラーメンを堪能するなり、楽しんでください。
尚僕はまだ資料に取り掛かってない、ヤバイ…
15022017 Python
週末はShizuoka.pyですので、SLに乗るなり、燕でラーメンを堪能するなり、楽しんでください。
尚僕はまだ資料に取り掛かってない、ヤバイ…
一度年末に調整したのですが、タイミングが合わずにこの日にやることになりました。Shizdevのほうでも人工知能まわりをやっているので今回は共催となります。
python使いが静岡東部に多い+コミュニティFの利用料金が無料なのに綺麗という理由で最近のShizuoka.pyは富士でばかりやっていましたが、流石に他の地域で美味しいものを食べながらの懇親会をしなきゃなという理由で今回島田開催です。
尚、懇親会場は決まってないのでリクエストがあれば@fmkz___か@yajuまでよろしくお願いします。
島田のとなりの金谷には大井川鉄道があってSLが走っているので、鉄成分高めの方は満足するんじゃないかなぁと思います。僕は鉄成分がホメオパシー並に薄いのですが五和で撮ったとき(connpassの写真、今回は料理ではない)には「SLウォー!!!!」ってなりました。五和の中屋酒店に行った時にたまたま遭遇したんだけどねw
27092016 Python東京deeplearning
まず予習しておいた戸山公園にはピカチュウはいなかった。東側も行ってみたけどブーバーくらいしかいなかったし、高低差があるので歩くのがめんどくさかった。西側はオニスズメばかりw
PyConJPは去年は不参加だったので二年ぶりの参加でした。初中級向けの演題が多かった気がして、間口が広げたかったのかなぁと思ったが一方でディープな話題が少なくて初期の頃とは色々変わっているんだなぁと感じた。これは選考プロセスのせいもあるのかな?
あとディープラーニング関連の演題が多かった。一昨年は機械学習の話題も多かった気がするけど。僕の最近の興味もディープラーニングなので、Pythonというよりはディープラーニングの演題を聴きに行った(というかほとんどそれしか聴いてないw)
尚、狙った演題を椅子に座って聞くためには一つ前の演題をスキップしないとしんどいことになるのでなかなか厳しかった。もう少し自由に出入りできると良いのかなと思うが、大学では仕方ないかな(逆にカジュアルに出入りできる教室の設計だと困るw)
次の一手ということで、なんとなくディープな話が聞けるのかなと思ったけど、クラウドサービスの話が多かった印象。 自社サービスの宣伝するならもっとグイグイやってくれたほうがよかったかな。
GPUを使える仮想環境のニーズって個人レベルだとかなりあると思うんだよね。気軽に試したいし。
尚、CNTKはちょっと興味を持った。
自然言語処理系のDLはあまり追いかけてなくて、 word2vecくらいしか理解してないんだけど、あれはディープじゃないから。RNNとかLSTMをつかってやろうとしたことの話で、具体的なコードが出てこなかったけど、やろうとしていることは理解できて面白かった。
LSTMと化合物のフラグメントってどう対応とったらうまいくのかなぁとか思った。ゲノムのほうがやりやすい気はするけどそういう論文は見たことないなぁ。
とても勉強になった。ツイートでメモとってたので、帰りの新幹線で読み返してた。
画像生成と化合物合成って結構似ていると思っているので、こういう方法で化合物生成するのって悪くはないんじゃないかなぁーと。
そのうち試す。
要件定義と言うか仕様を固めるの難しいよなぁと思いながら聞いていた。パッケージを作りたいヒトは聞いておいて良い内容だったと思います。僕も、あのときああいう風にすればよかったのかとか思いながら聞いていた。
tensorflowの触りだけだった。初めてのヒト向けに具体的な事例を紹介する内容だったと思う。知らない人向けには面白かったと思うが、ある程度使っているヒトにとってはちょっと物足りなかったかも。
二年ぶりの参加だったけど、色々と刺激を受けて楽しかった二日間だった。来年も参加します。
08092016 Pythontensorflowscikit-learn
TensorflowのDNN Regressionを使っていて便利なんだけどハイレベルなAPIばっかり使っていると自分でもっと別なの実装したくなった時に困るだろうなぁと、自分で実装してみたら…
$python boston.py
RF: R2: 0.736624, RMSE:4.631010
SVM: R2: 0.515467, RMSE:6.281300
TFL: R2: 0.647992, RMSE:5.353827
MY R2: -1.007581, RMSE:12.785702
精度悪すぎ… sofでも同じような質問を見つけたが同業だろう…w
ログを取ってみたところ、どうも収束が悪いっぽい。
import numpy as np import tensorflow as tf from sklearn import cross_validation from sklearn import datasets from sklearn.svm import SVR from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error from sklearn.metrics import r2_score from math import sqrt import random tf.logging.set_verbosity(tf.logging.ERROR) def test_svm(x_train, x_test, y_train, y_test): clf = SVR(kernel='linear').fit(x_train, y_train) y_pred = clf.predict(x_test) r2 = r2_score(y_test, y_pred) rmse = sqrt(mean_squared_error(y_test, y_pred)) print('SVM: R2: {0:f}, RMSE:{1:f}'.format(r2, rmse)) def test_rf(x_train, x_test, y_train, y_test): rlf = RandomForestRegressor().fit(x_train, y_train) y_pred = rlf.predict(x_test) r2 = r2_score(y_test, y_pred) rmse = sqrt(mean_squared_error(y_test, y_pred)) print(' RF: R2: {0:f}, RMSE:{1:f}'.format(r2, rmse)) def test_tf_learn_dnn(x_train, x_test, y_train, y_test, steps=10000, hidden=[20, 20]): feature_columns = [tf.contrib.layers.real_valued_column("", dimension=13)] tfl = tf.contrib.learn.DNNRegressor(hidden_units=hidden, feature_columns=feature_columns) tfl.fit(x=x_train, y=y_train, steps=steps) y_pred = tfl.predict(x_test) r2 = r2_score(y_test, y_pred) rmse = sqrt(mean_squared_error(y_test, y_pred)) print('TFL: R2: {0:f}, RMSE:{1:f}'.format(r2, rmse)) def inference(x): hidden1 = 20 hidden2 = 20 with tf.name_scope("l1") as scope: w1 = tf.Variable(tf.truncated_normal([13, hidden1]), name="w1") b1 = tf.Variable(tf.zeros([hidden1]), name="b1") h1 = tf.nn.relu(tf.matmul(x, w1) + b1) #h1 = tf.nn.dropout(h1, 0.9) with tf.name_scope("l2") as scope: w2 = tf.Variable(tf.truncated_normal([hidden1, hidden2]), name="w1") b2 = tf.Variable(tf.zeros([hidden2]), name="b2") h2 = tf.nn.relu(tf.matmul(h1, w2) + b2) #h2 = tf.nn.dropout(h2, 0.9) with tf.name_scope("l3") as scope: w3 = tf.Variable(tf.truncated_normal([hidden2, 1]), name="w2") b3 = tf.Variable(tf.zeros([1]), name="b3") y = tf.matmul(h2, w3) + b3 return y def loss(model, y_): return tf.reduce_mean(tf.square(tf.sub(model, y_))) def training(loss, rate): return tf.train.AdagradOptimizer(rate).minimize(loss) def test_my_dnn(x_train, x_test, y_train, y_test, batch_size=32, epoch=10000, shuffle=True): max_size = x_train.shape[0] n = max_size - batch_size idx = list(range(x_train.shape[0])) x = tf.placeholder(tf.float32, shape=[None, 13]) y_ = tf.placeholder(tf.float32, shape=[None]) model = inference(x) loss_value = loss(model, y_) train_op = training(loss_value, 0.1) init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) for e in range(epoch): if shuffle: random.shuffle(idx) x_train = x_train[idx] y_train = y_train[idx] for i in range(n / batch_size): batch = batch_size * i x_train_b = x_train[batch:batch + batch_size] y_train_b = y_train[batch:batch + batch_size] _, l = sess.run([train_op, loss_value], feed_dict={x: x_train_b, y_: y_train_b}) #if e % 100 == 0: # print e, l y_pred = sess.run(model, feed_dict={x: x_test}) y_pred = y_pred.T[0] r2 = r2_score(y_test, y_pred) rmse = sqrt(mean_squared_error(y_test, y_pred)) print(' MY R2: {0:f}, RMSE:{1:f}'.format(r2, rmse)) if __name__ == "__main__": boston = datasets.load_boston() x_train, x_test, y_train, y_test = cross_validation.train_test_split( boston.data, boston.target, test_size=0.2, random_state=0) test_rf(x_train, x_test, y_train, y_test) test_svm(x_train, x_test, y_train, y_test) test_tf_learn_dnn(x_train, x_test, y_train, y_test) test_my_dnn(x_train, x_test, y_train, y_test, shuffle=True, epoch=30000)
というわけでソースコードを読んでみたんだけど、わかりにくかったので途中までしか追えてなく、結局原因がつかめていない状態。
以下メモ
実際に使われているクラスはDNNLinearCombinedRegressorで、名前の由来がわからなかったけど、TensorFlow Wide & Deep Learning Tutorialを読めばわかる
fitで訓練するんだけど、_get_input_fnで入力、出力のplaceholderを返すinput_fnとバッチ用のデータセットを返すfeed_fnという関数が返される。
バッチは_get_input_fnでランダムシャッフルされているし、デフォルトのサイズは32
デフォルトのoptimizerはAdaGrad
clip-gradientsというオプションがあるのだがどこで使われているのかわからなかった
11082016 Pythontensorflowscikit-learn
TensorFlowのDNNチュートリアルだとトレーニングセットとテストセットをファイルから読みだすので、実用的にはちょっと面倒くさい。scikit-learnのよろしく分割してくれるメソッド使ったほうが楽でしょう。
またこScikit-learnとTensorFlowを組み合わせることでそれぞれのアルゴリズムの精度を比較することが簡単にできるので便利。
import tensorflow as tf import numpy as np from sklearn import datasets from sklearn import svm from sklearn.ensemble import RandomForestClassifier from sklearn import cross_validation iris = datasets.load_iris() x_train, x_test, y_train, y_test = cross_validation.train_test_split(iris.data, iris.target, test_size=0.4, random_state=0) classifier = tf.contrib.learn.DNNClassifier(hidden_units=[10, 20, 10], n_classes=3) classifier.fit(x=x_train, y=y_train, steps=200) dnn_accuracy_score = classifier.evaluate(x=x_test, y=y_test)["accuracy"] print('DNN Accuracy: {0:f}'.format(dnn_accuracy_score)) clf = svm.SVC(kernel='linear').fit(x_train, y_train) svm_accuracy_score = clf.score(x_test, y_test) print('SVM Accuracy: {0:f}'.format(svm_accuracy_score)) rlf = RandomForestClassifier().fit(x_train, y_train) rf_accuracy_score = rlf.score(x_test, y_test) print('RF Accuracy: {0:f}'.format(rf_accuracy_score))
10072016 Python
参加された皆様お疲れ様でした。
一年半ぶりでちょっと間が空きましたが次回は年末までに島田のあたりでやろうかということになったので、またみなさんで楽しく過ごせるといいかなと思います。
今回もそれなりに新しい参加者がいたので楽しかったです。発表するともっと楽しいのでちょっとしたことでもいいので発表しましょう。
それからブログみたいなとこにメモっておくだけでも自分用の備忘録にもなるし、記憶の定着度もいいのでそういうのもいいと思います。
僕も次回はもうちょっとまともなネタを仕込んで臨みたいw
それから懇親会楽しかったです。lambdaネタは某静岡の制作会社の自作自演QAだとずっと勘違いしてたのだけど疑いが晴れてよかったですw自己紹介タイムに遅れてきたヒトの救済措置はしておかないとちょっと困るかもしれないので遅刻したヒトはLT前とかに軽く自己紹介するようにしたほうがいいのかなと。
ではまた次回☆
30062016 Python
いつもMemoryしか使ってないんだけど、dump, load使ってみたら便利だったので次回からはこっち使う。
例えばpickleを使って永続化する場合
import pickle test_dict = {"one": 1, "two": 2, "three": 3} with open("test.dump2", mode='wb') as f: pickle.dump(test_dict, f) with open("test.dump2", mode='rb') as f: print pickle.load(f)
と書かなきゃいけないところをjoblibだと
import joblib test_dict = {"one": 1, "two": 2, "three": 3} joblib.dump(test_dict, "test.dump") print joblib.load("test.dump")
と書けるわけです。素敵。
27062016 Python
requests+pyqueryで文字列の扱いに悩まされるのは主に二箇所ある。そしてその組み合わせのエラーが出るので悩ましい。
requestsでcontentとtextの違いはtextはr.encodingでdecodeされたunicode文字列だということだ。なので正しくデコードされたunicode文字列を推定できればrequestsでの文字化け問題は解決する
だが常にunicode文字列をpyqueryに渡せばOKかというとそうでもない。
常にUnicode文字列を渡すようにすると Unicode strings with encoding declaration are not supported. というエラーが散見されるようになる。これはpyqueryが内部的に使っているlxmlがヘッダーにエンコーディングが指定しているHTMLを渡すとそれにあわせてデコードしようとするらしく、既にユニコード文字列化されたHTMLもその作法にしたがってエラーになるというものだ。
というわけでこの場合はもとのstr文字列を渡さないといけないらしい。
これが結構面倒くさい。requestsでヘッダーにエンコーディングが指定されているかどうか知るオプションあるんかね?
14062016 Python
企業のプレスリリースをテキストマイニングしようと思うと色々大変なわけだ。そもそもプレスリリースの媒体がpdfを想定されているために、タイトルのみ本文無しという潔いRSSが多いしそういうのは購読しても嬉しくない。
というわけでプレスリリース一覧のページからpdfのURLを抜き出してpdfminerかましてデータ抽出やらないといけないしそっちのほうが逆に構造化されていてスクレイプしやすかったりする。
で、PyQueryを使ってガリガリやっていたのだが、何故かスクレイプできないサイトがあった。BeautifulSoupではちゃんとスクレイピング出来たのでエラーの原因が気になって調べてみたのでメモっておく
普通にrequestsでHTMLを取ってきてPyQueryに渡してやると :::sh >>> from pyquery import PyQuery as pq >>> import requests >>> tgpr = "http://www.transgenic.co.jp/pressrelease/" >>> d1 = pq(requests.get(tgpr).content) >>> d1 [<{http://www.w3.org/1999/xhtml}html>] >>> d1("a") []
aタグが一件も見つからない。しかし、urlオプションに直接サイトのURLを指定するときちんとparseされている
>>> pq(url="http://www.transgenic.co.jp/pressrelease/") [<html>] >>> d2 = pq(url="http://www.transgenic.co.jp/pressrelease/") >>> len(d2("a")) 71
なんだこれは?となったのでドキュメントを漁ったらxmlパーサーでパースしてみてだめだったらhtmlパーサー使うぜって書いてあったので強引にxmlパーサーでparseさせてみた。
>>> d3 = pq(url="http://www.transgenic.co.jp/pressrelease/", parser="xml") >>> d3 [<{http://www.w3.org/1999/xhtml}html>] >>> len(d3("a")) 0
というわけで文字列を渡すときにはなぜかhtmlのパーサーでparseされていないっぽい。これはコードを追うべきですな。
67行目のetree.XMLSyntaxErrorという例外が投げられてないのではないかということになった。
まぁ別にわざわざrequests使う必要もないのでurlオプションにURL渡せばいいんだけどね。
13062016 Python
王将使うの多分初めてかな。懇親会は予約の締め切りがあるので参加される方はお早めに
昨日は久しぶりに#A君とあって一緒に黙々コーディングをしてたんだけど、A君重量級になってた…弱虫ペダルでいうと田所感が出てた(まじで運動しないと身体にくるぞw)
また@karky7や@ando_ando_andoと鈴木屋でホルモンつつきながらプログラミング言語談義でもしたいなぁと思っていたけどなかなか難しいですね。
それから#A君にはgoに奪われた静岡市圏の勢力をPyhtonで奪還するというタスクが出来たので頑張ってください。たまにはコメヤスに酒を買いにいきたいし静岡で飲みたいなぁ。
で、もくもく会では2人でTDNetのクローラー動かないなー、おかしいなーと悩んでいたんだけど、selenium2.53.2とphantomjs2.1.1の組み合わせだとswitch_to_frameメソッドがきちんと動いてないっぽいですね。chromedriverだと動いたのでダウングレードして動く組み合わせを見つけるかバグフィックスされるの待たないといけませんな。
久々にもくもくしたけど楽しかった。ここ二三年一人でコーディングすることに慣れちゃったのと、技術を追いかけなくても余裕で生きていけるようなぬるま湯に浸かりきっていたので流石にまずいなーと感じたよ。
次回のShizuoka.pyでは
という2つの発表をします。どちらもネタに走る予定なのであまり役に立たないかもしれないけどリハビリも兼ねているので大目に見てくださいw