機械音痴な情報系

エラーの解決方法とTips

Pythonではじめる機械学習【2章(2.3)】

Chapter 日付
2.3.1 4/6
2.3.2 4/6
2.3.3 4/12、4/13


量が多いので「2.3 教師あり機械学習アルゴリズム」は別個にする。
参考書に加えAidemyで学んだことも多かったので適宜付け足していく。Aidemyの説明は大変わかりやすかったのでお勧めします。
無料でかなりの量のコンテンツが学べました(4/11より有料化)。


2.3.1 サンプルデータセット

ここはさらっと。
合成した(でっちあげた)2クラス分類データセットとしてforge(~を捏造する、偽造する)データセットを用いる。
まずは、データの中身を確認する。

# generate dataset
X, y = mglearn.datasets.make_forge()

# plot dataset
mglearn.discrete_scatter(X[:, 0], X[:, 1], y)
plt.legend(["Class 0", "Class 1"], loc=4)
plt.xlabel("First feature")
plt.ylabel("Second feature")
print("X.shape: {}".format(X.shape)) # (26, 2)

discrete_scatter('散布図に描写する各データのX値', '〃Y値', '〃LABEL')
第三引数に各データに対するラベルを指定することにより、そのラベルに応じてMarkerの種類や色を変えて散布図を描写(pyplot.scatter()の呼び出し)をしてくれるメソッド。
つまり、ここではXというデータの1列目をX軸、2列目をY軸に設定し、各データのラベルはyを利用しているということ。

・plt.legend()
グラフに凡例を付ける。locは凡例を書く場所を指定している。4の場合は「lower right」となる。
matplotlib.axes.Axes.legend — Matplotlib 2.2.2 documentation




回帰の場合はwaveデータセットを用いる。こっちも確認。

X, y = mglearn.datasets.make_wave(n_samples=40)
plt.plot(X, y, 'o')
plt.ylim(-3, 3) # y軸が-3~3に
plt.xlabel("Feature")
plt.ylabel("Target")


特徴量が少ないデータセット = 低次元データセット(low-dimensional dataset)  可視化が容易
 〃  多いデータセット  = 高次元データセット(high-dimensional dataset)

小さい合成データセットを補うために、2つのデータセットを用いる
1. cancerデータセット(ウィスコンシン乳癌データセット)

from sklearn.datasets import load_breast_cancer

cancer = load_breast_cancer()
print("cancer.keys(): {}".format(cancer.keys())) # keyの名前をチェック

# 各keyについて構成を見ていく
# cancerのデータの形
print("Shape of cancer data: {}".format(cancer.data.shape)) # (569, 30)

# クラスごとのサンプル数
print("Sample counts per class:\n{}".format(
      {n: v for n, v in zip(cancer.target_names, np.bincount(cancer.target))})) # {'benign': 357, 'malignant': 212}


# 特徴量名(cancer.DESCRでより詳しい情報)
print("Feature names:\n{}".format(cancer.feature_names))


2. boston_housingデータセット(ボストン近郊の住宅価格)

from sklearn.datasets import load_boston

boston = load_boston()
print("Data shape: {}".format(boston.data.shape)) # (506, 13)

ここでは、13個の特徴量以外のものも使う。
交互作用(interaction)
 特徴量感の積。つまり、犯罪率と高速道路への利便性を特徴量として見るだけではなく、その積も特徴量として考える。
 →特徴量エンジニアリング(feature engineering) 詳しくは4章で。



交互作用を用いたデータセットは以下のようにして使うことが出来る。

X, y = mglearn.datasets.load_extended_boston()
print("X.shape: {}".format(X.shape)) # (506, 104)

# 13+12+11+...1 = 91
# 13+91 = 104

2.3.2 k-最近傍法

こっから本番!

2.3.2.1 k-最近傍法によるクラス分類

Nearest Neighbors Classification — scikit-learn 0.19.1 documentation

k-nearest neighbor algorithm, k-NN。最も単純な学習アルゴリズム
・モデルの構築方法
 訓練データセットを格納するだけ

