分類アルゴリズム~アルゴリズムに適応させるまでのおさらい~

こんにちは!EMです^^

 

それでは本日からは分類アルゴリズムシリーズをいくつか紹介していきたいと思っています!

 

詳しくは

  • ロジスティック回帰(Logistic Regression)
  • サポートベクターマシン(Support Vector Machine)
  • 決定木(Decision Trees)
  • アンサンブル手法(Ensemble methods):
    ランダムフォレスト(Random Forests),
    勾配ぶースティング(Gradient Boosting)

上記の項目を今後取り上げていこうと思います。

 

それではさっそく始めていきましょう!

 

まず一連の流れとして、必要なものをインポートしていきます。

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import sklearn as sk
pd.options.display.max_columns=500
import warnings
warnings.filterwarnings("ignore")
from sklearn.model_selection import train_test_split
from sklearn import linear_model
 
 
def PlotBoundaries(modelXY) :
    '''
Helper function that plots the decision boundaries of a model and data (X,Y)
    '''
    
  x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
  y_min, y_max = X[:, 1].min() - 1,X[:, 1].max() + 1
  xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01), np.arange(y_min, y_max, 0.01))

  Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
  Z = Z.reshape(xx.shape)

  plt.contourf(xx, yy, Z, alpha=0.4)

    #Plot
  plt.scatter(X[:, 0], X[:, 1], c=Y,s=12, edgecolor='k')
  plt.show()
 
 
 
※このセクションで使用するデータはこのURLから取得する事が出来ます。
https://www.kaggle.com/blastchar/telco-customer-churn
 
 
df = pd.read_csv('Telco-Customer-Churn.csv', index_col=0)
index_col=0は、インデックスの列名です。
 0を指定すると、最初の列がインデックスとなります。
 これをしなければ、Unnamed:0 という列が自動で付与されます。
 
df.head()
 

f:id:tennisfashionista:20210202233902p:plain

 
カテゴリを数値に変換する
 
これらのアルゴリズムは生データの情報をそのまま処理する事はできません。
その為最初の作業として、使える形式に変えるべく
すべてのカテゴリデータを「数値」に変換する必要があります。
 
 
df['gender'] = np.where(df['gender'] == 'Female'01)
df['Partner'] = np.where(df['Partner'] == 'No'01)
df['Dependents'] = df['Dependents'].map({'No':0'Yes':1})
df['PhoneService'] = df['PhoneService'].map({'No':0'Yes':1})
df['PaperlessBilling'] = df['PaperlessBilling'].map({'No':0'Yes':1})
df = pd.get_dummies(df, columns=['MultipleLines','InternetService','OnlineSecurity',
                  'OnlineBackup','DeviceProtection','TechSupport',
                  'StreamingTV','StreamingMovies','Contract',
                  'PaymentMethod'])
df['Churn']=df['Churn'].map({'No':0'Yes':1})
df['TotalCharges'] = pd.to_numeric(np.where(df['TotalCharges']==' '0,
            df['TotalCharges']))
 
 
 
ここでは、先日記述したfeature universeを使っていきましょう。
モデルが上位の特徴を選択できる様に、feature universeのリストを定義します。
 
features_to_include = ['gender''SeniorCitizen''Partner''Dependents''tenure',
       'PhoneService''PaperlessBilling''MonthlyCharges''TotalCharges'
    'MultipleLines_No''MultipleLines_No phone service',
       'MultipleLines_Yes''InternetService_DSL',
       'InternetService_Fiber optic''InternetService_No',
       'OnlineSecurity_No''OnlineSecurity_No internet service',
       'OnlineSecurity_Yes''OnlineBackup_No',
       'OnlineBackup_No internet service''OnlineBackup_Yes',
       'DeviceProtection_No''DeviceProtection_No internet service',
       'DeviceProtection_Yes''TechSupport_No',
       'TechSupport_No internet service''TechSupport_Yes''StreamingTV_No',
       'StreamingTV_No internet service''StreamingTV_Yes',
       'StreamingMovies_No''StreamingMovies_No internet service',
       'StreamingMovies_Yes''Contract_Month-to-month''Contract_One year',
       'Contract_Two year''PaymentMethod_Bank transfer (automatic)',
       'PaymentMethod_Credit card (automatic)',
       'PaymentMethod_Electronic check''PaymentMethod_Mailed check']
 

 

特徴選択

特徴のある項目を選択するためのユニバースがあり、アルゴリズムを使用して
モデルに含める最適な特徴を選択していきます。

境界をうまく視覚化するために、2次元で表示していきます。

その為、scikit-learnの特徴選択(feature selection)パッケージを使用して
2つの特徴のみを保持します。

