2021年2月26日
雨が降る予報だったけど一日どんより曇り空。花粉症患者的には雨降ってほしい。
SIGMAの新レンズ、28-70mm F2.8 DG DN | Contemporaryが発表される。以前スペック的には似たようなタムロンの28-75mm F/2.8(A036)を使っていたのだけど、画質はさておき、外観の安っぽさと各種リングの手になじまなさがしっくりと来ず、もう買うことは無いのだろうなぁと思っていたところに、スペック的には似ているレンズがシグマからも。写真で見る限り、プラスチックとはいえ外観が良い感じで、実際に使ってみたい。軽い(Lマウントは470g)のが良いのだよなぁ。後発で同価格帯だから、さすがにタムロン並の画質はあるのだろうし。
最近カメラ・レンズのニュースをやたら見かけると思ったら、カメラ最大のイベントCP+2021のオンライン開催が行われているのかぁ。本来なら家からすぐのパシフィコ横浜で開かれており、今まで一度も行ったことがなかったので行きたかった。昨年は周りのイベントが様子を見る中、早々にリアルイベントをやらないと決めた(国内の大きなイベントでは一番最初だったかも)CP+は偉い。
久しぶりの韓国ドラマ、キム秘書は一体、なぜ?の1,2話を見る。てっきり「なぜ?」の答えはドラマの最後に明かされるのかと思いきや、普通に1話で明かされて、2話からはラブコメとなるのだけど、何も考えず力を抜いて見れるので、これはこれで面白く見れる。
昨晩から調子が悪く、朝はだいぶ体調が悪くて、今日は一日寝て過ごそう。という感じだったのだが、午後から活動できる程度には良くなってきたので本を読みすすめる。
機械学習学習日記 - 25日目
scikit-learnとTensorFlowによる実践機械学習を引き続き。
3章 分類では二項分類・多クラス分類・交差検証・混合行列と性能指標(ROC/AUC)などなど。ちゃんとしたモデルの説明というよりはこんなふうやれるよ、細かいのは後の章で、というスタンスで進めている。
データベースはMNISTの手書き文字(7万個の28x28画像)を使ってるので、実データに比べたら大した事ないにせよそこそこ計算機コストがかかる。グリッドサーチの説明では実行するとハードウェアによって16時間かかったから注意、みたいなことも書いてあって、たしかに12コア(Ryzen9 3900)で n_jobs=-1
環境(コア全部使う)で1時間10分かかったのでそれなりだ。Pythonではじめる機械学習のほうはMNISTの縮小版で手書き認識をやっていたので、初心者への説明する時の手を動かしてやるデータとしては、そちらのほうが進めやすいなぁ。
この本は演習問題もあって、コードを読んでいても Python に慣れてない事もあって勉強になる。3章の演習では、画像を縦横1pxずつずらしたものをデータセットにし、データ量を5倍にしたものを学習させ、スコアが0.5%上がったことを確認させたり(訓練セットの拡張)。
他の演習問題では、こないだやったKaggleのタイタニック問題を解く。自分でやったときは pandas のDataFrameをこねくり回して居たけど、こちらの本の解説ではうまく scikit-learn のインターフェイスとパイプラインに合わせて実装する方法を解説している。例えばカテゴリ変数なら、以下のように最頻値で欠損値を穴埋めするクラスを定義して、それをパイプラインで処理していく。なるほど~。(なお、書籍のコードは大半をしめなければ自由に使って良いとのこと)
class DataFrameSelector(BaseEstimator, TransformerMixin):
def __init__(self, attribute_names):
self.attribute_names = attribute_names
def fit(self, X, y=None):
return self
def transform(self, X):
return X[self.attribute_names]
# Inspired from stackoverflow.com/questions/25239958
class MostFrequentImputer(BaseEstimator, TransformerMixin):
def fit(self, X, y=None):
self.most_frequent_ = pd.Series([X[c].value_counts().index[0] for c in X],
index=X.columns)
return self
def transform(self, X, y=None):
return X.fillna(self.most_frequent_)
cat_pipeline = Pipeline([
("select_cat", DataFrameSelector(["Pclass", "Sex", "Embarked"])),
("imputer", MostFrequentImputer()),
("cat_encoder", OneHotEncoder(sparse=False)),
])
続いてスパム分類器を作る演習。データセットからemailをパース、本文、ヘッダを見る、メールbodyからプレーンテキストへの変換、単語カウントとstemming(表記ゆれ)変換、スパース行列のcsr_matrixへの格納、Estimator化、などなど一通り。
4章 モデルの訓練では、線形回帰・勾配降下法・線形モデル正規化(Ridge/Lasso/ElasticNet)、ロジスティック回帰・ソフトマックス回帰など。数式が結構手出てきて、シンプルなのは python コードで実装に落としてあるものもあり理解しやすいのだけど、難しいのはなるほどわからん、という感じに…。
5章 サポートベクトルマシン(SVM)。線形SVMの説明は、サポートベクトルが解りやすくプロットされてる図ですんなりと理解できた。マージン境界とパラメータもわかりやすい。続いてカーネルトリックを用いたいわゆるSVMの話。カーネルトリックを使うと、特徴量を追加せずに多項式特徴量を追加したかのような結果が得られる。その代表的なカーネル各種の紹介と説明。
5.4 からカーネルトリックの理論なのだけど、今の知識じゃ全然分からずさらっと読み流す。
5章の演習問題で、MNISTデータセットをSVMで訓練する項目があるのだけど、6万のデータセット中1000個のパラメータで試していて、それぐらい減らしてデータセットによっては良いのか。またグリッドサーチでは RandomizedSearchCV にパラメータに scipy.stats の統計関数、 reciprocal, uniform の離散値の関数を使っていて、こんな書き方できるのかー。