アルゴリズム
 新しいデータポイントに対して、訓練データセットの中から一番近い点(最近傍点)を見つける。
 簡単に言うと、予測をするデータと類似したデータをいくつか見つけて、多数決で分類結果を決める。
 他と違い、教師データから学習するわけではなく予測時に教師データを直接参照してラベルを予測する。
 結果の予測を行う際に
  ①教師データを予測に用いるデータとの類似度で並べ直し、
  ②分類器に設定されたk個分のデータを類似度の高い順に参照し、
  ③参照された教師データが属するクラスのなかで最も多かったものを予測結果として出力する

・特徴
 怠惰学習とも呼ばれていて、学習コスト(学習のための計算量)が0である
 アルゴリズムとしては比較的簡単で、高い予測精度が出やすい
 複雑な形の境界線も表現しやすい
 2クラス、多クラス問題ともに適用可能
 
・欠点
 分類器に指定する自然数kの個数を増やしすぎると、識別範囲の平均化が進み予測精度が下がってしまう
 予測時に毎回計算を行うため教師データや予測データの量が増えると計算量が増えてしまい、低速なアルゴリズムとなってしまう

from sklearn.model_selection import train_test_split

X, y = mglearn.datasets.make_forge()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

# クラスをインポオートしてインスタンスを生成。
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=3)

# 訓練セットを用いてクラス分類器を訓練(データセットを保存するだけ!)
clf.fit(X_train, y_train)

# テストセットに対する予測
print("Test set predictions: {}".format(clf.predict(X_test))) # [1 0 1 0 1 0 0]

# テストセットに対する精度
print("Test set accuracy: {:.2f}".format(clf.score(X_test, y_test))) # 0.86

predict()
テストデータに対して予測を行う。テストセットのそれぞれのデータポイントに対して訓練セットの中から最近傍点を計算し、最も多いクラスを見つけ出す。

score()
 モデルの汎化性能を評価。テストデータと、テストラベルを引数に渡す。


2.3.2.2 KNeighborsClassifierの解析

決定境界(decision boundary)
平面をそこに点があったとしたら分類されていたであろうクラスに従って色付けし、分けること。

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

# k=1,3,9のときに決定境界線を描画
for n_neighbors, ax in zip([1, 3, 9], axes):
    # fitメソッドは自分自身を返すので1行でインスタンスを生成してfitすることが出来る
    clf = KNeighborsClassifier(n_neighbors=n_neighbors).fit(X, y)
    mglearn.plots.plot_2d_separator(clf, X, fill=True, eps=0.5, ax=ax, alpha=.4)
    mglearn.discrete_scatter(X[:, 0], X[:, 1], y, ax=ax)
    ax.set_title("{} neighbor(s)".format(n_neighbors))
    ax.set_xlabel("feature 0")
    ax.set_ylabel("feature 1")
axes[0].legend(loc=3)

subplot()
matplotlib の figure(図) と axes(座標軸)-python | コード7区
figsize:図全体
axes:図内部の座標軸
subplot(行数, 列数, プロット番号)
行数列数によってfigureが分割され、プロット番号の位置に座標軸を作成する。
プロット番号(1〜n)は左上から右下へ割り振られる。

今回は横10インチ、縦3インチのfigureを用意し、1行3列に分割している。

ファイルへの保存はfigure単位で行われる。






cancerセットでモデルの複雑さと、汎用性能の関係を可視化する。

from sklearn.datasets import load_breast_cancer

cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    cancer.data, cancer.target, stratify=cancer.target, random_state=66)

training_accuracy = []
test_accuracy = []
# n_neighborsを1〜10まで試す
neighbors_settings = range(1, 11)

for n_neighbors in neighbors_settings:
    # モデルを構築
    clf = KNeighborsClassifier(n_neighbors=n_neighbors)
    clf.fit(X_train, y_train)
    # 訓練セット精度を記録
    training_accuracy.append(clf.score(X_train, y_train))
    # 汎用化精度を記録
    test_accuracy.append(clf.score(X_test, y_test))
    
