分類アルゴリズム~アルゴリズムに適応させるまでのおさらい~
こんにちは!EMです^^
それでは本日からは分類アルゴリズムシリーズをいくつか紹介していきたいと思っています!
詳しくは
- ロジスティック回帰(Logistic Regression)
- サポートベクターマシン(Support Vector Machine)
- 決定木(Decision Trees)
- アンサンブル手法(Ensemble methods):
ランダムフォレスト(Random Forests),
勾配ぶースティング(Gradient Boosting)
上記の項目を今後取り上げていこうと思います。
それではさっそく始めていきましょう!
まず一連の流れとして、必要なものをインポートしていきます。
0を指定すると、最初の列がインデックスとなります。
これをしなければ、Unnamed:0 という列が自動で付与されます。
特徴選択
特徴のある項目を選択するためのユニバースがあり、アルゴリズムを使用して
モデルに含める最適な特徴を選択していきます。
境界をうまく視覚化するために、2次元で表示していきます。
その為、scikit-learnの特徴選択(feature selection)パッケージを使用して
2つの特徴のみを保持します。
使用するパッケージは、ノンパラメトリック手法を使用して
ターゲットと共有される相互情報量(MI:Mutual Information)によって機能をランク付けします。
2つの確率変数間の相互情報量(MI)は負ではない値(0かそれ以上)であり
変数間の依存関係を測定します。
2つの確率変数が依存しておらず、独立している場合に限り、ゼロに等しくなります。
値が大きいほど、依存度が高くなります。
実際には、1番上のContract_Month-to-monthを最適な機能として選択する必要がありますが
値は2値変数(0か1、onかoffか等、いずれか一方の値をとる変数)であり
ポイント間の分離を視覚化すると、適切なプロットが作成されません。
したがって、今回は他の2つの連続変数を選択します。
モデルの保存方法
こんにちは!EMです^^
今回は、作成したモデルの保存の仕方について
さらっと解説していこうと思います。
モデルを適合させて、その出来が良ければ、再度分析を繰り返すときに
またそのモデルを使いたいと思います。
モデルの適合は莫大な時間がかかるプロセスになる可能性もあります。
現実世界で使われるモデルは、教科書で習うモデルよりも
さらに複雑化されている場合がほとんどです。
その為、繰り返し行う分析や、新しいデータ使う場合でもモデルの再適合を行うのは
時間とエネルギーの無駄になる事が多いです。
しかし!
Pythonには、Picklingと呼ばれるお助けフレームワークがあります。
これにより、複雑な構造を保存および再読み込みする事が出来るようになります!
さて、joblib.dump()
関数というものを使用してモデルをファイルに保存していきます。
保存するモデルインスタンスと保存先のファイル名を指定する必要があります。
その際、「.pkl拡張子」を使用しましょう。
※インスタント(python)とは…特定のクラスの個々のオブジェクト。 たとえば、クラスCircleに属するオブジェクトobjは、クラスCircleのインスタンスだそうです。
from sklearn.externals import joblib
joblib.dump(regfit, 'my_linear_model.pkl')
output ['my_linear_model.pkl']
これで、モデルを新しい変数に再ロードできます。
ファイルにアクセスできる限り、新しいjupyternotebookやコンピューターでも実行できます。
さていかがでしたでしょうか?
この中では、出来るだけ作業の効率も重視した内容も盛り込んでいけたらと思っています。
ちなみに皆様に朗報です!
私今まで知らなかったんですが、CodeCampさんが無料で5回分無料レッスンを
されているらしいです、、、!
私が他のオンラインスクールで機械学習のコースを受講した際は
グループレッスンで約2倍のお値段を払ったので
完全マンツーマンでこのお値段は超良心的だなと思います。。。
ぜひ気になる方は無料体験もされてるみたいなので、一度WEBサイトを見てみてくださいね。
データ分析は時代が変化しても、必ず重宝される分野だと思っているので
プロから基礎を学ぶのは、本当に超効率的な自己投資だと思います。
はい、つい興奮してしましました。笑
最後まで読んで頂きありがとうございました。
それではまた次回お楽しみに~!
Train-Test Splitってな~に??
こんにちは^^EMです。
今回は(私が)分かりそうで理解できていなかった
Train-Test Splitについてのお話です!
今回は、データをトレーニングデータとテストデータの2つのグループに分けていきます。
モデルはトレーニングデータに適合され、トレーニングとテストの両方で評価されます。
これが、機械学習の一般的な手法です。(Train / Test Splitと呼ばれます)
これはモデルが適合しているデータにoverfittingせず
新しいデータに一般化できるようにするために使用される最も一般的な方法です。
分割を行うには、ビルトイン関数train_test_split()を使用します。
※ビルトイン関数とは既に誰かが作って元々誰でも使えるように構築された関数です。
組み込み関数とも言います。
この関数は、独立変数と従属変数、および分割パラメーターを想定しています。
そして、トレーニングセット(従属変数と独立変数のランダムなグループを含む)と
残りのテストセット(従属変数と独立変数を含む)に分割します。
splitパラメーターは、セットの相対的なサイズを記述します。
scikit learnの公式HPには、より詳しい説明も載っていますので
ぜひ以下も参照してください。
http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
下記にはもう少し詳細を載せていますが、少し前の私のメモも混じっているので
内容が重複しているかもしれません。。どうぞご了承下さい。
Train-Test Splitとは、機械学習のアルゴリズムのパフォーマンスを
予測するために使用されます。
これは速くて簡単な方法かつ、その結果をつかって、予測モデルに対して
機械学習アルゴリズムのパフォーマンスを比較できます。
使用する事や解釈する事はシンプル(のよう)ですがデータセットが
小さい場合やデータセットのバランスが取れていない場合
追加項目が必要な場合など、Train-Test Splitの手順を使わない方がいい事もあります。
この記事の中ではTrain-Test Splitを使って機械学習のモデルがどう評価されるのかを
見ていきたいと思います。
この記事を読んだ後、以下の事をすこしでも学んでいただけると幸いです。
- Train-Test Splitは、データセットが非常に大きい場合
トレーニングにコストのかかるモデルがある場合、
モデルのパフォーマンスを早く予測したい場合に適している - scikit-learnという train-test splitを実行する機械学習のライブラリーの使い方
では始めましょう!!
概要
この記事の内容として、大きく3つに分かれています。
- Train-Test Splitの評価
- いつ Train-Test Splitを使うのか
- どうやってTrain-Test Splitを使うのか
- Scikit-Learn内でのTrain-Test Splitの手順
-
- 繰り返し可能なTrain-Test Splits
- 層状のTrain-Test Splits
- 機械学習のモデルを評価する為のTrain-Test Split
- 分類の為のTrain-Test Split
- 回帰の為のTrain-Test Split
Train-Test Splitの評価
train-test splitは、機械学習アルゴリズムのパフォーマンスを評価するための手法です。
分類または回帰の問題に使われ、教師あり学習アルゴリズムに使用できます。
この手順としては、データセットを取得して2つに分割します。
これを2つのサブセットに分割するとも言います。
最初のサブセットはモデルを適合させるために使用され
トレーニングデータセットと呼ばれます。
2つ目のサブセットは、テストデータセットと呼ばれるものです。
データセットの入力要素がモデルに与えられ、予測を行い、期待値と比較されます。
トレーニングデータセット:機械学習モデルを適合させるために使用されます。
テストデータセット:適合させた機械学習モデルを評価するために使用されます。
目的としては、新しいデータ(トレーニングに使用されないデータ)に対して
機械学習モデルのパフォーマンスを推測することです。
つまり、既に答えのある入力と出力を使って
まだ予測が出来ていない出力やターゲットの値を予測します。
先述した通り、このtrain-testの手順は膨大なデータセットがある時に適切な手法です。
下記で詳しくみてみましょう。
いつTrain-Test Splitを使用するのか
上記に記載してた「膨大な」データセットというのは
各予測モデリングに有用で比較できるデータでなければいけません。
これはデータセットをトレインデータセットとテストデータセットに分割するのに
十分なデータがあり、トレインデータセットとテストデータセットのそれぞれが
問題ドメインの適切な表現であることを意味します。
分かりやすく言うと、2つのデータに分けて問題やエラーが出るなら
元のデータセットも問題があるはずだという事です。
問題のあるドメインの適切な表現は、ドメイン内に一般的なケースと稀なケース
(極端に大きい変数など)を把握するのに十分なデータや記録があることを意味します。
これは、実際に入力変数の組み合わせがしっかり観察されて調整されている場合が
多いです。ただケースによっては数千~数百万の例が必要になる事もあります。
逆にデータセットが小さい場合、train-testの手順は適切ではありません。
理由としては、データセットがトレーニングセットとテストセットに分割されると
機械学習のモデルが入力から出力への効果的なマッピングを学習するのに
十分なデータがトレーニングデータがないためです。
また、モデルのパフォーマンスを効果的に評価するための十分なデータが
テストセットにもありません。
推定されるパフォーマンスは、過度に楽観的(良い)または過度に悲観的(悪い)
である可能性があります。
つまりどちらも極端すぎて良くないという事ですね。
もしデータが十分に揃わない場合は、他の適したモデルを評価する方法があるので
k-fold cross-validation procedure(交差検証)等
他のアルゴリズムも試してみて下さい。
データセットのサイズについてもう一つ言うと、 train-test splitを使う他のメリットとして
計算の効率化をはかる事ができます。
一部のモデルはトレーニングに非常にコストがかかり
他の手順で使用される繰り返しモデルを評価する事は現実的に難しいです。
そういった場合に、一例としてディープニューラルネットワークモデルがあります。
この場合、train-test手順が一般的に使用されてます。
その他の場合だと、プロジェクトの中には効率的なモデルと膨大なデータセットがあり
且つモデルのパフォーマンスをすばやく見積もる必要がある事があります。
ビジネスの場面ではこのケースが多いかもしれませんね。
この場合も、train-test splitの手順でアプローチをする事が多いです。
元のトレーニングデータセットのサンプルは、’random selection’を使用して
2つのサブセットに分割されます。
これは、トレーニング用とテスト用のデータセットが元のデータセットの特徴を
バランスよく選択してくれるのに役立ちます。
Train-Test Splitの書き方
この手順には、トレーニング用とテスト用のサイズがメインの構成パラメーターになります。
一般的には、トレーニング用またはテスト用のデータセットのいずれかの中から
0〜1の間をパーセンテージに表して使用していきます。
たとえば、サイズが0.67(67%)のトレーニングセットは、残りの0.33(33%)が
テストセットに割り当てられるという事になります。
最適な分割比率は決まっていません。
各々のプロジェクトの目的によって、下記のことも考慮しながら
どうパーセンテージを配分するかを決めていく必要があります。
- モデルのトレーニングにおける計算コスト
- モデルを評価する際の計算コスト
- トレーニングセットが何を表しているか
- テストセットが何を表しているか
とは言っても、一般的には下記のパーセンテージの分割がよく使われているみたいです。
- Train: 80%, Test: 20%
- Train: 67%, Test: 33%
- Train: 50%, Test: 50%
ざっと train-test split modelの評価の手順についてお話をしてきました。
次はPythonの中でこの手順がどうやって使われていくのか見ていきましょう。
Scikit-LearnのTrain-Test Split手順
The scikit-learn Pythonの機械学習のライブラリーではtrain_test_split() functionを通じて
train-test splitの評価の実装を行う事ができます。
この関数は、読み込んだデータセットを入力として受け取り
2つのサブセットに分割されたデータセットを返します。
理想的には、元のデータセットを入力(X)列と出力(y)列に分割してから
両方の配列を渡す関数を呼び出してみましょう。
そうすると、適切にトレーニングサブセットとテストサブセットに分割することができます。
分割のサイズは、行数(整数)または0から1までのデータセットのサイズの
パーセンテージ(浮動小数点数)にて指定できます。
一般的にはパーセンテージが使用されます。
たとえば、データセットの0.33という値(33%)がテストセットに割り当てられ
67%がトレーニングセットに割り当てられます。
ここでは、1,000例を含む合成分類のデータセットを使用し
下のコードから、どういう流れかみていきましょう。
上記の例を実行してみると、データセットがトレインセットとテストセットに分割され
新しいデータセットのサイズが出力されます。
数字を指定した通り、670の例(67%)がトレーニングセットに割り当てられ
330の例(33%)がテストセットに割り当てられている事がわかります。
または、’train_size’の値を指定してデータセットを分割することもできます。
この値は、行数(整数)または元のデータセットの0〜1のパーセンテージ
(67%の場合は0.67など)のどちらかになります。
なんとなくTrain-Test Split のイメージは掴んでいただけたでしょうか?
予測にはかかせないコードも含まれているので、また頻繁に登場すると思います。
また今度どのようにTrain-Test Splitが使われていくのか、追々みていきましょう!
ちなみに皆様に朗報です!
私今まで知らなかったんですが、CodeCampさんが無料で5回分無料レッスンを
されているらしいです、、、!
私が他のオンラインスクールで機械学習のコースを受講した際は
グループレッスンで約2倍のお値段を払ったので
完全マンツーマンでこのお値段は超良心的だなと思います。。。
ぜひ気になる方は無料体験もされてるみたいなので、一度WEBサイトを見てみてくださいね。
データ分析は時代が変化しても、必ず重宝される分野だと思っているので
プロから基礎を学ぶのは、本当に超効率的な自己投資だと思います。
それでは今日はここまでです。
最後まで読んで頂きありがとうございました^^
回帰分析~リッジ回帰~
こんにちは!EMです^^
今回はリッジ回帰について取り上げたいと思います。
リッジ回帰とは、大きな係数を防ぐために正則化を実装します。
リッジ回帰のコスト関数は次のとおりです。
また変な記号がでてきましたね。
λ(Lambda)というのは正則化の項です。
この働きによって、βの値が大きい場合はペナルティが課せられます。
気になる方は、この概念についてよくまとまってる記事があるので
ぜひ見てみてください。
(英語さえ苦でなければ、2分で読める記事だそうです^^;)https://towardsdatascience.com/l1-and-l2-regularization-methods-ce25e7fc831c
scikit-learnではRidgefunction
を使い、このように実装されます。
ちなみに皆様に朗報です!
私今まで知らなかったんですが、CodeCampさんが無料で5回分無料レッスンを
されているらしいです、、、!
私が他のオンラインスクールで機械学習のコースを受講した際は
グループレッスンで約2倍のお値段を払ったので
完全マンツーマンでこのお値段は超良心的だなと思います。。。
ぜひ気になる方は無料体験もされてるみたいなので、一度WEBサイトを見てみてくださいね。
データ分析は時代が変化しても、必ず重宝される分野だと思っているので
プロから基礎を学ぶのは、本当に超効率的な自己投資だと思います。
回帰分析とは⑥【多重共線性、過剰適合、複雑性、正則化】
こんにちは!EMです^^
昨日IT会社でマネージャーをしていたという人と話をする機会がありまして
色んなIT組織のリアルな事情を伺う事が出来ました。
中でもその人がいた会社は、IT分野に関するバックグラウンドがあっても
ほとんどの人が実務に関する業務内容に関しては未経験だったようです。
その人自身も、入社当初はミスをしたり他の人に聞いて回ったりしていたようで
やはり大切なのは、「スポンジのように全部吸収しよう!」という姿勢だそうです。
そういう話をきくと、未経験や文系出身の私も少し勇気が湧いてきます。
という事で本題にうつっていきましょう^^
今回も回帰分析や機械学習をする上で
おさえておきたいワードを学んでいきたいと思います!
多重共線性、過剰適合、複雑性、正則化
という言葉をきいた事がありますか??
もし1つでもよく分からない単語がある、、
という方はぜひ今回の内容を理解していきましょう!
多重共線性(Mulitcollinearity)
OLS(最小二乗)線形回帰のよくある問題として
複数の特徴が相互に相関しているという事象があります。
これを多重共線性と呼びます。
2以上のつの相関したデータを入力すると、係数が不安定になる事があり
明らかに目で見て分かる様な、おかしい係数を確認できる可能性があります。
(たとえば、飛びぬけて大きい正の係数と負の係数が出てくる場合があります)
一般的に、相関したデータが複数ある際は1つに絞って
再度分析していくそうです。
過剰適合/複雑性(Overfitting/Complexity)
モデルに特徴が追加されると、定義上、「適応度」であるR2が増加します。
理由はターゲット変数の分散をまねく変数が増えるためです。
ただし特徴の数が増えると、モデルの複雑さも増し
トレーニングデータセットの分散を招く可能性がありますが
大抵の場合、複雑なモデルは目に見えないデータとして
うまく一般化(適応)されません。
これは、トレーニングデータセットへの過剰適合(Overfitting)と呼ばれます。
正則化(Regularization)
正則化とは、大きな係数にペナルティを追加することで
多重共線性と複雑さ(complexity)の両方を成り立たせる事が出来ます。
多重共線性の場合、係数には上限があり相関変数に
それほど大きな変動は見られません。
過剰適合の場合、モデルに含まれるべきではない特徴は
係数を0近くまで押しつぶすことで「排除」する事ができます。
これを正則化といいます。
以上、よく出てくる単語についてまとめてみました。
この記事は、基礎の部分を触れた程度なので
もっと詳しく知りたい!という方は、ぜひgoogleで検索して
他のサイトと見比べながら勉強してみてくださいね^^
ちなみに皆様に朗報です!
私今まで知らなかったんですが、CodeCampさんが無料で5回分無料レッスンを
されているらしいです、、、!
私が他のオンラインスクールで機械学習のコースを受講した際は
グループレッスンで約2倍のお値段を払ったので
完全マンツーマンでこのお値段は超良心的だなと思います。。。
ぜひ気になる方は無料体験もされてるみたいなので、一度WEBサイトを見てみてくださいね。
データ分析は時代が変化しても、必ず重宝される分野だと思っているので
プロから基礎を学ぶのは、本当に超効率的な自己投資だと思います。
それではまた次回お楽しみに~!
回帰分析とは⑤
こんにちは!EMです^^
今回は回帰分析に役立つ豆知識について、紹介していきたいと思います。
Multiple linear regression
前回まで、モデルを構築するために1つの独立変数のみ扱った例をみてきました。
しかし、正しく組み合わせると従属変数を予測できる機能があることがあるんです。
もっと面白そうなデータセットをみていきましょう!
date | price | bedrooms | bathrooms | sqft_living | sqft_lot | floors | waterfront | view | condition | grade | sqft_above | sqft_basement | yr_built | yr_renovated | zipcode | lat | long | sqft_living15 | sqft_lot15 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id | ||||||||||||||||||||
7129300520 | 20141013T000000 | 221900.0 | 3 | 1.00 | 1180 | 5650 | 1.0 | 0 | 0 | 3 | 7 | 1180 | 0 | 1955 | 0 | 98178 | 47.5112 | -122.257 | 1340 | 5650 |
6414100192 | 20141209T000000 | 538000.0 | 3 | 2.25 | 2570 | 7242 | 2.0 | 0 | 0 | 3 | 7 | 2170 | 400 | 1951 | 1991 | 98125 | 47.7210 | -122.319 | 1690 | 7639 |
5631500400 | 20150225T000000 | 180000.0 | 2 | 1.00 | 770 | 10000 | 1.0 | 0 | 0 | 3 | 6 | 770 | 0 | 1933 | 0 | 98028 | 47.7379 | -122.233 | 2720 | 8062 |
2487200875 | 20141209T000000 | 604000.0 | 4 | 3.00 | 1960 | 5000 | 1.0 | 0 | 0 | 5 | 7 | 1050 | 910 | 1965 | 0 | 98136 | 47.5208 | -122.393 | 1360 | 5000 |
1954400510 | 20150218T000000 | 510000.0 | 3 | 2.00 | 1680 | 8080 | 1.0 | 0 | 0 | 3 | 8 | 1680 | 0 | 1987 | 0 | 98074 | 47.6168 | -122.045 | 1800 | 7503 |
feature universe(フィーチャーユニバース)
的確な日本語が分からなかったのですが、feature universeという機能があります。
(この用語の日本語が分かる方、ぜひ教えて下さい)
これは、モデルに含まれる「範囲内」の機能のコラムをリスト化したものです。
Feature selection
機能を選ぶための全universeがあり、アルゴリズムを使用して、モデルに含めるのに最適な機能を選択できます。
境界をうまく視覚化するためには、2次元が最も理にかなっていることがわかります。
その為、2つの特徴のみを使います。
scikit-learnの特徴選択(feature selection)パッケージを利用していきましょう。
このパッケージは、ノンパラメトリック手法を使用して
ターゲットとの相互情報量によって機能をランク付けします。
2つの確率変数間の相互情報量(MI:Mutual Information)は非負の値(負ではない実数)であり変数間の依存関係を測定します。
2つの確率変数が独立している場合に限り、ゼロに等しくなります。
値が大きいほど、関連性が高いといえます。
どうでしたでしょうか?
実はfeature universeに関してはあまり実際の現場では使用しないようです^^;
今回はあまり日本語の情報がネット上で出てこなかったので、豆知識として取り上げてみました。
もし現役のエンジニアやデータサイエンティストの方がいらっしゃれば
ぜひご指南お願いします!!
ちなみに皆様に朗報です!
私今まで知らなかったんですが、CodeCampさんが無料で5回分無料レッスンを
されているらしいです、、、!
私が他のオンラインスクールで機械学習のコースを受講した際は
グループレッスンで約2倍のお値段を払ったので
完全マンツーマンでこのお値段は超良心的だなと思います。。。
ぜひ気になる方は無料体験もされてるみたいなので、一度WEBサイトを見てみてくださいね。
データ分析は時代が変化しても、必ず重宝される分野だと思っているので
プロから基礎を学ぶのは、本当に超効率的な自己投資だと思います。
それではまた次回も引き続き豆知識シリーズをもう少し説明しようかと思っています!
お楽しみに~!!
回帰分析とは④
こんにちは!EMです^^
今日も回帰分析シリーズを解説していきたいと思います!
Machine Learning with Scikit-Learn
現在、私たちはとっても恵まれた環境の中におります。
なんと前回話した最急降下法、アルゴリズムごとに初めからコーディングする
必要はないんです!他の誰かが既に構築済みなんです!
その為、third party packagesといわれる予め作られたパッケージを使っていきます。
とても人気があるのはScikit-Learnというパッケージです。
import sklearn as sk
from sklearn import model_selection, metrics, linear_model, datasets,
feature_selection, preprocessing
このデータに適合するモデルを構築するには、まず、linear_modelを使い
適切な手法を駆使してモデルを定義します。
このメソッドを使用する中で、いくつかのオプションがあります。
(リストの種類については、こちらをご覧ください。)
http://scikitlearn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html
今回は、デフォルトをそのまま選びます。 これで、メソッドを呼び出し
(データに適合していない)モデルを変数に入れていきます。
前のモデルの精度スコアを見つけたい場合は、次のように実行します。
ちなみに皆様に朗報です!
私今まで知らなかったんですが、CodeCampさんが無料で5回分無料レッスンを
されているらしいです、、、!
私が他のオンラインスクールで機械学習のコースを受講した際は
グループレッスンで約2倍のお値段を払ったので
完全マンツーマンでこのお値段は超良心的だなと思います。。。
ぜひ気になる方は無料体験もされてるみたいなので、一度WEBサイトを見てみてくださいね。
データ分析は時代が変化しても、必ず重宝される分野だと思っているので
プロから基礎を学ぶのは、本当に超効率的な自己投資だと思います。