使用するパッケージは、ノンパラメトリック手法を使用して
ターゲットと共有される相互情報量(MI:Mutual Information)によって機能をランク付けします。

ノンパラメトリック手法 - Wikipedia

 

2つの確率変数間の相互情報量(MI)は負ではない値(0かそれ以上)であり
変数間の依存関係を測定します。

2つの確率変数が依存しておらず、独立している場合に限り、ゼロに等しくなります。

値が大きいほど、依存度が高くなります。

 

from sklearn import feature_selection
 
feature_rank = feature_selection.mutual_info_classif(df[features_to_include], 
                             df['Churn'])
 
feature_rank_df = pd.DataFrame(list(zip(features_to_include, feature_rank)), 
                      columns=['Feature''Score'])
 
 
feature_rank_df.sort_values(by='Score', ascending = False).head()
 

f:id:tennisfashionista:20210204001531p:plain

 実際には、1番上のContract_Month-to-monthを最適な機能として選択する必要がありますが
値は2値変数(0か1、onかoffか等、いずれか一方の値をとる変数)であり
ポイント間の分離を視覚化すると、適切なプロットが作成されません。
したがって、今回は他の2つの連続変数を選択します。

 
two_features = ['tenure','MonthlyCharges']
 
 
 
test/trainに分割
 
X_trn, X_tst, Y_trn, Y_tst = train_test_split(df[features_to_include], 
                         df['Churn'], test_size=0.4)
 
 
 
 
 
いかがだったでしょうか?
 
インポートからアルゴリズムに適応する一連の流れをざっとおさらいしてきました。
実際にはデータクリーニングの作業が加わったりするなど、人やデータによって
工程は違うと思うので、様々な流れを学んで頂けたらと思います^^
 
次からは今回の内容を元に、どんどんアルゴリズムに当てはめて
どのように動くか見ていきたいと思いますので、どうぞお楽しみに~^^
 
 
 
また詳しくデータ分析を学びたいという方は、マンツーマン指導が
無料体験できるみたいなので、ぜひ利用してみてくださいね~!
(私自身も無駄だったとは言いたくありませんが、独学で長い年月を遠回りしてきました…)
 
 
 
 
最後まで読んで頂きありがとうございました!

モデルの保存方法

こんにちは!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やコンピューターでも実行できます。

 

 

 

