新米Webエンジニアにオススメの基礎教材
自分も気付けば社会人のエンジニアとして2年目になったので、ここらで自分が読んでよかったWebエンジニアとしての基礎教材をまとめてみたいと思います。なお、本記事で扱う「Webエンジニア」という言葉は、具体的には「Web技術を扱うバックエンドを軸としたエンジニア」という意味を指しています。本記事で挙げる教材の多くは学生時代に読みましたが、社会人となった今でも折に触れて読む返す機会の多い、自分の基礎となっている教材です。と言っても定番の教材ばかりですが。
設計
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
- 作者: Dustin Boswell,Trevor Foucher,須藤功平,角征典
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/06/23
- メディア: 単行本(ソフトカバー)
- 購入: 68人 クリック: 1,802回
- この商品を含むブログ (140件) を見る
オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方
- 作者: Sandi Metz,?山泰基
- 出版社/メーカー: 技術評論社
- 発売日: 2016/09/02
- メディア: 大型本
- この商品を含むブログ (6件) を見る
- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2004/06/19
- メディア: 大型本
- 購入: 51人 クリック: 762回
- この商品を含むブログ (397件) を見る
Clean Architecture 達人に学ぶソフトウェアの構造と設計
- 作者: Robert C.Martin,角征典,高木正弘
- 出版社/メーカー: KADOKAWA
- 発売日: 2018/07/27
- メディア: 単行本
- この商品を含むブログを見る
データベース
Webエンジニアのための データベース技術[実践]入門 (Software Design plus)
- 作者: 松信嘉範
- 出版社/メーカー: 技術評論社
- 発売日: 2012/03/09
- メディア: 単行本(ソフトカバー)
- 購入: 20人 クリック: 486回
- この商品を含むブログを見る
SQL 第2版 ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)
- 作者: ミック
- 出版社/メーカー: 翔泳社
- 発売日: 2016/06/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
- 作者: ミック
- 出版社/メーカー: 翔泳社
- 発売日: 2013/08/07
- メディア: Kindle版
- この商品を含むブログ (4件) を見る
- 作者: Bill Karwin,和田卓人,和田省二,児島修
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/01/26
- メディア: 大型本
- 購入: 9人 クリック: 698回
- この商品を含むブログ (46件) を見る
インフラ
[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識
- 作者: 武内覚
- 出版社/メーカー: 技術評論社
- 発売日: 2018/02/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
- 作者: 竹下隆史,村山公保,荒井透,苅田幸雄
- 出版社/メーカー: オーム社
- 発売日: 2012/02/25
- メディア: 単行本(ソフトカバー)
- 購入: 4人 クリック: 34回
- この商品を含むブログ (37件) を見る
- 作者: 渋川よしき,ごっちん
- 出版社/メーカー: ラムダノート
- 発売日: 2017/10/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
- 作者: 木本雅彦,松山直道,稲島大輔,株式会社創夢
- 出版社/メーカー: KADOKAWA
- 発売日: 2018/06/29
- メディア: 単行本
- この商品を含むブログ (1件) を見る
- 作者: 三宅英明
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2017/11/21
- メディア: 単行本
- この商品を含むブログを見る
- 作者: 山田明憲
- 出版社/メーカー: 技術評論社
- 発売日: 2018/08/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座
クラウド技術の知識は現代のエンジニアの必須項目です。Udemyの本講座はAWSの認定ソリューションアーキテクトの資格試験突破を想定した講座ですがAWSの基礎的な考え方や使い方を一通り抑えることができます。また、AWSはterraformなどのツールを使わない限り、GUI上でポチポチ操作することになりますが、その点書籍より動画の教材の方が適していると思います。
dev.classmethod.jp AWSを用いたterraformに関する貴重な書籍。技術書典で販売されたものだがBOOTH - 創作物の総合マーケットでpdf版を購入できます。 Infrastructure as Codeによる構造的な記述に加えてAWSのベストプラクティスに関する解説もついているため、AWSに関する知識の整理にもなり、非常にオススメです。
- 作者: Mike Julian,松浦隼人
- 出版社/メーカー: オライリージャパン
- 発売日: 2019/01/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
Web技術
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
- 作者: 山本陽平
- 出版社/メーカー: 技術評論社
- 発売日: 2010/04/08
- メディア: 単行本(ソフトカバー)
- 購入: 143人 クリック: 4,320回
- この商品を含むブログ (183件) を見る
Web制作者のためのCSS設計の教科書 モダンWeb開発に欠かせない「修正しやすいCSS」の設計手法 Web制作者のための教科書シリーズ
- 作者: 谷拓樹
- 出版社/メーカー: インプレス
- 発売日: 2014/07/24
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
セキュリティ
www.ipa.go.jp webセキュリティといえば徳丸本が定番ですが、いかんせん重厚で読み切るのには根気が必要です。とはいえ、事業を再起不能にさせる自体も起こしかねないセキュリティに関する基礎知識は真っ先に押さえておくべきです。徳丸本を読む前に一先ず最低限の知識を抑えたい、という人にはIPAが無料で配布している上記のURLの資料及びその別冊は必要な知識がコンパクトにまとまっているのでオススメです。
組織・チーム
DevOps導入指南 Infrastructure as Codeでチーム開発・サービス運用を効率化する (DEV Engineer’s Books)
- 作者: 河村聖悟,北野太郎,中山貴尋,日下部貴章,株式会社リクルートテクノロジーズ
- 出版社/メーカー: 翔泳社
- 発売日: 2016/10/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
エンジニアリング組織論への招待 ~不確実性に向き合う思考と組織のリファクタリング
- 作者: 広木大地
- 出版社/メーカー: 技術評論社
- 発売日: 2018/02/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
- 作者: Jonathan Rasmusson,西村直人,角谷信太郎,近藤修平,角掛拓未
- 出版社/メーカー: オーム社
- 発売日: 2011/07/16
- メディア: 単行本(ソフトカバー)
- 購入: 42人 クリック: 1,991回
- この商品を含むブログ (257件) を見る
permutation importance 〜特徴量の重要度の測り方〜
概要
Random Forestや勾配ブースティングなどの決定木アルゴリズムのアンサンブル手法の強みは性能の高さの他に入力に用いた各特徴量の重要度を算出できることにあります。各特徴量の重要度の大きさを元に特徴量選択を見直し、モデルの性能の向上を図ることもデータサイエンスでは一般的です。
決定木アルゴリズムのアンサンブル手法では不純度(デフォルトではジニ不純度)に基づいて木を分割しています。scikit-learn, xgboost, lightGBMなどのライブラリで feature_importances_
メソッドで算出する特徴量の重要度は学習時に使用した不純度に基づいたものです。この重要度は gini importance
や mean decrease impurity
と呼ばれます。しかし、算出した各特徴量の重要度の値の比は性能にどれだけ貢献しているかとは一般的には関連がありません。そこで本記事でとりあげるのがpermutaion importanceです。
permutation importance
permutation importanceはジニ不純度などの分割手法にも依存しない非常にシンプルな特徴量の算出手法です。
- 簡単のためRandom Forestに入力するデータとして特徴Aと特徴Bの2つの特徴を持つデータを考える。
- まず、データをtrainデータとvalidation dataに分ける。trainデータの特徴A,Bを学習させ、モデルを訓練する。
- 訓練後validation dataを使用してモデルの性能をタスクに適切な評価手法で測定する(分類タスクであればaccuracy, 回帰タスクであればR2 scoreなど)。この時の性能値をbaselineとする。
- 続いてtrainデータの特徴Aの値をランダムにシャッフルしてから訓練し、その性能をvalidationデータで測定する。
- 同様に特徴Bの値をtrainデータの特徴Bの値をランダムにシャッフルしてから訓練し、その性能をvalidationデータで測定する。
- 各特徴をランダムにシャッフルした時にbaselineに比べて性能がどの程度落ちたかを計算することで各特徴がどのくらい性能に貢献しているかを正確に算出する。
ポイントは特徴量をランダムにシャッフルすることで、特徴のデータ分布を変化させずに特徴の性能への貢献をゼロにしているところです。
使いどころ
permutaion imporanceを用いて各特徴の性能への寄与を正確に算出することができることがわかりましたが、ではその使いどころはどこでしょうか。ここでは一つユースケースを提案したいと思います。例えば、random forestで訓練した回帰予測モデルがある実システムで毎分1回推論し、その予測値とそのモデルの予測性能をシステムが使用しているとします。推論時にはその1分前にシステム内で生成されたログデータを特徴として入力に用いているとします。しかし、システムの仕様上ログデータの一部が欠損することもあり、入力すべき特徴が揃わないことがあります。この時に各特徴が欠損した場合どの程度予測性能が落ちるのかpermutation importanceで分かっていれば、特徴の欠損による性能の変化を考慮したシステム運用ができます。
実装
実際にrandom forestでpermutation importanceを算出してみます。上で説明した通り、permutation importanceのアルゴリズムは非常にシンプルであるため実装を簡単ですが、random forestでpermutation importanceを算出できるpythonライブラリがあるので今回はそのライブラリを使用してみます。
ライブラリのインストール
pip install rfpimp
簡単のためscikit-learnにプリセットされているデータセットであるBoston house-prices(ボストン市の住宅価格)の全てのカラムをそのまま(特徴設計せず)入力データとして使用し、Random Forestを用いた住宅価格の回帰予測モデルを構築した後permutaion importanceにより、各特徴(=データセットのカラム)が性能にどの程度貢献しているか算出し、可視化します。 ソースコードは以下。
import pandas as pd from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor from rfpimp import * #データセットを読み込み、入力データと目的変数のデータを9:1比でtrainデータとvalidationに分割 boston = load_boston() x_data = pd.DataFrame(boston.data, columns=boston.feature_names) y_data = boston.target x_train, x_val, y_train, y_val = train_test_split(x_data, y_data, test_size=0.10) # trainデータを用いてRandom Forestを訓練 forest = RandomForestRegressor() forest.fit(x_train, y_train) # validationデータを用いてR2-scoreによるpermutaion importanceを算出及び可視化 imp = importances(forest, x_val, y_val) vizualization = plot_importances(imp) vizualization.view()
以下の図が得られました。
書評「データサイエンティスト養成読本 ビジネス活用編」
データサイエンティスト養成読本シリーズの新刊である「データサイエンティスト養成読本 ビジネス活用編」が今週発売されたので早速kindleで購入して読んだ。せっかくなので僭越ながら書評を認めてみたいと思う。
データサイエンティストに必要とされるスキルセットはデータサイエンススキル・データエンジニアリング・ビジネススキルの大きく3つである、というのはよく耳にする話だ。 前2つ(データサイエンススキル・データエンジニアリングスキル)に関して言えば、機械学習やデータサイエンティストブームにある近年、それらを学ぶための書籍は数多く発刊され、何年か前に比べれば大変勉強しやすい世の中になったといえる。しかし、3つ目のビジネススキルを取り上げた書籍はまだまだ少ないというのが現状だ。また、数少ないその類の書籍も多くの場合はビジネスでどこに応用するとどのような成果が得られるか、といったトピックが中心であり、業務プロセスやプロダクトマネージメント、組織作りといった内容を取り上げた書籍になるとさらにぐっと数が減ってしまう。(その数少ないうちの一冊が「仕事で始める機械学習」だろうか。)
そもそもAI・データサイエンティスト・データドリブンといったワードが持て囃されるようになったのはここ数年の話だ。国内の大手IT企業を見てみてもそれらを専門とする部署を立ち上げたり、人材の採用に注力し始めたのはここ5年ぐらいという印象である。(とは言え、私は新卒一年目なので当時を詳しくは知らない。だが、今の会社や学生時代にインターンをしていた数社の社員の話を聞く限りではどうやらそのようだ。) そのため、業界全体としてまだ試行錯誤を繰り返しているところも多いのか、蓄積された知見が外部に共有されるに至っていないのかもしれない。だからこそ、ビジネス活用に必要とされる業務プロセス、プロダクトマネージメント、組織論といったデータサイエンティストに必要とされるビジネススキルの側面を広く扱った本書は貴重な一冊だ。
本書はシリーズを通して章ごとに異なる著者が担当する体裁を取っている。個人的な考えとしては、技術や理論を書籍で学ぶ意義の一つはそのテーマを体系的あるいは段階的に学べることにあると思っている。ところが、著者が章ごとに異なると、書籍としての一貫性が崩れてしまい、体系的に学ぶには厳しい場合が多い。その観点から言えば、データサイエンティスト養成読本シリーズはあまり好んで読むタイプの書籍ではなかった。しかし、シリーズ新刊の本書は技術や理論ではなく、ビジネス活用に限定したものである。しかも知見があまり共有されていないトピックであるため、複数の著者によって複数の視点で語られるのはそれはそれで意義のあることだといえるだろう。
本書は全10章で構成されており、1~3章はデータサイエンス業務の進め方やプロジェクトの回し方、4~8章はデータ組織論、9~10章はPeople Analyticsとざっくり区分できる。(あくまでざっくり。)
社会人一年目の新米である私にとっては1~3章が現在の業務に通ずるところが多く、大変参考になった。データサイエンス業務や機械学習プロジェクトではどうしても不確実性がつきまとう。この非常に厄介な、しかし避けて通ることができない不確実性との向き合い方を学ぶことができるだろう。分析というよりデータエンジニア・機械学習エンジニア寄りの私からすると特に第3章は学びが多くあった。一般的なソフトウェア開発とは異なる不確実性を伴う機械学習プロジェクトをどう進めるべきか、というプロダクトマネージメントや開発プロセスの作法を学びたい人は一読することをぜひお勧めしたい。
4~8章に関しては、各社の組織事例を組織論的観点で知ることができるので大変興味深い。やはりデータを活用していくにはデータサイエンティストなどの専門職だけが理解しているだけでは限界があり、社内にデータ活用の文化を醸成させ、組織として取り組んでいく必要性を改めて感じた次第である。
9~10章はPeople Analyticsへの適用に関してである。働く側としてもより公正な人事評価のためにはまだまだ改善の余地があると感じる。データを活用したアプローチとしてぜひHR職の方々の参考にしていただければと思う。
章が違えどトピックが少し被っている部分もあり、異なる著者による類似した内容の記述が散見されるが、複数の著者によって何度も語られる事項ということはそれだけ重要である、というふうに受け止めるといいのかもしれない。 本書は全体を通して数式やソースコードは一切登場しないこともあり、データサイエンスの専門知識のない人たちも読める内容が多いので、データ活用に関心のあるビジネスサイドの人たちにもぜひお勧めしたい一冊だ。
データサイエンティスト養成読本 ビジネス活用編 (Software Design plusシリーズ)
- 作者: 高橋威知郎,矢部章一,奥村エルネスト純,樫田光,中山心太,伊藤徹郎,津田真樹,西田勘一郎,大成弘子,加藤エルテス聡志
- 出版社/メーカー: 技術評論社
- 発売日: 2018/10/30
- メディア: 大型本
- この商品を含むブログ (1件) を見る
Google colablatoryの無料TPU上でtensorflowのKeras APIで実装したCNNを動かしてみる。
久しぶりにDeep Learningを使いたいと思い、兼ねてより気になっていたが今まで使うタイミングがなかったGoogle colabolatoryの無料TPU(※ ただし、12h以内)の上でCNNを動かしてみる。本記事執筆の時点ではTPU対応の深層学習フレームワークはtensorflowのみのようだ。tensorflowは計算グラフがやや書きにくいのだが、近年tensorflowはkeras APIを提供し、抽象化した書き方ができるようになったり、eagar executionというモードではpytorchやchainerのようなDefine by Runの書き方も可能になり、大分扱いやすくなった。そこで本記事ではtensorflowのKeras APIを使ってTPU上でCNNを使ってMNISTの分類タスクの学習をやってみる。
実装
まずは全体のコードを眺めてみましょう。
import tensorflow as tf from tensorflow.contrib.tpu.python.tpu import keras_support import os from keras.datasets import mnist from keras.utils import np_utils batch_size = 1024 #バッチサイズは大きくする num_classes = 10 epochs = 12 img_rows, img_cols = 28, 28 (x_train, y_train), (x_test, y_test) = mnist.load_data() # Kerasでデータセットの取得 x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1) x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1) input_shape = (img_rows, img_cols, 1) x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 print('x_train shape:', x_train.shape) print(x_train.shape[0], 'train samples') print(x_test.shape[0], 'test samples') y_train = y_train.astype('int32') y_test = y_test.astype('int32') y_train = np_utils.to_categorical(y_train, num_classes) y_test = np_utils.to_categorical(y_test, num_classes) # CNNのモデルを構築 model = tf.keras.Sequential() model.add(tf.keras.layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape)) model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu')) model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2))) model.add(tf.keras.layers.Dropout(0.25)) model.add(tf.keras.layers.Flatten()) model.add(tf.keras.layers.Dense(128, activation='relu')) model.add(tf.keras.layers.Dropout(0.5)) model.add(tf.keras.layers.Dense(num_classes, activation='softmax')) # TPU用にモデルを変換 tpu_grpc_url = "grpc://"+os.environ["COLAB_TPU_ADDR"] tpu_cluster_resolver = tf.contrib.cluster_resolver.TPUClusterResolver(tpu_grpc_url) strategy = keras_support.TPUDistributionStrategy(tpu_cluster_resolver) model = tf.contrib.tpu.keras_to_tpu_model(model, strategy=strategy) model.compile(loss=tf.keras.losses.categorical_crossentropy, optimizer=tf.keras.optimizers.RMSprop(), metrics=['accuracy']) model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test)) # 性能評価 score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1])
TPUを使用するためには
まず、TPUを使用する場合コード内で構築したモデルをTPU用に変換する必要がある。 変換のための処理は以下の4行である。
tpu_grpc_url = "grpc://"+os.environ["COLAB_TPU_ADDR"] tpu_cluster_resolver = tf.contrib.cluster_resolver.TPUClusterResolver(tpu_grpc_url) strategy = keras_support.TPUDistributionStrategy(tpu_cluster_resolver) model = tf.contrib.tpu.keras_to_tpu_model(model, strategy=strategy)
続いて ランタイム
→ ランタイムのタイプを変更
を押す
TPUを選択し、保存
これだけでTPUが使用する準備が完了。 あとはコードを実行するだけである。
結果は、1分足らずでMNISTを12epoch回して精度99%を叩き出すことができた。
注意点
- kerasはデータセットの取得と、出力のカテゴリをone-hot encodingする前処理のためのみに使用し、それ以外はtensorflowのKeras APIを用いている。tensorflowもkerasもGoogle Colaboratoryに元々インストールされているので一切のセットアップは要らない。
- TPUを使用する場合バッチサイズは大きくするのがポイントである。実はTPUはバッチサイズが小さいとGPUよりも遅い。
batch_size = 128
で学習してみたところ 、TPUはGPUに比べて3倍ほど処理が遅いが、batch_size = 1024
ではTPUはGPUの2倍ほどの速さとなった。 - 当初optimizerにtensorflowのkeras APIではなく、純粋なkerasのoptimizerメソッドを使用していたら、TPU使用の時のみエラーで動かないケースがあったので注意。