plt.plot(neighbors_settings, training_accuracy, label="training accuracy")
plt.plot(neighbors_settings, test_accuracy, label="test accuracy")
plt.ylabel("Accuracy")
plt.xlabel("n_neighbors")
plt.legend()
kの個数 決定境界 モデル 訓練精度 テスト精度
少ない 複雑(訓練データに近い) 複雑なモデルに対応 高い 低い
多い 単純(境界線は滑らか) 単純なモデルに対応 低い 高い

1つの最近傍点のみを考慮すると、訓練セットに対する予測は完璧。テスト精度が低い理由はモデルが複雑すぎるから。
多くに対して考慮すると、モデルはシンプルになるので訓練精度は低下。この場合10ではモデルが単純化しすぎている。


2.3.2.3 k-近傍回帰

mglearn.plots.plot_knn_regression(n_neighbors=1)
k=1   最近傍点の値をそのまま使用
k=2〜 最近傍点の平均値を用いる
from sklearn.neighbors import KNeighborsRegressor

X, y = mglearn.datasets.make_wave(n_samples=40)

# waveデータセットを訓練セットとテストセットに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

# 3つの最近傍点を考慮するように設定してモデルのインスタンスを作成
reg = KNeighborsRegressor(n_neighbors=3)
# 訓練データと訓練ターゲットを用いてモデルを学習させる
reg.fit(X_train, y_train)

# テストセットに対する精度
print("Test set predictions:\n{}".format(reg.predict(X_test)))
# [-0.054  0.357  1.137 -1.894 -1.139 -1.631  0.357  0.912 -0.447 -1.139]

# テストセットのR^2
print("Test set R^2: {:.2f}".format(reg.score(X_test, y_test)))
# 0.83

決定係数(coefficient of determination)
R^2スコア。回帰モデルの予測の正確さを測る。
scoreメソッドに対して回帰予測機はR^2スコアを返す。
0〜1までの値を取る。
1:完全な予測
0:訓練セットのレスポンス値(y_train)の平均を返すだけ。


2.3.2.4 KNeighborsRegressorの解析

1次元のデータセットに対して全ての値に対する予測値がどのようになるのか見てみる。

fig, axes = plt.subplots(1, 3, figsize=(15, 4))
# -3〜3に1000点のデータポイントを作る
line = np.linspace(-3, 3, 1000).reshape(-1, 1)
for n_neighbors, ax in zip([1, 3, 9], axes):
    # 1、3、9近傍点で予測
    reg = KNeighborsRegressor(n_neighbors=n_neighbors)
    reg.fit(X_train, y_train)
    ax.plot(line, reg.predict(line))
    ax.plot(X_train, y_train, '^', c=mglearn.cm2(0), markersize=8)
    ax.plot(X_test, y_test, 'v', c=mglearn.cm2(1), markersize=8)

    ax.set_title(
        "{} neighbor(s)\n train score: {:.2f} test score: {:.2f}".format(
            n_neighbors, reg.score(X_train, y_train),
            reg.score(X_test, y_test)))
    ax.set_xlabel("Feature")
    ax.set_ylabel("Target")
axes[0].legend(["Model predictions", "Training data/target",
                "Test data/target"], loc="best")

クラス分類と同じく、考慮する最近傍点を増やすと、予測はスムーズになるが訓練データに対する適合度は低下する。

2.3.2.5 利点と欠点とパラメータ

パラメータ

KNeighbors分類機における重要なパラメータは以下の2つ。
近傍点の数:調整の必要があるが、実用上3や5程度の小さな数で十分な場合が殆ど。
データポイント間の距離測度:距離速度はデフォルトのユークリッド距離で大体うまくいく。

利点

モデルの構築が容易:あまり調整しなくても十分な性能を示す。高度な技術を利用する前に1度試してみるべき。

欠点