my_new_linear_model = joblib.load('my_linear_model.pkl'

 

 

 

 

 

さていかがでしたでしょうか?

この中では、出来るだけ作業の効率も重視した内容も盛り込んでいけたらと思っています。

 

 

 

ちなみに皆様に朗報です!

私今まで知らなかったんですが、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を実行する機械学習のライブラリーの使い方

 

では始めましょう!!

 

Train-Test Split for Evaluating Machine Learning Algorithms

Train-Test Split for Evaluating Machine Learning Algorithms
Photo by Paul VanDerWerf, some rights reserved.

概要

 

この記事の内容として、大きく3つに分かれています。

 

  1. Train-Test Splitの評価
    1. いつ Train-Test Splitを使うのか
    2. どうやってTrain-Test Splitを使うのか
    3. Scikit-Learn内でのTrain-Test Splitの手順
    1. 繰り返し可能なTrain-Test Splits
    2. 層状のTrain-Test Splits
  2. 機械学習のモデルを評価する為のTrain-Test Split
    1. 分類の為のTrain-Test Split
    2. 回帰の為の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です^^

 

今回はリッジ回帰について取り上げたいと思います。

 

リッジ回帰とは、大きな係数を防ぐために正則化を実装します。

リッジ回帰のコスト関数は次のとおりです。

 

f:id:tennisfashionista:20210131012345p:plain

 

また変な記号がでてきましたね。

λ(Lambda)というのは正則化の項です。

この働きによって、βの値が大きい場合はペナルティが課せられます。

 

気になる方は、この概念についてよくまとまってる記事があるので

ぜひ見てみてください。

(英語さえ苦でなければ、2分で読める記事だそうです^^;)https://towardsdatascience.com/l1-and-l2-regularization-methods-ce25e7fc831c

 

scikit-learnではRidgefunctionを使い、このように実装されます。

 

RidgeReg = sk.linear_model.Ridge(alpha=5000)
 
RidgeReg.fit(df[top_feats],df['price'])
 
RidgeReg.score(df[top_feats],df['price'])
 
RidgeReg.coef_
 
max(RidgeReg.coef_)
 
max(regfit.coef_) 
# このコードにより、最大係数がOLSモデルから抑えられていることが分かります
 
 
実装結果については、今回は割愛しています。
ご自身のデータと当てはめて、どの様に機能するのかぜひ試してみてくださいね!
 
 
 
 

ちなみに皆様に朗報です!

私今まで知らなかったんですが、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つの独立変数のみ扱った例をみてきました。

しかし、正しく組み合わせると従属変数を予測できる機能があることがあるんです。

もっと面白そうなデータセットをみていきましょう!

 

# you can find this dataset in the class portal

df = pd.read_csv('house_data.csv', index_col=0)
 
※このデータはここのHPから確認する事ができます
 
df.head()
 
  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という機能があります。

(この用語の日本語が分かる方、ぜひ教えて下さい)

これは、モデルに含まれる「範囲内」の機能のコラムをリスト化したものです。

 

 

features_to_include = ['bedrooms',
                      'sqft_living',
                      'sqft_lot',
                      'floors',
                      'waterfront',
                      'view',
                      'condition',
                      'grade',
                      'sqft_basement',
                      'yr_built',
                      'yr_renovated',
                      'sqft_living15',
                      'sqft_lot15']
 
 

Feature selection

機能を選ぶための全universeがあり、アルゴリズムを使用して、モデルに含めるのに最適な機能を選択できます。

境界をうまく視覚化するためには、2次元が最も理にかなっていることがわかります。

その為、2つの特徴のみを使います。

scikit-learnの特徴選択(feature selection)パッケージを利用していきましょう。

このパッケージは、ノンパラメトリック手法を使用して
ターゲットとの相互情報量によって機能をランク付けします。

2つの確率変数間の相互情報量(MI:Mutual Information)は非負の値(負ではない実数)であり変数間の依存関係を測定します。

2つの確率変数が独立している場合に限り、ゼロに等しくなります。

値が大きいほど、関連性が高いといえます。

 

from sklearn import feature_selection
 
feature_importances = feature_selection.mutual_info_
            regression(df[features_to_include],df['price'])
 
feat_importance_df = pd.DataFrame(list(zip(features_to_include,feature_importances)), 
                        columns=['feature','importance'])

 

feat_importance_df.sort_values(by='importance', ascending=False, inplace=True)
 
top_feats = [x for x in feat_importance_df['feature'][0:5]]
top_feats
 
['sqft_living', 'grade', 'sqft_living15', 'sqft_lot15', 'bedrooms']

 

 

どうでしたでしょうか?

実は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

 

今回は、デフォルトをそのまま選びます。 これで、メソッドを呼び出し

(データに適合していない)モデルを変数に入れていきます。

 

linear_regression_model = sk.linear_model.LinearRegression()
 
 
次に、モデルを自分たちのデータに適合させる必要があります。
近似を行うときは、独立変数を数あるリストから1つのリストにリシェイプする作業をしていきます。
それぞれの内側のリストはデータポイントを表し、リストの内容はそのポイントの機能になります。
適切な形式のデータを取得すれば.fit()メソッドを使用して
従属変数と独立変数の関係を学習できます。
 
 
x = x.reshape(-1,1)
linear_regression_model.fit(x, y)
 
 
#The bias term.
bias = linear_regression_model.intercept_

#The coefficient, notice it returns an array with one spot for each feature
coefficient = linear_regression_model.coef_[0]

print('Bias:', bias)
print('Coefficients:', coefficient)

# Plot outputs
plt.scatter(x,y,  color='red')
Y_model = coefficient*x + bias
plt.plot(x, Y_model, color='blue', linewidth=3)

plt.show()
 

f:id:tennisfashionista:20210125002153p:plain

 

前のモデルの精度スコアを見つけたい場合は、次のように実行します。

 
print("Score on data model was fitted to:", linear_regression_model.
score(x.reshape(-1,1),y))
 
〈output〉
Score on data model was fitted to: 0.5220701109050432
 
 
このモデルは、これまで見たことのないデータにはあまり適合しませんでした。
現実世界の中の生データは、どちらのソースからも同じように発生する可能性が高い場合、
モデルは1番最良の推定量ではなく、元のデータセットに過剰適合(overfit)するでしょう。
(これは線形回帰で見た過剰適合に似ています)
 
 
 

ちなみに皆様に朗報です!

私今まで知らなかったんですが、CodeCampさんが無料で5回分無料レッスンを

されているらしいです、、、!

私が他のオンラインスクールで機械学習のコースを受講した際は

グループレッスンで約2倍のお値段を払ったので

完全マンツーマンでこのお値段は超良心的だなと思います。。。

 

 

 

ぜひ気になる方は無料体験もされてるみたいなので、一度WEBサイトを見てみてくださいね。

データ分析は時代が変化しても、必ず重宝される分野だと思っているので

プロから基礎を学ぶのは、本当に超効率的な自己投資だと思います。

 

 

 
 
次回以降、この考えをさらに深く説明するために実際のデータセットも見ていこうと思います。
 
 
最後まで読んで頂きありがとうございました^^