ギークなエンジニアを目指す男

基幹系SIerが機械学習系の知識を蓄えようとするブログ

MENU

技術書典5に参加してきました in 池袋サンシャイン

10月8日(月)に技術書典に初めて参加してきました!

f:id:taxa_program:20181009215937j:plain

技術書典ってなに?って方はこちら

techbookfest.org

なぜ参加しようと思ったか

ある日、Twitter技術書展 なるエンジニア版コミケがあることを知り、
参加サークルを見ていたところ、python関連の薄い本(だけど厚い本)も販売されるとのことで、
これは行かなきゃ損でしょ!っていう適当な気持ちで参加を決意。

(もちろん、同じ技術者( 多くは自分より立派な方々 )が出版する本とはどのようなものなのか、
また、どんな雰囲気の会場なのか知りたかったという、真面目な気持ちがとても大きいです。はい)

戦利品

とりあえずこちらが戦利品です。

f:id:taxa_program:20181009220022j:plain

Djangoはいずれ勉強したいと思っていたので、良いタイミングで良い書籍に出会えたと思っています。
pythonと株を掛け合わせた勉強もいずれ勉強したいと思っていので・・・(以下略

参考書などは買って満足する方(別名: 積ん読 )が25%ほどを占めるようです。
この戦利品たちはそうならないことを祈ります。
(このブログを書いている時にはすでに読み始めている書籍もあるため、もう大丈夫か)

参加してみて

まず、 休みの日に、わざわざ混んでいる会場に、技術者がこんな人数集まるのか
と思ったのが素直な感想でした。

実際に私は12時30分頃に会場に着いたのですが(技術書典の開催時間は11時〜17時)
まだ待機の列が 400〜600人 ほど続いてました。
(そのあと、13時過ぎには待機列が解消されたようです)

あと、売り子の方の熱量がすごかったです。
参考書などは一般的にオンラインで購入するか、本屋さんで購入することが多いと思うのですが
その時、その本を執筆した人から直接買うわけではないですよね。

技術書典では、執筆した人が自分の本を、机ひとつ挟んだ向こう側から(とても近い場所から)
販売してくれています。これが技術書典の一番良いところなんじゃないかと勝手に思っています。

技術マニアに囲まれて、 自分もやってやるぜ的な気持ちになる。

次に参加するときに注意したい点

  • 事前に購入する本はリスト化しておく
    →あとでTwitterでこんな本あった?買えばよかった・・・ということがあった

  • 開場1時間前に行って並ぶか、開場後2時間ほど経った頃に行く
    →後者の場合、買おうと思っていた書籍が売り切れてしまっている可能性があるが、待機列がなくなっているため、ストレスフリーで入場できると思う)

  • カバンは軽くして行く
    →買った書籍でそのまま勉強しようとMacを持って行ったのだが、買った本の重みとMacの重みで勉強する気も失せてしまった(大人しく家に帰って勉強しましょう)

自分もいつかは売る側に立てるように、技術を磨いていこうと思った技術書典でした!

出店サークルのみなさま、お疲れ様でした!!!!

AI人材になるために、キカガクさんイベントに参加して得たもの

9月6日、キカガクさん主催のイベントに参加してきました。

AI人材になるためのアクションプランとは?~転職市場の実例からイメージを掴む~

kikagaku.connpass.com

転職エージェント(AI領域)の方のお話が聞けるイベントには今年2回目の参加でしたが、多くの知見を得ることができました。

ブログを書くまでがイベントということなので、しっかりイベント終了させます。

参加した目的

今回参加した目的は2つあります。

  • AIの実務経験の無いエンジニアがどのようなアクションを起こして転職活動しているのかを知りたかった(転職するしないは別として)
  • Udemyでキカガクの動画がわかりやすく、吉崎さんと会ってみたかった

結果的に、どちらの目的も達成できました。
(2番目に関しては参加が決まった時点で目的達成できてましたが)

会場にたどり着けない問題

当日、表参道駅についたのが19時ちょうどぐらいでした。
スマホ片手に会場まで歩いて向かったのですが、たどり着いたのが青朋ビルIIという建物。

なんか雰囲気違うな〜と思ってはいましたが、周りにはイベント参加者であろう人たちが
これまたスマホ片手に5~6人、スマホの画面と建物に対して交互に視線を浴びせていました。

その理由がおそらくこれ。

f:id:taxa_program:20180908100607p:plain

これはgoogle mapで開催会場の住所を入力して検索したときの画像です。

イベントページには青朋ビル2Fと記載されているため、
map上の青朋ビル(株)を目指して行ってしまったわけです。
そしてこの建物はイベント会場とは違う建物。

