#はじめに
機械学習の勉強を始めたのでアウトプットとして自分用にまとめていきます。
#教師あり機械学習
教師あり機械学習はクラス分類と回帰の2つに分けられる。正解が用意された訓練セットによってモデルを構築し、訓練セットと分けたテストセットによってその性能を図る。テストセットに対して性能を高めることを汎化という。
一般に、モデルを複雑にするほどモデルは訓練セットに適合する。その際、訓練セットに適合しすぎてテストセットに対する性能が下がることを過剰適合と呼び、逆に訓練セットへの適合が足りずテストセットに対する性能も低いことを適合不足と呼ぶ。
#教師あり機械学習アルゴリズム
##k-最近傍法
k-最近傍法には、クラス分類および回帰の双方が存在する。
+モデルが理解しやすい。
+あまり調整しなくても十分に高い性能になることが多い。
-訓練セットが大きくなると予測が遅くなる。⇒ データの前処理が重要。
-多数の特徴量(数百以上)のデータセットではうまく機能しない。
-疎なデータセットでは性能が悪い。
####クラス分類
from sklearn.neighbors import KNeighborsClassifier
テストデータに対するk個の近傍点の多数決によってクラスを採用する方法である。
n_neighbors
使用する近傍点の個数。少ないほどモデルの複雑度が高く、多いほどモデルの複雑度が低い。
####回帰
from sklearn.neighbors import KNeighborsRegressor
テストデータに対するk個の近傍点の算術平均を採用する方法である。
n_neighbors
使用する近傍点の個数。少ないほどモデルの複雑度が高く、多いほどモデルの複雑度が低い。
##線形モデル
入力特徴量の線形関数を用いて予測を行う方法である。
線形モデルには、クラス分類および回帰の双方が存在する。
+訓練は非常に高速で、予測も高速である。
+非常に大きいデータセットにも、疎なデータセットにも適用できる。
+予測が比較的理解しやすい。
+特徴量の数がサンプルの数より多いときに性能を発揮する。
+他の手法では適用できない大きなデータセットにも適用できる。
-データセット中に強い相関した特徴量があるときは、係数の意味を理解するのが難しい。
-低次元では他のモデルの方が良い汎化性能を示すことがある。
####クラス分類
決定境界が入力の線形関数になる。
ロジスティック回帰とSVMによる決定境界はよく似ている。
多クラス分類では、1対その他での分類を各クラスに対して行う。
#####ロジスティック回帰
from sklearn.linear_model import LogisticRegression
係数をなるべく0に近づけるために、正則化を行う方法である。
C
正則化の強度を決定する。大きいほど正則化が弱く(モデルの複雑度が高く)、小さいほど正則化が強く(モデルの複雑度が低く)なる。(default: 1.0)
penalty
正則化の種類を決定する。(default: "l2")
#####線形サポートベクタマシン(SVM)
from sklearn.svm import LinearSVC
係数をなるべく0に近づけるために、正則化を行う方法である。
C
正則化の強度を決定する。大きいほど正則化が弱く(モデルの複雑度が高く)、小さいほど正則化が強く(モデルの複雑度が低く)なる。(default: 1.0)
penalty
正則化の種類を決定する。(default: "l2")
####回帰
#####通常最小二乗法(OLS)
from sklearn.linear_model import LinearRegression
予測と真の回帰ターゲットとの平均二乗誤差(MSE)が最小となるように、係数と切片を調整する方法である。
+パラメータがない。
-モデルの複雑さを制御する方法がない。
#####リッジ回帰
from sklearn.linear_model import Ridge
予測に用いられる式はOLSと同様である。
係数をなるべく0に近づけるために、L2正則化を行う方法である。
+データサイズが小さいときに、線形回帰に比べて有効である。
-十分なデータがあると、線形回帰と同じ性能を示す。
alpha
係数への制約の強さ。少ないほどモデルの複雑度が高く、多いほどモデルの複雑度が低い。(default: 1.0)
#####Lasso
from sklearn.linear_model import Lasso
予測に用いられる式はOLSと同様である。
係数をなるべく0に近づけるために、L1正則化を行う方法である。
L1正則化では、いくつかの係数が完全に0になる。
+モデルの解釈が容易になる。
-十分なデータがあると、線形回帰と同じ性能を示す。
alpha
係数への制約の強さ。少ないほどモデルの複雑度が高く、多いほどモデルの複雑度が低い。(default: 1.0)
##ナイーブベイズクラス分類器
ナイーブベイズクラス分類器には、クラス分類のみが存在する。
+訓練が線形モデルよりもさらに高速である。
+高次元の疎なデータにも機能する。
+パラメータの値に対して頑健。
-LogisticRegressionやLinearSVCよりも汎化性能が僅かに劣ることが多い。
####クラス分類
#####ガウス分布モデル
from sklearn.naive_bayes import GaussianNB
任意の連続値データに適用できる。
クラスごとの個々の特徴量の平均値、標準偏差を格納する。
#####ベルヌーイ分布モデル
from sklearn.naive_bayes import BernoulliNB
2値データに適用できる。
alpha
大きくなるとアルゴリズムの振る舞いがスムーズになり、モデルの複雑さをは減少する。
#####多項分布モデル
from sklearn.naive_bayes import MultinomialNB
カウントデータに適用できる。
クラスごとの個々の特徴量の平均値を格納する。
alpha
大きくなるとアルゴリズムの振る舞いがスムーズになり、モデルの複雑さは減少する。
##決定木
分割を深くまで続けるとモデルが非常に複雑になるため、事前枝刈りおよび事後枝刈りを行う必要がある。
+結果のモデルの可視化が容易。
+特徴量の正規化、標準化が不要。
-訓練データの範囲の外側に対する予測ができない。
-枝刈りを行っても過剰適合しやすく汎か性能が低い傾向がある。
####クラス分類
from sklearn.tree import DecisionTreeClassifier
max_depth
木の深さの最大値。
####回帰
from sklearn.tree import DesicionTreeRegressor
max_depth
木の深さの最大値。
##決定木のアンサンブル法
#####ランダムフォレスト
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import RandomForestRegressor
分類と回帰の双方に用いられる。
ブートストラップサンプリングという手法で、データポイントから重複ありでランダムにサンプルの個数分選び出す。特徴量のサブセットもランダムに選び、選ばれたサンプル、特徴量によってモデルを構築する。
以上のように構築された複数の決定木を用いて、分類では各ラベルの確率の平均が最も高いラベルが、回帰では平均値が予測値となる。
n_estimators
構築する決定木の数。
max_features
選ばれる特徴量のサブセットの最大数。
max_depth
木の深さの最大値。
+非常に強力な手法である。
+ほぼパラメータチューニングせずに使える。
+データのスケール変換の必要がない。
+簡単に並列化できる。
+線形モデルに比べるとメモリの消費が多く、訓練も予測も遅い。
-テキストデータなどの非常に高次元で疎なデータにはうまく機能しない。
#####勾配ブースティング回帰木
from sklearn.ensemble import GradientBoostingClassifier
分類と回帰の双方に用いられる。
1つ前の決定木の誤りを修正するようにして次の決定木が作られていく。深さ1から5くらいの非常に浅い決定木を多数組み合わせることで性能を向上させる。
learning_rate
個々の決定木がそれまでの決定木をどれほど強く補正するかを制御する。
n_estimators
組み合わせる決定木の数。
+教師あり学習の中でも最も強力で広く使われている。
+特徴量のスケール変換が不要。
-パラメータのチューニングに注意が必要。
-訓練にかかる時間が長い。
-テキストデータなどの非常に高次元で疎なデータにはうまく機能しない。
##カーネル法を用いたSVM
from sklearn.svm import SVC
クラス分類と回帰の双方に用いられる。
より複雑なモデルを可能にするために線形サポートベクタマシンを拡張したもの。カーネルトリックと呼ばれる手法で、もとの特徴量のすべての多項式を計算する多項式カーネルまたはガウシアンカーネルを用いて非線形特徴量を追加する。これにより、線形分離不可能なクラスのモデル構築を可能にする。
gamma
ガウシアンカーネルの幅を調整する。ある点への「近さ」を定義する。
C
個々のデータポイントの重要度を制限する。
+さまざまなデータセットに対してうまく機能する。
-サンプルの個数が大きくなるとうまく機能しない。(~10000くらい)
-データの前処理、パラメータ調整に注意が必要である。
-モデルの解釈、検証が難しい。
##ニューラルネットワーク
from sklearn.neural_network import MLPClassifier
長くなるので割愛。
+大量のデータを用いることで非常に複雑なモデルを構築できる。
-訓練に時間がかかる。
-データの前処理、パラメータ調整に注意が必要である。
#参考文献
Pythonではじめる機械学習
――scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎
Andreas C. Muller、Sarah Guido 著、中田 秀基 訳