処理速度が遅く、多くの特徴量を扱うことが出来ない。よって実際にはほとんど使われていない。
処理速度が遅いので、データの前処理が重要になる。また、殆どの特徴量が多くの場合に0となるような、疎なデータセット(sparse dataset)では性能が悪い。


2.3.3 線形モデル

実用的に広く用いられている。入力特徴長の線形関数(linear function)を用いて予測を行う。

mglearn.plots.plot_linear_regression_wave() # 0.393906  b: -0.031804

特徴量が多い場合は、w(重み)はそれぞれの特徴量の軸に対する傾きが入る。
つまり、予測されるレスポンスは入力特徴量の重み付き和。重みは負になることもある。

回帰における線形モデルは単一の特徴量に対しては予測が直線になる。2つなら平面に、高次元の(特徴量が多い)場合は超平面になる。

直線だと制約が強めに感じるかもしれないが、多数の特徴量を持つデータに対しては非常に強力。
特に、訓練データのデータポイント数より、特徴量の数が多い場合には、どのようなyでも完全に訓練データセットの線形関数等してモデル化出来る。


回帰のアルゴリズムは様々。
・相違点
1. パラメータwと、bを訓練データから学習する方法
2. モデルの複雑さを制御する方法


2.3.3.2 線形回帰(通常最小二乗法)

線形回帰(LinearRegression)、通常最小二乗法(Ordinary Least Squares: OLS)。
最も単純な線形回帰手法。
線形回帰にはパラメータが無い = モデルの複雑さを制御できない。

予測と真の回帰ターゲットyとの平均二乗誤差(mean squared error)が最小になるようにパラメータw、bを求める。

平均二乗誤差:予測と、真のあ値との差を二乗したものの平均値。
なんで誤差を二乗してるの?
→二乗することによって、正負の相違による誤差のキャンセルがされないようにするため。例えば誤差が+2と-2のものを単純に足し合わせると、値が0になって誤差がキャンセルされる。


scikit-learnで変数の後ろにアンダースコアが付いているものは、訓練データから得られた属性。こうすることでユーザが設定したパラメータと明確に区別する。

waveデータセット(低次元、1つの特徴量)

from sklearn.linear_model import LinearRegression

X, y = mglearn.datasets.make_wave(n_samples=60)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

lr = LinearRegression().fit(X_train, y_train)

print("lr.coef_: {}".format(lr.coef_)) # 係数(coefficient)=傾き、重み
print("lr.intercept_: {}".format(lr.intercept_)) # 切片(intercept)=オフセット
# lr.coef_: [ 0.394]
# lr.intercept_: -0.031804343026759746

print("Training set score: {:.2f}".format(lr.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lr.score(X_test, y_test)))
# lr.coef_: [ 0.394]
# lr.intercept_: -0.031804343026759746

boston_housingデータセット(高次元、104の特徴量、506個のサンプル)

X, y = mglearn.datasets.load_extended_boston()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
lr = LinearRegression().fit(X_train, y_train)

print("Training set score: {:.2f}".format(lr.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lr.score(X_test, y_test)))

# Training set score: 0.95
# Test set score: 0.61

coef_:入力特徴量毎に1つの要素を持つNumpy配列(waveは特徴量が1つ)
intercept:常に単独の浮動小数点数

・wave
決定係数であるR^2が、訓練セット、テストセットで近い値
=適合不足であって過剰適合ではない!

・boston_housing
訓練セットに対してのスコアはよいが、テストセットに対しては悪い
=過剰適合が起きている!
 →複雑度を制御できるモデルを使用しなくてはいけない
  では、次の章のリッジ回帰を試してみよう!


POINT
低次元データセット:モデルが単純なので(or制約されているので)過剰適合のリスクは低い
高次元のデータセット:特徴量が多く、線形モデルはより強力になり過剰適合の可能性は高くなる。



2.3.3.3 リッジ回帰