正解はその下のピンが出ている建物でした。
良く見ると(いや、良く見なくても)G's ACADEMY TOKYOってハッキリ出てるんですけどね。

多分イベントが楽しみすぎて盲目になっていたんだと思います。

私事ですが、来月表参道で結婚式を挙げるため表参道界隈には少し詳しくなったつもりでしたが過大評価でした。反省。

もちろん、最終的には無事にたどり着けました。(駅から15分くらいかかった・・・)

イベントの内容

前段が長くなりましたが、イベントの内容をざっくり。

吉崎さんによるAIに関するあれこれ

AIエンジニアのステップや、AIをビジネスとして取り入れている企業の例や傾向など、なかなか聞くことのできない内容をお話して頂きました。

個人的には、転職活動における企業選びといった観点で大変勉強になりました。

また、Amazonのレコメンドの精度が30%ぐらいということを聞いて驚きました。
精度だけが大事ではなく、それが売上やコスト削減にどのように結びついているのかがとても重要だということを聞き、なるほど確かに、と思ったのと同時に、Amazonの所有しているデータ量でも30%くらいの精度なのか、となんとも言えない感情になりました。

JACリクルートメントさんによるAI転職市場の状況

AI求人とのミスマッチについて

具体的な理由としては

  • 募集要項の抽象度が高い
  • ヒューマンスキルが足りない

とのこと。1つ目は確かになるほどなと思いました。
必須条件:「機械学習を用いたデータ解析の経験〜年以上」とか良く見る気がする。
そもそも現状の黎明期で上記のような人材はSSレアくらいだろう。いくら課金(給料を与えるか)するかにもよるのかもしれないが。

2つ目は少し意外でした。
Pythonでモデル構築できるようになった!統計の勉強もした!どや!
だけではダメなようだ。

AIスキルだけで内定獲得は難しい

当日は実際にあった内定お見送り理由などもご紹介頂いたのですが、
その半数が、ヒューマンスキルを理由としたものでした。
AIスキルと同じくらい重視されるのがヒューマンスキルだそうで、モデル構築できまっせ!だけで内定を獲得するのは難しそう。

一番大事なのは、行動力

実務未経験でも、日進月歩する技術を自分で取得していこうとする行動力がとても重要だと、再認識した。
具体的にはやはりGitHubやQiitaで積極的に自分のスキルを公開していくのが重要なようだ。
これがそのままポートフォリオにもなるし、自分のできることの棚卸しにも繋がる。

まとめると

なにはともあれ、AIスキル×ヒューマンスキル を磨くことが大切。
されに、そこに+αできる何かがあると市場価値がぐっと上がりそう。

懇親会

ビール2杯頂きました。
ごちそうさまでした。

数人の参加者の方と話しましたが、エンジニアオタクの人と話すのはやっぱり面白い。
また、個人的には未来の話をするのが好きなので、そう言ったことが話せたのも嬉しかったです。

まとめ

とても有意義な時間を過ごすことができました!
とともに、モチベーションがかなり上がりました。

これから始めようと思うこと、忘れないように書いておきます

  • 勉強して得た知見で技術系の記事はQiitaブログに書く。(吉崎さんおすすめ)

  • Kaggleの過去コンペを1週間に1問ずつ解く。(これは結婚式が終わってから)

  • 年内に統計検定2級を受験し、合格する。

  • なぜAIに興味をもったか。そしてどのような人間になりたいか、を再確認する。(キャリアパスの再確認)

以上。これでイベント終了です。

最後に、主催者のキカガク吉崎さん、JACリクルートメントの皆様、ありがとうございました!

Kaggler-ja in-classコンペ途中経過 〜Fashion MNISTをkerasで〜

現在、7月9日より開催されているkaggler-jaというslackグループのin-classコンペに参加しています。
今日はその途中経過を報告したいと思います。
また、このモデルを構築するまでに試行錯誤したことなど、最後にまとめてありますので良ければご参考になさってください。

  • コンペの内容
  • ソースコード
  • 予測
  • 精度結果
  • この結果に到るまでに試行錯誤したこと
    • 参考にしたnotebook
    • オプティマイザの検証
    • レイヤーの検証
    • 画像の水増し処理
  • まとめ

コンペの内容

詳細は下記URLを参照していただければ分かると思いますが、簡単に言うとFashion MNISTのデータで学習モデルを作成し、その精度を競うコンペです。

Kaggler-ja In-class Competition 1

ソースコード

始めに、自分の提出したモデル構築のソースを載せておきます。

# ライブラリのimport
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import seaborn as sns
import itertools

from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from keras import initializers
from keras.utils.np_utils import to_categorical # convert to one-hot-encoding
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D, Activation, MaxPooling2D
from keras.optimizers import RMSprop, Adadelta
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import ReduceLROnPlateau, EarlyStopping

