本日のまとめ(アンサンブル学習)
アンサンブル学習
- 様座な分類器を1つのメタ分類器として組み合わせる。
- 最もよく使われるのは多数決(majority voting)
- 2値分類問題で1つの誤分類率が0.25の分類器を11個組み合わせた場合、6個以上(過半数)が間違える確率は0.034となる(具体的な計算は割愛)
- 単純な多数決ではなく、重み付きとなることもある
- 上記をpythonで実装するには、argmaxとbincountを組み合わせる
バギング
- アンサンブルを構成する個々の分類器に同じトレーニングデータではなく、最初のトレーニングデータセットから、ブートストラップ標本(ランダムな復元抽出)を利用する。
- 上記から、バギングはブートストラップ集約とも呼ばれる。
アダブースト(Adaptive Boost:AdaBoost)
- アンサンブルは非常に単純なベース分類器で構成される
- 分類の難しい誤分類されたトレーニングサンプルをあとから弱学習器に学習させることでアンサンブルの性能を向上させる
アダブーストの仕組み
ブースティングの原型
- トレーニングデータセットDから、ランダムなサブセットd1を非復元抽出し、弱学習器C1をトレーニングする
- 2つ目のランダムなトレーニングデータセットd2を非復元抽出し、以前に誤分類されたサンプルの50%を追加してC2をトレーニングする
- トレーニングデータセットからC1, C2の結果が異なるものから構成されるd3を洗い出す。そのd3を用いて学習器C3をトレーニングする
- C1, C2, C3で多数決する
- 上記の手順では、過学習になる傾向がある
アダブースト
- 誤分類の重みを大きく、正しいものの重みを小さくを繰り返す
本日のまとめ(モデルの評価、チューニング)
パイプラインによるワークフローの効率化
make_pipeline
は、入力としてsklearnの変換器(ex.StandardScaler, PCA)と、推定器(ex. LogisticRegression)を受け取る- 変換器はいくつ指定してもよい
- 変換器は、fit & transform, 推定器はfit & predictをもつ
- pipelienのfit()コール時は、変換器はfit & transformを実行し、最終的に推定器のfitが実行される
- pipelineのpredict()コール時は、変換器はtransformを実行し、最終的に推定器のpredict()が実行される
k分割交差検証を使ったモデル性能評価
- 学習不足(バイアス高)と、過学習(バリアンス高)のバランスをとるために、ホールドアウト法と、K分割交差検証という手法を利用する
ホールドアウト法の概要
- 推定器やハイパーパラメータのモデル選択の際に、テストデータセットを利用してしまうのはよくない。。
- モデル選択のステップように、トレーニングデータセットをさらに、「トレーニングデータセット」と「検証データセット」に分ける。
- チューニングに満足したら、テストデータセットを利用する。
k分割交差検証
- モデルのチューニングに利用される
- ホールドアウト法の強化版がk分割交差検証と思えばよい。
- トレーニングデータセットをランダムにk個に分割し、そのうちk-1個をトレーニング、1個を性能の評価に使用する
- 個々のサブセットに基づいて、モデルの平均性能を計算する
- 充分なハイパーパラメータが見つかったら、トレーニングデータセット全体でモデルを再トレーニングする→トレーニングサンプルは多ければ多いほうが良いため。
- k分割交差検証は非復元再抽出法
- 大体はk=10を使用する。サンプルが多い場合は、時間かかるので、k=5にしたりする。サンプルが少ない場合は、kを大きくしたりする。
- 層化k分割交差検証(stratified k-fold cross-validation)では、各サブセットでクラスの比率を維持する
学習曲線と検証曲線によるアルゴリズムの診断
- scikit-learnの
learning_curve
を使用する。デフォルトで、層化k分割交差検証を使って交差検証の正解率を計算する -検証曲線は、サンプルサイズではなくパラメータの値を変化させたときのスコアをプロットする。 - 検証曲線を描くには
validation_curve
を使用する
グリッドサーチによる機械学習モデルのチューニング
GridSerachCV
クラスにより、様々なハイパーパラメータから最適解を求められる
入れ子式交差検証によるアルゴリズムの選択
- パラメータチューニングを、外と内で分けて実施。例えば、5*2など。
様々な性能評価指標
- 適合率(precision), 再現率(recall), F1-score
混同行列
- 混同行列は、真陽性(true positive)・偽陽性(false positive)・真陰性(true negative)・偽陰性(false negative)を報告する正方行列
- scikit-learnでは
confusion_matrix
関数が用意されている
誤分類率・再現率、適合率、F1
- 誤分類率,(ERR) 再現率(ACC)は以下のように表される
- 真陽性率(TPR),偽陽性率(FPR)は、以下のようにあらわされる
- 適合率(PRE) , 再現率(REC)は以下尿に表される
-GridSearch
のscoringに上記の指標を用いることも可能
- 適合率(PRE)と再現率(REC)を組み合わせてたF1-scoreがよく使用される
- これらは
sklearn.metrics
モジュールからインポートできる
ROC曲線
- Receiver Operation Characteristic 曲線
- ROC曲線では、真陽性率(TPR) と、偽陽性率(FPR)が選択の基準となる。
- 対角線がランダムな推定として解釈でき、対角線を下回るものはランダムよりも劣る。
- 完璧なものは左上隅にプロットされる
不均衡なデータ
本日のまとめ
線形判別分析による教師ありデータ圧縮
- 線形判別分析(Linear Discriminant Analysis).PCAは分散が最も大きい直工成分軸を見つけるのに対し、LDAはクラスの分離を最適化する特徴部分空間を見つけ出す
- LDAは教師ありのアルゴリズム。そのため、一般的にはこちらの方が優れている
- LDAはデータが正規分布に従っていることを前提として、線形判別する
LDAの手順
- d次元のデータセットを標準化する
- クラスごとにd次元の平均ベクトルを計算する
- 平均ベクトルを使ってクラスかん変動行列Sbと、クラス内変動行列Swを生成する
- 行列Sw-1Sbの固有ベクトルと固有値を計算する
- 固有値をソートする
- d*k次元の変換行列Wを生成するために、最も大きいk個の固有ベクトルを生成し、変換行列Wを生成する
- 変換行列Wを使ってサンプルを新しい特徴空間へ射影する
平均行列の作成
- クラスラベルi の平均行列は以下のようになる
- クラス内変動行列Swは、個々のクラスiについて変動行列Siは
- クラス内変動行列を計算するときは、(定義からしても)クラスラベルが一様に分布していることが前提となる。
- していない場合は、スケーリングが必要
カーネル主成分分析を使った非線形写像
- 非線形問題を解くには、より高次元の特徴空間へ射影し、そこで線形分離可能な状態にする
- φは、もとの特徴量を別の高次元へ射影する。例としては以下のようなもの
- この高次元空間に対して、標準のPCAを適用し、より低次元の空間へデータを再び射影し、サンプルを分離する
- 上記は、非常に計算コストが高いので、「カーネルトリック」の出番となる。これにより、元の特徴空間において2つの高次元の特徴ベクトルの類似度を計算する
一般的なPCAについて
- 特徴量が標準化されているとき、共分散と、共分散行列は以下のように現れる
- カーネル主成分分析の数式展開がかなり難しい。。。。ここはかなり難しいのでいったんとばす。。
- RBFカーネルPCAの実装は、次の3つの手順にまとめることができる。
- カーネル(類似度)行列Kを計算し、そこで次の計算をする
\\
上記の計算をサンプル毎に行う(全ペア) - 以下の式を使って、Kの中心化を行う
- ガンマは、実験が必要となるので、グリッドサーチ的に求める
本日のまとめ
特徴抽出の方法
次元削減による特徴抽出の主な方法は以下の3つ - 教師なしデータ圧縮での主成分分析 - クラスの分離を最大化する教師あり次元削減法としての線形判別分析(LDA) - カーネル主成分分析(KPCA)による非線形次元削減
主成分分析による教師なし次元削減
- データが新しい特徴空間に変換・射影される。
- 主成分分析(Principal Component Analysis:PCA)は、特徴量同士の相関に基づいてデータからパターンを抽出する
- 高次元データにおける、分散が最大となる方向を見つけ出し、元の次元と同じかそれよりも低い次元の新しい部分空間へ射影する。
- PCAを次元削減に使用する場合、d×k次元(d行k列)の変換行列Wを作成する 以下のとき、k << dで、最初の主成分の分散は最大となる。
, \textbf{z} \in \mathbb{R}^{k}
PCAの方向は、データのスケーリングに非常に敏感!!!すべての特徴量に等しい重要度を割り当てたい場合は必ず標準化すること! 単純な手順をまとめると以下の通り (参考)https://qiita.com/animegazer/items/c7d99d6d1dee2f3f936f (参考2)https://qiita.com/Seiji_Tanaka/items/5c8041dbd7da1510fbe9
d次元のデータセットを標準化する
- 標準化したデータセットの共分散行列を作成する(共分散とは、偏差の積に対する平均値で、それらを要素とする行列を共分散行列)。データのバラツキの大きさと向きを表す
- 共分散行列を固有ベクトルと固有値に分解する(向きをとる)
- 固有値を降順でソートして、対応する固有ベクトルをランク付けする
- もっとも大きいkこの固有値に対応するk個の固有ベクトルを選択する(k < d)
- 上位k個の固有ベクトルから射影ベクトルWを作成する
- 射影ベクトルWを使ってd次元の入力データセットXを変換し、新しいk次元の特徴部分空間を取得する
共分散行列の作成
- 特徴量xjと、xkの間の共分散は以下の通り
- 上記から、共分散行列は以下のように記述できる
全分散と説明分散
本日のまとめ(データ前処理:特徴量の選択)
特徴量の選択
複雑さに対するペナルティとしてのL1/L2 正則化
- L2正則化により、複雑さを提言可能である
- L1正則化は以下の通り。
- L2正則化に関する解説が正直よくわからない。。。特に、「正則化パラメータλの値が大きくなるほど、ペナルティを受けるコスト関数の成長が早くなり、L2の円は狭くなる。たとえば、正則化パラメータの値を無限大にむかって増やした場合、重み係数は実質的に0になる」の部分がわからない。。
- L1正則化が、「ほとんどの特徴量の重みを0として、疎な特徴ベクトルを作成する」理由もいまいち不明。。ここは要復讐。
- ロジスティックの解説参考
逐次的特徴選択アルゴリズム
- 特徴選択による次元削減は、モデルの複雑さを低減し、過学習を回避するひとつの方法。
- 次元削減法は、主に特徴選択(feature selection)と、特徴抽出(feature extraction)の2つのカテゴリに分かれる。特徴選択は、元の特徴の一部を選択。抽出は、新たな特徴空間を抽出することを指す
逐次特徴選択は、貪欲探索(greedy search)の一種。( k < d)において、d次元の特徴をk次元に削減するときに使用される。目的は、次元削減により計算効率を改善することと、ノイズを取り除き、モデルの汎化誤差を削減することである。
逐次後退選択(Sequential Backward Selection: SBS)は、典型的な逐次特徴選択アルゴリズムである。 貪欲探索法では、局所的最適選択が行われるのにチアして、しらみつぶし探索(exhaustive seacrch algorithms)では、考えられる組み合わせすべてが評価される。しらみつぶしは、計算量の観点から現実的ではない。
- SBSでは、最小化したい評価関数を定義し、特徴量を削除する前後で、性能の差を評価する。
ランダムフォレストで特徴量の重要度にアクセスする
- データセットから重要な特徴量を抽出する手法として、ランダムフォレストを利用する方法がある
- RandomForestClassifierを適合させた後、feature_importances_属性を使って値を取得可能
本日のまとめ(データ前処理)
欠測値のとりあつかい
欠測値の削除
- scikit-learnはNumpy配列に対応しているが、前処理には、pandasのDataFrameの方が便利なことがある
- dropnaメソッドで、欠測値を含む行を削除できる.削除の方法は色いろ。
欠測値の補完
- 削除しすぎると、有益な情報が失われる場合がある。このような場合は、別の補完法を用いる
- 代表的なものは、平均値補完である。scikit-learnの
Imputer
クラスを使用すると便利 参考, scikit-learn SimpulImputer
は、変換器クラス(transformer)に属している- scikit-learnの変換器(transformer)クラスは、
fit
とtransform
の2つのメソッドがある fit
は、トレーニングデータセットから、パラメータを学習するのに使用するtransform
は、学習したパラメータに基づいて、データを変換するのに使用する- データ配列に含まれる特徴量の数は、モデルの適合に使用されたものと同じでなければならない。
- 決定木などの分類器は、推定器(estimator)に属している
カテゴリデータの処理
- カテゴリデータは、名義特徴量(赤、青など)かと順序(サイズのXL > L > Mなど)を区別する必要がある。
- 順序特徴量のマッピングは、明示的に定義してやる必要がある
- DataFrameの
map
メソッドに、辞書を指定することで区別可能 - 分類用の推定器は、クラスラベルを内部で整数に変換するが、ミスを回避するには内部的に変換させるのではなく、あらかじめクラスラベルを整数の配列として提供するのがよい。(どの値を割り当てるかは重要ではない)
- ラベルを反転させるには、mapとkey, valueを反転させて再変換するか、
LabelEncoder
を使用するかの方法がある - 名義特徴量を、順序づけてエンコードしてしまうと、順序があると勘違いしてしまう!!!
- このような場合、one-hot エンコーディングという手法を使用する!!
- green, redなどを名義特徴量の列の一意な値ごとにダミー特徴量を新たに作成する
- これには、
scikit-learn preprocessing
の'OneHotEncoder`を用いる - OneHotEncoderの
categorical_features
は廃止されているので、ColumnTransformer
を使用する 参考, 参考 - pandasの
get_dummies
は文字列のみを、ダミー特徴量に変換する - ダミー特徴量は、赤、青、緑を表すには2つで十分(計算量減らしたい)。このような場合、drop_first=Trueにする
トレーニングデータとテストデータセットを分割する
- 分割にはtrain_test_split関数を使用する
特徴量のスケーリング
- 特徴量のスケーリング(feature scaling)
- 決定木やランダムフォレストでは不要
- 勾配降下法などは、複数の特徴量の尺度が同じである場合がうまく動作する -- 単純な例では、スケーリングされていないと、、、誤差平方和もK近傍法も、誤差が大きなところに引っ張られる!!!
- よく実施されるスケーリングは、正規化(normalization)と標準化(standardization)の2つ
- 正規化・・・[0,1]の範囲にスケーリング。min-maxスケーリングは以下のように計算できる。
- 訓練データの正規化は、訓練データをモデルとして、テストデータの正規化も訓練データをモデルとするのがポイント
- 標準化は、平均値を0, 標準偏差を1となるように変換する。特徴量の列が正規分布に従うため、重みを学習しやすくなる。標準化の式は以下の通り。
本日のまとめ
決定木学習
決定木の学習方法
- 情報利得が最大となる特徴量でデータを分割する
- 情報利得の考え方には、情報エントロピーを考える方法(C4.5)と、ジニ不純度、分類誤差を考える方法がある
- どちらの方法でも、分割前後の不純度の差分が大きければ大きいほど、情報利得が大きいと考えることができる. 情報利得は次のように定義される
- 二分決定木の場合は、以下のようになる
- 上記の定義から、ノードのサンプルがすべて同じクラスの場合p(i|t) = 1で、は log1 = 0となるので、エントロピーは0となる。エントロピーが最大となるのは、サンプルが一様に分布している場合。
- ジニ不純度の定義は以下の通り
- 2値分類の場合、
- 分類誤差の定義は以下の通り
- 分類誤差は、クラス確率の変化に敏感ではないため、決定木の成長には向いていない
ランダムフォレストについて
- ランダムフォレストは、決定木の「アンサンブル」
- 決定木は、根を深くすると、過学習(バリアンスが高い状態)を起こしがち
- バリアンスが高い複数の(深い)決定木を平均化することで、より汎化性能が高い頑健なモデルを構築する
手順は以下の通り
トレーニングデータからnこのサンプルをランダムに選択する
標本から決定木を成長させる。
- 特徴量を重複なしで抽出する
- 特徴量を使って、ノードを分割する
上記をk回繰り返し、「多数決」に基づいてクラスラベルを割り当てる。
ハイパーパラメータの調整に悩む必要がないという利点がある。
- サンプルのサイズを小さくすると、「ランダム性」が向上し、過学習を抑える効果が期待できる
- 特徴量の数は、ルートをとることがおおい。
k近傍法 ( K-nearest neighbor classifier)
- kの値と、距離指標を選択する
- 分類したいサンプルから、k子の最近傍のデータ点を見つけ出す
- 多数決によりクラスラベルを割り当てる
- 距離指標は、データセットの特徴量に適した指標を選択することが需要!