・L2正則化を行いながら線形回帰の適切なパラメータを設定する回帰モデル
・予測の式はOLSと同じ。
・制約が強いモデルなので過剰適合の危険が少ない。
・複雑度の低いモデルだと、訓練セットに対する性能は低いが汎用性能は高い。
・シンプルな線形モデルよりも汎用性能が高い
・モデルの簡潔さ(=0に近い係数の数)と、訓練セットに対する性能はトレードオフ
 →alphaパラメータで指定可能(デフォルトは1.0)
・違いは係数(ω)を訓練データに対する予測だけでなく、他の制約に対しても最適化する。
 →係数の絶対値の大きさを小さくしたい
 →ωの要素をなるべく0に近づける
 →予測をうまく行い個々の特徴量が出力に与える影響を小さくする
 →傾きを小さくする



このような制約条件は正規化(regularization)の一例。
線形回帰では、 汎化手法として正則化を用いる。
リッジ回帰ではL2正規化を用いる(下記参照)。


正規化
回帰分析を行うモデルに対し、過剰適合を防ぐために明示的にモデルを制約する(モデルが推定したデータ同士の関係性の複雑さに対してペナルティを加える)こと。これによってモデルが推定するデータ同士の関係性を一般化しようとする。

L1正則化
データとして余分な情報がたくさん存在するようなデータの回帰分析を行う時に使われる。
予測に用いられるデータのうち、「予測したいデータに対する寄与が薄いデータ」や「他の予測に用いられるデータとの関係性が強いデータ」の正則化に向いており、これらを回帰分析の際に結果に対する寄与が小さくなるように係数を小さくする方法。

L2正則化
過学習を抑えて汎用化したい時に使われる。
予測に用いるデータの範囲を算出し、データの範囲を揃えるようにデータに対する係数を小さくすることによって回帰分析のモデルの一般化を図ろうとする方法。データの範囲とは、データが取りうる数値の範囲のことで、揃える場合は大抵は0から1の範囲になるように調整されます。データの範囲を揃えることによって同じ尺度で全てのデータの予測に対する寄与が比較可能になり、 滑らかなモデルを得やすい(汎化しやすい)。
 → データの範囲をそろえるように係数を操作して説明力を高めるアプローチ!



それではboston_housingにリッジ回帰を適用する

from sklearn.linear_model import Ridge

ridge = Ridge().fit(X_train, y_train)
print("Training set score: {:.2f}".format(ridge.score(X_train, y_train)))
print("Test set score: {:.2f}".format(ridge.score(X_test, y_test)))
# Training set score: 0.89
# Test set score: 0.75

スコアは、訓練セットは低くなり、テストセットに対しては高くなった→過剰適合ではなくなった。


モデルの簡潔さと訓練セットに対する性能はトレードオフなので試しにalphaを変えてみる。
最良のalphaはデータセットに依存する。
alphaを増やす→係数は0に近くなる=訓練セットに対する性能は低下。汎化性能は高くなる。

ridge10 = Ridge(alpha=10).fit(X_train, y_train)
print("Training set score: {:.2f}".format(ridge10.score(X_train, y_train)))
print("Test set score: {:.2f}".format(ridge10.score(X_test, y_test)))
# Training set score: 0.79
# Test set score: 0.64


ridge01 = Ridge(alpha=0.1).fit(X_train, y_train)
print("Training set score: {:.2f}".format(ridge01.score(X_train, y_train)))
print("Test set score: {:.2f}".format(ridge01.score(X_test, y_test)))
# Training set score: 0.93
# Test set score: 0.77

alphaを小さくすると係数の制約が小さくなり、過剰適合になっていく。
小さくしすぎると係数への制約がなくなりLinearRegressionと同じような挙動になる。


・alphaパラメータのモデルへの影響を確認する
定量的に知る方法はcoef_属性を確認することだ。
 alphaが大きくなる=モデルへの制約が強くなる=coef_の要素の絶対値が小さくなることが期待される。


alphaを大きくしてcoef_の要素の絶対値が小さくなっているか確認する。