# データの読み込み
train = pd.read_csv('train.csv')

# 正解ラベルと入力データに分割
Y_train = train['label']
X_train = train.drop(labels=['label'], axis=1)

# 正規化
X_train = X_train / 255.0

# スケールの変換
X_train = X_train.values.reshape(-1, 28, 28, 1)

# 正解ラベルをone-hot-vectorに変換
Y_train = to_categorical(Y_train, num_classes=10)

# 入力データを、訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X_train, Y_train, test_size = 0.1, random_state=2)

# コールバック関数の設定
# このコールバックは評価値を監視し,'patience'で指定されたエポック数の間改善が見られなかった場合,学習率を減らします.
learning_rate_reduction = ReduceLROnPlateau(monitor='val_acc', 
                                            patience=3, 
                                            verbose=1, 
                                            factor=0.5, 
                                            min_lr=0.00001)
# 過学習の抑制
# patientce = 20とし、val_lossの最小値が20回更新されなければ計算ストップ
early_stopping = EarlyStopping(monitor='val_loss', patience=20 , verbose=1)

# 画像の水増し処理
datagen = ImageDataGenerator(
        featurewise_center=False,  # set input mean to 0 over the dataset
        samplewise_center=False,  # set each sample mean to 0
        featurewise_std_normalization=False,  # divide inputs by std of the dataset
        samplewise_std_normalization=False,  # divide each input by its std
        zca_whitening=False,  # apply ZCA whitening
        rotation_range=5,  # randomly rotate images in the range (degrees, 0 to 180)
        horizontal_flip=False,  # randomly flip images
        vertical_flip=False)  # randomly flip images

#  水増し画像を訓練用画像の形式に合わせる
datagen.fit(X_train)

# CNNのモデル定義
model = Sequential()

model.add(Conv2D(filters = 32, kernel_size = (3,3),padding = 'Same', 
                 activation ='relu', input_shape = (28,28,1)))
model.add(Conv2D(filters = 32, kernel_size = (3,3),padding = 'Same', 
                 activation ='relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))

model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', 
                 activation ='relu'))
model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', 
                 activation ='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Dropout(0.5))

model.add(Flatten())
model.add(Dense(256, activation = "relu"))
model.add(Dropout(0.5))
model.add(Dense(10, activation = "softmax"))

# オプティマイザ
optimizer =  Adadelta(lr=1.0, rho=0.95, epsilon=None, decay=0.0)

# コンパイル
model.compile(optimizer = optimizer , loss = "categorical_crossentropy", metrics=["accuracy"])

# エポック数とバッチサイズ設定
epochs = 100
batch_size = 100

# 学習
history = model.fit_generator(datagen.flow(X_train,y_train, batch_size=batch_size),
                              epochs = epochs, validation_data = (X_test,y_test),
                              verbose = 1, steps_per_epoch=X_train.shape[0] // batch_size
                              , callbacks=[learning_rate_reduction, early_stopping])

