前回の続きです。
Pythonではじめる機械学習という本の2章の前半についての備忘録です。
この記事は「Pythonではじめる機械学習」を読んでいる人じゃないとなんのこっちゃだと思います。ぜひ買って一緒に勉強しましょう!
教師あり学習
何かを学ぶときはまずその学問や分野で用いられる言葉を身に着けていかなければ会話や議論ができない。初学者である私はまずこの大きな壁を少しずつよじ登っていかなければこの道に入っていくことはできない。ということで少々煩雑ではあるが、初めて耳にする言葉も同時に説明を入れていく。
クラス分類と回帰
教師あり機械学習は大別すると
・クラス分類
・回帰
に分類できる(これはクラス分類)。
1章でやったアイリスの分類や、SPAMメールかどうかの判断もクラス分類になる。
一方、回帰は連続値予測をおこなう機械学習のことをいう。
例えば
・トウモロコシの収穫量
・年収の予測
・株価の変動
とかである。
汎化、過剰適合、適合不足
機械学習で目指すところは汎化(generalize)である。
訓練データから作った予測モデルが、未知のデータに対して正確に予測ができるのであれば、そのモデルは汎化できているという。
モデルがいい感じかどうかってことでいいと思います。
必要以上の情報量を与えたモデルを作ってしまうことを過剰適合という。その逆は適合不足という。
適合不足から情報量を増やしていくと精度は徐々に上がるが、ある情報量を超えると、過剰適合となり下がり始める。
この最良の汎化性能を示すスイートスポット(精度の極大値)を与えるモデルが求めるモデルである。
教師あり機械学習アルゴリズム
警告文
# データセットの生成
X, y = mglearn.datasets.make_forge()
この時
DeprecationWarning: Function make_blobs is deprecated; Please import make_blobs directly from scikit-learn
warnings.warn(msg, category=DeprecationWarning)
警告文が出ますが進めるのでとりあえず無視します。
これ以降もmglearnを使った時に警告文はいっぱい出てきますが全部無視します。
ウィスコンシン大学
ウィスコンシン大学
世界大学ランキングにも載っており、ノーベル賞受賞者も輩出している優秀な学校です。
この本を読んだ人とならウィスコンシン大学で仲良くなれるかも。
「あー、あのウィスコンシンのやつね」
「そうそう、乳がんのやつ!」
みたいなね。
zip関数
Python, zip関数の使い方: 複数のリストの要素をまとめて取得
Zip関数の使い方はこちらを参考に。
特徴量エンジニアリング
特徴量間の積を交互作用と呼ぶ。
k-最近傍法
k-最近傍法のクラス分類
k個の最も近いデータを参照し、投票(多数決)でラベルを決める方法。文脈からするに距離による重みはないので、一番近いものと違うラベルになることもありそう。2個の特徴量を変化させていくことでクラスの境界を決定することができる。この教会のことを決定境界と呼ぶ。kの値が大きいほどなめらかな決定境界になり、小さいほど複雑度の高いモデルに対応することができる。本ではkの数を変化させていって精度が最も高くなる参照数を求めていた。
######k-近傍回帰
k-最近接法の回帰バージョン。こっちはk=1だと一番近いものの値に、3とか9だと平均値を採用するやり方。一番単純そうなだれでも思いつくやり方かな。
利点と欠点
利点:理解しやすい、調整しなくてもけっこう高い精度が出せる
欠点:訓練セットが大きくなると遅くなる、疎なデータセットだと性能が悪い
このため実際にはほとんど使われていない。
線形モデル
線形回帰
最小二乗法ってやつです。2乗した時の誤差が一番小さくなるようなパラメータを採用するやり方。
リッジ回帰
いきなり意味不明になっちゃいました。
L2正則化の説明なさすぎやろ。。。
過学習とL2正則化
このページとかで確認するとなんとなくイメージしやすかったかも。
要するに、
「傾き」wを
訓練データに対する予測だけじゃなく、ほかの制約に対しても最適化するために(←ここよくわからん)
wを訓練データに対してのフィッティング(最小二乗法で得られる結果)よりも小さくしたい。
なのでwの大きさに対して二乗和のペナルティを与えてわざと小さくしている。
ペナルティが小さくなればただの線形モデルに近づいていくし、
ペナルティが大きいとwは0に近づいていく。
つまり汎化させたいときはペナルティを大きくすればよいがどの程度大きくすればよいかはモデルによって異なる。
うん。自分で言っててよくわからん。
Lasso
こっちは絶対値の和をペナルティにしているんだけど、その時は係数が0になりやすいらしくて
変数を減らしたいときに使ってって書いてあった。
よくわからんからまた詳しく調べて記事にします。
クラス分類のための線形モデル
クラス分類するときの線形モデルは関数の値が0より大きいか小さいかで分類している。
ロジスティック回帰は回帰って入ってるけど分類アルゴリズムだそう。
線形SVCとロジスティック回帰の違いはよくわからなかった。
線形モデルによる多クラス分類
1対その他(one-vs.-rest)アプローチが説明されてた。
一つのクラスとその他で分類して、それをすべてのクラスに対して行うことによって分類している。
言ってることはまあわかるんだが、結局scikit-learnを使ってるだけで理解が深まってないような。。。
使い方はわかるから、まずはなれるところからですかね。