plt.plot(ridge.coef_, 's', label="Ridge alpha=1")
plt.plot(ridge10.coef_, '^', label="Ridge alpha=10")
plt.plot(ridge01.coef_, 'v', label="Ridge alpha=0.1")

plt.plot(lr.coef_, 'o', label="LinearRegression")
plt.xlabel("Coefficient index")
plt.ylabel("Coefficient magnitude")
xlims = plt.xlim()
plt.hlines(0, xlims[0], xlims[1])
plt.xlim(xlims)
plt.ylim(-25, 25)
plt.legend()

f:id:saneeeatsu:20180412133316p:plain
x軸が係数の番号(coef_の要素)。y軸が係数の大きさ。
alpha=10で殆どの係数が-3~3にある。
alphaが小さくなるほど広い範囲に拡大してしまっている。
正規化されていない線形回帰(alpha=0)だとこの図に収まらないくらいばらけている。



次に、alphaは1に固定して、訓練データの量を変化させ、LinearRegressionとRidgeのスコア(決定係数)を比較してみる。
尚、このようにモデル性能を、データセットサイズの関数として示したものを学習曲線(Learning Curve)と呼ぶ。
よってこの図は「boston_housingデータセットに対するリッジ回帰と線形回帰の学習曲線」といえる。

mglearn.plots.plot_ridge_n_samples()

f:id:saneeeatsu:20180412134723p:plain
・この図からわかること
期待された通りどちらの曲線も訓練スコア(点線)はテストスコアより高い。
リッジ回帰では正規化が行われているため訓練スコアは線形回帰より低い。特にデータサイズが小さいと何も学習できていない。しかし最終的に線形回帰に追い付いている。
つまり、十分な訓練データがあると正規化はあまり重要ではない
また、線形回帰では訓練性能が低下している。データ量が多くなるとモデルが過剰適合すること、もしくはデータを覚えてしまうことが難しくなることを示している。




2.3.3.4 Lasso

・L1正則化を行いながら線形回帰の適切なパラメータを設定する回帰モデル
機械学習では予測に用いるデータ同士の関連性を人間が認識しにくい場合があるが、L1正則化は、余分なデータがたくさんある場合の回帰分析をに適している
データセットの数(行数)に比べて、パラメータの数(列数)が多い場合には、ラッソ回帰を利用するのが良い
・Ridgeと同様に係数が0になるように制約をかける。違いはL1正規化という点。
・L1正規化の結果いくつかの係数が完全に0になる。
 つまり、モデルのいくつかの特徴量が完全に無視される(自動的に特徴量を選択していると考えても良い)。
 →いくつかの係数が0になりモデルを解釈しやすくなるので、どの特徴量が重要かわかる!

from sklearn.linear_model import Lasso

# 1. デフォルト値を使用
lasso = Lasso().fit(X_train, y_train)
print("Training set score: {:.2f}".format(lasso.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lasso.score(X_test, y_test)))
print("Number of features used: {}".format(np.sum(lasso.coef_ != 0)))
# Training set score: 0.29
# Test set score: 0.21
# Number of features used: 4

# 2. alpha、max_iterを調整
lasso001 = Lasso(alpha=0.01, max_iter=100000).fit(X_train, y_train)
print("Training set score: {:.2f}".format(lasso001.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lasso001.score(X_test, y_test)))
print("Number of features used: {}".format(np.sum(lasso001.coef_ != 0)))
# Training set score: 0.90
# Test set score: 0.77
# Number of features used: 33

# 3. alphaを小さくしすぎた場合
lasso00001 = Lasso(alpha=0.0001, max_iter=100000).fit(X_train, y_train)
print("Training set score: {:.2f}".format(lasso00001.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lasso00001.score(X_test, y_test)))
print("Number of features used: {}".format(np.sum(lasso00001.coef_ != 0)))
# Training set score: 0.95
# Test set score: 0.64
# Number of features used: 94

・1. デフォルト値を使用
特徴量を4つしか使用しておらず、訓練セット、テストセットに対してもスコアが低い。
というのも、デフォルトではalpah=1.0だから。
このalphaを小さくして適合させる。また、このときmax_iter(最大の切り返し回数)をデフォルトより増やす。