# 評価
score = model.evaluate(X_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
# =>Test loss: 0.16710302633792162
# =>Test accuracy: 0.94

94%の精度なので、まずまずかなぁと思いました。

精度と損失関数の遷移グラフも表示してみます。

続きを読む

クラス分類のための線形モデル(ロジスティック回帰 / 線形サポートベクタマシン)

こんばんは。
今日はクラス分類に用いることができる線形モデルを紹介します。
(ロジスティック回帰がメインです)

  • それぞれの線形モデルの境界線を表示してみる
  • 正則化パラメータ:Cの変更
  • ロジスティック回帰とcancerデータセット
  • p.s. 第100回 甲子園大会始まりましたね!

それぞれの線形モデルの境界線を表示してみる

今回使用するデータはmglearnに含まれるforgeデータと、sklearnに含まれるcancerデータです。

まずは、forgeデータの可視化と、ロジスティック回帰と線形サポートベクタマシンによる分類を行ってみます。

# ライブラリのインポート
from sklearn.linear_model import LogisticRegression # ロジスティック回帰
from sklearn.svm import LinearSVC # SVM
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import mglearn
from IPython.display import display
%matplotlib inline

# データの読み込み
X, y = mglearn.datasets.make_forge()
X.shape, y.shape
# => ((26, 2), (26,))

fig, axes = plt.subplots(1, 2, figsize=(10, 3))

# SVC, ロジスティック回帰のモデルを定義し、それぞれプロット
for model, ax, in zip([LinearSVC(), LogisticRegression()], axes):
    clf = model.fit(X, y)
    mglearn.plots.plot_2d_separator(clf, X, fill=False, eps=0.5, ax=ax, alpha=0.7)
    mglearn.discrete_scatter(X[:,0], X[:,1], y, ax=ax)
    ax.set_title("{}".format(clf.__class__.__name__))
    ax.set_xlabel("Feature 0")
    ax.set_ylabel("Feature 1")
    
axes[0].legend()

f:id:taxa_program:20180806001354p:plain

上記のように境界線が引かれ、2クラス分類が実行されます。
平行に近い直線で分類されていることが分かりますね。

では、この直線をもう少しデータに寄せる形に変更したい場合について、
正則化を決定するパラメータCの値を変更して学習させてみましょう。

続きを読む

Google Colaboratory内で画像やCSVファイルにアクセスしてみた

今日は新宿のもくもく会に参加しております。

  • Kaggle-jaのInClassコンペ
  • CSV読み込みするぞー

Kaggle-jaのInClassコンペ

来週の月曜日から、Kaggle-jaでInClassコンペが開催されます。
(主催者の方、準備など本当にありがとうございます)

課題は画像認識のため、僕のCPU環境だと学習に時間がかかると考え、そうだGoogle Colaboratory使えば良いじゃん?
ということで、環境だけ構築して放ったらかしていたColabのファイル読み込み手順の備忘録です。

CSV読み込みするぞー

下記サイトを参考にしました。

途中で気づいたのですが、投稿者はキカガクの吉崎さんでした。
(Udemyでとてもお世話になっております)

qiita.com

続きを読む

線形回帰とリッジ回帰をPythonで比べてみた

本日は回帰で頻出の線形回帰とリッジ回帰についてです。

  • 線形回帰とは
  • リッジ回帰
    • L1正規化とか、L2正規化ってなんだよ
  • スコアを比較してみる
  • リッジ回帰のalpha値をいろいろ変更してみる
  • 線形回帰とリッジ回帰の係数の大きさをプロットしてみる

線形回帰とは

訓練データにおいて、予測と真の回帰ターゲットyとの平均二乗誤差が最小になるように、パラメータwとバイアスbを求めるアルゴリズムです。
単回帰分析や重回帰分析などが該当します。

import mglearn
from sklearn.linear_model import LinearRegression # 線形回帰
%matplotlib inline

X, y = mglearn.datasets.load_extended_boston()
X.shape
# -> (506, 104)

# モデルの定義
model = LinearRegression(fit_intercept=False)
# 学習
model.fit(X_train, y_train)

print('Training ser score: {:.2f}'.format(model.score(X_train, y_train)))
print('Test set score: {:.2f}'.format(model.score(X_test, y_test)))

# -> Training ser score: 0.95
# -> Test set score: 0.61

リッジ回帰

直線回帰に正則化項の概念を加えた回帰分析です。
最小二乗法の式に正則化項(L2ノルム)を加え、その最小を求めることでモデル関数を発見します。
係数の絶対値の大きさを可能な限り小さくするのがモチベーション(w ≒ 0)であり、線形回帰に比べ、稼業適合(オーバーフィッティング)の危険が少ないのが特徴と言えます。

from sklearn.linear_model import Ridge
model = Ridge()
model.fit(X_train, y_train)

print('Training ser score: {:.2f}'.format(model.score(X_train, y_train)))
print('Test set score: {:.2f}'.format(model.score(X_test, y_test)))
# -> Training ser score: 0.89
# -> Test set score: 0.75

L1正規化とか、L2正規化ってなんだよ

下記のようなものらしい

続きを読む

k-最近傍法でアイリスのクラス分類問題を解く(python)

こんばんは。
本日は、機械学習の定番とも言える、アイリスの花のクラス分類問題をk-最近傍法を用いて解いてみようと思います。

実際、アイリスの花を分類したいというモチベーションがビジネス上役に立つかと問われると微妙ですが、学習だと割り切っていきましょう。(お花屋さんの方、すみません)

  • k-最近傍法とは
  • アイリスの花データを眺めてみる
  • データを可視化してみる
  • 学習から予測
  • k-最近傍法の利点と欠点

k-最近傍法とは

k-最近傍法とは、新しいデータポイントに対して、予測する際に新しい点に最も近い点を訓練セットから探し、新しい点に最も近かった点のラベルを予測データとする手法です。
(k-nearest neighbor algorithm という名前から、k-NNとも呼ばれます)
この手法では、近傍数というものをハイパーパラメータとして与えることができます。
近傍数を複数にした場合は、該当する点のラベルから多数決で予測ラベルを決定することになります。
言葉だけでの説明ではイメージしづらいと思いますので、いくつか図を紹介します。

下図は、近傍数 = 1 として予測を行なった結果です。
左上の星は●クラス
真ん中の星は▲クラス
右下の星は●クラス
に分類されていることが分かりますね。
(星は予測したいデータ)

続きを読む