・2. alpha、max_iterを調整
33/104しか使っていないので、モデルが潜在的には理解しやすくなっている。
alphaを小さくし過ぎると、Ridge同様、正規化の効果が薄れて過剰適合が発生し、性質がLinearRegressionに似てくる。

・3. alphaを小さくしすぎた場合
モデルに対する係数をグラフにプロットしてみる。

plt.plot(lasso.coef_, 's', label="Lasso alpha=1")
plt.plot(lasso001.coef_, '^', label="Lasso alpha=0.01")
plt.plot(lasso00001.coef_, 'v', label="Lasso alpha=0.0001")

plt.plot(ridge01.coef_, 'o', label="Ridge alpha=0.1")
plt.legend(ncol=2, loc=(0, 1.05))
plt.ylim(-25, 25)
plt.xlabel("Coefficient index")
plt.ylabel("Coefficient magnitude")

f:id:saneeeatsu:20180413082901p:plain

alpha 結果
■1 ほとんどの係数が0で、残りの係数の絶対値もかなり低い。
▲0.01 まだ0付近に値が多い。
▼0.0001 正規化が緩み多くの係数が0ではなくなり、絶対値も大きくなる。
●0.1(Ridge) alpha=0.01Lassoのような予測性能だが、すべての係数が0ではない。

実際に使う場合はRidgeから試す。
特徴量が多く、重要なものがわずかだと考えられる場合や、解釈しやすいモデルが欲しい場合はLasso。

ElasticNet

・LassoとRidgeのペナルティを組み泡さえたもので、実用上はこれが最良の結果を示す。
・メリット:
Lassoで取り扱った 余分な情報がたくさん存在するようなデータに対して情報を取捨選択してくれる
Ridge回帰で取り扱った 滑らかなモデルを得やすい(汎化しやすい)点

・ただし、L1正規化、L2正規化の2つのパラメータを調整する必要がある。
 l1_ratioという引数を指定。L1正則化とL2正則化の割合を指定する。
 デフォルトは5(つまり半々の割合)。
 0.3の場合、L1正則化が30%、L2正則化が70%。





2.3.3.5 クラス分類のための線形モデル

2.3.3.5 線形モデルによる多クラス分類

2.3.3.5 クラス分類のための線形モデル

2.3.3.6 線形モデルによる多クラス分類

2.3.3.7 利点、欠点、パラメータ

2.3.4 ナイーブベイズ分類機

2.3.4.1 利点、欠点、パラメータ

2.3.5 決定木

2.3.5.1 決定木の構築

2.3.5.2 決定木の複雑さの設定

2.3.5.3 決定木の解析

2.3.5.4 決定木の特徴量の重要性

2.3.5.5 長所、短所、パラメータ

なぜこの項目だけ前のように「利点、欠点、パラメータ」ではないのか。
原文に忠実なのだろうか。

2.3.6 決定木のアンサンブル法

2.3.6.1 ランダムフォレスト

この中に「長所、短所、パラメータ」がある。
階層が深くなりすぎて仕方ないのはあるけど、レベル感を統一して欲しい...。

2.3.6.2 勾配ブースティング回帰木(ブースティングマシン)

勾配ブースティングについてざっくりと説明する - About connecting the dots.
勾配ブースティング決定木を理解する - hiyoko9t’s blog

xgboostって名前だけは知ってたけど、これなのか!





2.3.7 カーネル法を用いたサポートベクターマシン

2.3.7.1 線形モデルと非線形特徴量

2.3.7.3 SVNを理解する

2.3.7.4 SVNパラメータの調整

2.3.7.5 SVNのためのデータの前処理

2.3.7.6 利点、欠点、パラメータ

2.3.8 ニューラルネットワーク(ディープラーニング)

2.3.8.2 ニューラルネットワークのチューニング

2.3.8.3 長所、短所、パラメータ

2.3.8.1