Logistic-regression-in-python-quick-guide
Pythonでのロジスティック回帰-はじめに
ロジスティック回帰は、オブジェクトの分類の統計的手法です。 この章では、いくつかの例を使用して、ロジスティック回帰の概要を説明します。
分類
ロジスティック回帰を理解するには、分類の意味を知っておく必要があります。 これをよりよく理解するために、次の例を考えてみましょう-
- 医師は腫瘍を悪性または良性に分類します。
- 銀行取引は不正または本物である可能性があります。
長年にわたって、人間はエラーを起こしやすいとはいえ、そのようなタスクを実行してきました。 問題は、これらのタスクをより正確に行えるようにマシンをトレーニングできるかどうかです。
分類を行うマシンのそのような例の1つは、すべての受信メールを「スパム」または「スパムではない」として分類し、かなり高い精度でそれを行う、マシン上のメール*クライアント*です。 ロジスティック回帰の統計手法が電子メールクライアントに正常に適用されました。 この場合、分類問題を解決するためにマシンをトレーニングしました。
ロジスティック回帰は、この種のバイナリ分類問題を解決するために使用される機械学習の一部にすぎません。 すでに開発され、他の種類の問題を解決するために実際に使用されている他の機械学習手法がいくつかあります。
上記のすべての例で注意した場合、予測の結果には2つの値(YesまたはNo)しかありません。 これらをクラスと呼びます-つまり、分類子はオブジェクトを2つのクラスに分類すると言います。 技術的に言えば、結果またはターゲット変数は本質的に二分されていると言えます。
出力が3つ以上のクラスに分類される可能性のある他の分類の問題があります。 たとえば、果物がいっぱい入ったバスケットがある場合、さまざまな種類の果物を分離するように求められます。 現在、バスケットにはオレンジ、リンゴ、マンゴーなどが含まれています。 したがって、果物を分離するときは、3つ以上のクラスに分けます。 これは多変量分類の問題です。
Pythonでのロジスティック回帰-ケーススタディ
銀行が機械学習アプリケーションを開発し、定期預金(一部の銀行では定期預金とも呼ばれます)を開く可能性のあるクライアントを識別するのに役立つことを検討してください。 銀行は定期的に電話またはWebフォームを使用して調査を実施し、潜在的なクライアントに関する情報を収集します。 調査は本質的に一般的なものであり、非常に多くの聴衆に対して実施されます。 残りのうち、定期預金の開設に関心があるのはごく少数です。 他の人は、銀行が提供する他の施設に興味があるかもしれません。 したがって、調査は必ずしもTDを開いている顧客を識別するために実施されるわけではありません。 あなたの仕事は、銀行があなたと共有しようとしている巨大な調査データからTDを開く可能性が高いすべての顧客を識別することです。
幸いなことに、そのような種類のデータの1つは、機械学習モデルの開発を望んでいる人々に公開されています。 このデータは、カリフォルニア大学アーバイン校の一部の学生が外部資金で準備したものです。 データベースは UCI Machine Learning Repository の一部として利用可能で、世界中の学生、教育者、研究者によって広く使用されています。 データはhttps://archive.ics.uci.edu/ml/datasets/bank+marketing [こちら]からダウンロードできます。
次の章では、同じデータを使用してアプリケーション開発を実行します。
プロジェクトのセットアップ
この章では、Pythonでロジスティック回帰を実行するプロジェクトのセットアップに関連するプロセスを詳細に理解します。
Jupyterのインストール
機械学習で最も広く使用されているプラットフォームの1つであるJupyterを使用します。 マシンにJupyterがインストールされていない場合は、https://jupyter.org [こちら]からダウンロードしてください。 インストールについては、サイトの指示に従ってプラットフォームをインストールできます。 このサイトが示唆するように、科学計算とデータサイエンスのためにPythonおよび多くの一般的に使用されるPythonパッケージに付属している Anaconda Distribution を使用することを好むかもしれません。 これにより、これらのパッケージを個別にインストールする必要性が軽減されます。
Jupyterが正常にインストールされた後、新しいプロジェクトを開始すると、この段階の画面は次のようになり、コードを受け入れる準備ができています。
次に、タイトル名をクリックして編集し、プロジェクトの名前を Untitled1から“ Logistic Regression” に変更します。
最初に、コードに必要ないくつかのPythonパッケージをインポートします。
Pythonパッケージのインポート
この目的のために、コードエディタで次のコードを入力またはカットアンドペーストします-
In [1]: # import statements
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import preprocessing
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
あなたの*ノート*は、この段階で次のように見えるはずです-
[実行]ボタンをクリックしてコードを実行します。 エラーが生成されない場合、Jupyterが正常にインストールされ、残りの開発の準備ができています。
最初の3つのimportステートメントは、プロジェクトのpandas、numpyおよびmatplotlib.pyplotパッケージをインポートします。 次の3つのステートメントは、sklearnから指定されたモジュールをインポートします。
次のタスクは、プロジェクトに必要なデータをダウンロードすることです。 これについては、次の章で学習します。
Pythonでのロジスティック回帰-データの取得
この章では、Pythonでロジスティック回帰を実行するためのデータを取得するための手順について詳しく説明します。
データセットのダウンロード
前述のUCIデータセットをまだダウンロードしていない場合は、https://archive.ics.uci.edu/ml/datasets/bank+marketing [こちら]からダウンロードしてください。 データフォルダをクリックします。 次の画面が表示されます-
所定のリンクをクリックしてbank.zipファイルをダウンロードします。 zipファイルには次のファイルが含まれています-
モデル開発にはbank.csvファイルを使用します。 bank-names.txtファイルには、後で必要になるデータベースの説明が含まれています。 bank-full.csvには、より高度な開発に使用できるはるかに大きなデータセットが含まれています。
ここでは、ダウンロード可能なソースzipにbank.csvファイルを含めています。 このファイルには、コンマ区切りのフィールドが含まれています。 また、ファイルにいくつかの変更を加えました。 学習には、プロジェクトソースzipに含まれているファイルを使用することをお勧めします。
データのロード
今コピーしたcsvファイルからデータを読み込むには、次のステートメントを入力してコードを実行します。
In [2]: df = pd.read_csv('bank.csv', header=0)
また、次のコードステートメントを実行することにより、ロードされたデータを調べることができます-
IN [3]: df.head()
コマンドが実行されると、次の出力が表示されます-
基本的に、ロードされたデータの最初の5行を印刷しました。 存在する21列を調べます。 モデル開発には、これらの数列のみを使用します。
次に、データを消去する必要があります。 データには NaN の行が含まれる場合があります。 そのような行を排除するには、次のコマンドを使用します-
IN [4]: df = df.dropna()
幸いなことに、bank.csvにはNaNの行が含まれていないため、この場合、この手順は本当に必要ありません。 ただし、一般に、巨大なデータベースでそのような行を発見することは困難です。 そのため、上記のステートメントを実行してデータを消去する方が常に安全です。
注-次のステートメントを使用すると、いつでもデータサイズを簡単に調べることができます-
IN [5]: print (df.shape)
(41188, 21)
行と列の数は、上の2行目に示すように出力に出力されます。
次に行うことは、構築しようとしているモデルの各列の適合性を調べることです。
Pythonでのロジスティック回帰-データの再構築
組織が調査を実施するときはいつでも、顧客から可能な限り多くの情報を収集しようとします。この情報は、後で何らかの形で組織に役立つと考えています。 現在の問題を解決するには、問題に直接関連する情報を取得する必要があります。
すべてのフィールドを表示する
ここで、便利なデータフィールドを選択する方法を見てみましょう。 コードエディターで次のステートメントを実行します。
In [6]: print(list(df.columns))
次の出力が表示されます-
['age', 'job', 'marital', 'education', 'default', 'housing', 'loan',
'contact', 'month', 'day_of_week', 'duration', 'campaign', 'pdays',
'previous', 'poutcome', 'emp_var_rate', 'cons_price_idx', 'cons_conf_idx',
'euribor3m', 'nr_employed', 'y']
出力には、データベース内のすべての列の名前が表示されます。 最後の列「y」は、この顧客が銀行に定期預金を持っているかどうかを示すブール値です。 このフィールドの値は、「y」または「n」のいずれかです。 データの一部としてダウンロードされたbanks-name.txtファイルの各列の説明と目的を読むことができます。
不要なフィールドを排除する
列名を調べると、一部のフィールドが目前の問題にとって重要ではないことがわかります。 たとえば、 month、day_of_week 、campaignなどのフィールド。 役に立たない これらのフィールドをデータベースから削除します。 列をドロップするには、以下に示すようにドロップコマンドを使用します-
In [8]: #drop columns which are not needed.
df.drop(df.columns[[axis = 1, inplace = True)
このコマンドは、列番号0、3、7、8などをドロップすることを示しています。 インデックスが適切に選択されていることを確認するには、次のステートメントを使用します-
In [7]: df.columns[9]
Out[7]: 'day_of_week'
これは、指定されたインデックスの列名を出力します。
不要な列を削除した後、headステートメントでデータを調べます。 画面出力はここに示されています-
In [9]: df.head()
Out[9]:
job marital default housing loan poutcome y
0 blue-collar married unknown yes no nonexistent 0
1 technician married no no no nonexistent 0
2 management single no yes no success 1
3 services married no no no nonexistent 0
4 retired married no yes no success 1
現在、データの分析と予測に重要であると感じるフィールドのみがあります。 *データサイエンティスト*の重要性は、このステップで明らかになります。 データサイエンティストは、モデル構築に適切な列を選択する必要があります。
たとえば、 job のタイプは、一見しただけではデータベースに含めるように全員を納得させることはできませんが、非常に有用なフィールドになります。 すべてのタイプの顧客がTDを開くわけではありません。 低所得者はTDを開かないかもしれませんが、高所得者は通常、TDに余分なお金を駐車します。 したがって、このシナリオでは、ジョブのタイプが非常に重要になります。 同様に、分析に関連すると思われる列を慎重に選択します。
次の章では、モデルを構築するためのデータを準備します。
Pythonでのロジスティック回帰-データの準備
分類子を作成するには、分類子構築モジュールが要求する形式でデータを準備する必要があります。 One Hot Encoding を実行してデータを準備します。
データのエンコード
データをエンコードすることの意味を簡単に説明します。 まず、コードを実行しましょう。 コードウィンドウで次のコマンドを実行します。
In [10]: # creating one hot encoding of the categorical columns.
data = pd.get_dummies(df, columns =['job', 'marital', 'default', 'housing', 'loan', 'poutcome'])
コメントが言うように、上記のステートメントはデータの1つのホットエンコーディングを作成します。 何が作成されたのか見てみましょう。 データベースのヘッドレコードを印刷して、*“ data” *という作成されたデータを調べます。
In [11]: data.head()
次の出力が表示されます-
上記のデータを理解するために、以下に示すように data.columns コマンドを実行して列名をリストします-
In [12]: data.columns
Out[12]: Index(['y', 'job_admin.', 'job_blue-collar', 'job_entrepreneur',
'job_housemaid', 'job_management', 'job_retired', 'job_self-employed',
'job_services', 'job_student', 'job_technician', 'job_unemployed',
'job_unknown', 'marital_divorced', 'marital_married', 'marital_single',
'marital_unknown', 'default_no', 'default_unknown', 'default_yes',
'housing_no', 'housing_unknown', 'housing_yes', 'loan_no',
'loan_unknown', 'loan_yes', 'poutcome_failure', 'poutcome_nonexistent',
'poutcome_success'], dtype='object')
ここで、 get_dummies コマンドによって1つのホットエンコードがどのように行われるかを説明します。 新しく生成されたデータベースの最初の列は「y」フィールドで、このクライアントがTDにサブスクライブしているかどうかを示します。 次に、エンコードされた列を見てみましょう。 最初のエンコードされた列は*「ジョブ」*です。 データベースの「job」列には、「admin」、「blue-collar」、「entrepreneur」など、考えられる多くの値があります。 可能な値ごとに、データベースに新しい列が作成され、列名がプレフィックスとして追加されます。
したがって、「job_admin」、「job_blue-collar」などの列があります。 元のデータベースのエンコードされたフィールドごとに、作成されたデータベースに追加された列のリストがあり、元のデータベースで列が使用できるすべての値が含まれています。 列のリストを注意深く調べて、データが新しいデータベースにマップされる方法を理解します。
データマッピングについて
生成されたデータを理解するために、dataコマンドを使用してデータ全体を印刷してみましょう。 コマンド実行後の部分的な出力を以下に示します。
In [13]: data
上記の画面は、最初の12行を示しています。 さらに下にスクロールすると、すべての行に対してマッピングが行われていることがわかります。
データベースのさらに下の部分的な画面出力は、クイックリファレンスとしてここに表示されます。
マッピングされたデータを理解するために、最初の行を調べてみましょう。
「y」フィールドの値で示されるように、この顧客はTDにサブスクライブしていないと言います。 また、この顧客が「ブルーカラー」の顧客であることも示しています。 水平方向に下にスクロールすると、彼には「住宅」があり、「融資」を受けていないことがわかります。
この1つのホットエンコーディングの後、モデルの構築を開始する前に、さらにデータ処理が必要になります。
「不明」の削除
マッピングされたデータベースの列を調べると、「不明」で終わる列がいくつかあることがわかります。 たとえば、スクリーンショットに示す次のコマンドを使用して、インデックス12の列を調べます-
In [14]: data.columns[12]
Out[14]: 'job_unknown'
これは、指定された顧客のジョブが不明であることを示します。 明らかに、このような列を分析とモデル構築に含めることは意味がありません。 したがって、「不明な」値を持つすべての列を削除する必要があります。 これは、次のコマンドで行われます-
In [15]: data.drop(data.columns[[axis=1, inplace=True)
必ず正しい列番号を指定してください。 疑わしい場合は、前述のようにcolumnsコマンドでインデックスを指定することで、いつでも列名を調べることができます。
不要な列を削除した後、以下の出力に示すように列の最終リストを調べることができます-
In [16]: data.columns
Out[16]: Index(['y', 'job_admin.', 'job_blue-collar', 'job_entrepreneur',
'job_housemaid', 'job_management', 'job_retired', 'job_self-employed',
'job_services', 'job_student', 'job_technician', 'job_unemployed',
'marital_divorced', 'marital_married', 'marital_single', 'default_no',
'default_yes', 'housing_no', 'housing_yes', 'loan_no', 'loan_yes',
'poutcome_failure', 'poutcome_nonexistent', 'poutcome_success'],
dtype='object')
この時点で、データはモデル構築の準備ができています。
Pythonでのロジスティック回帰-データの分割
約4万1千の奇妙なレコードがあります。 モデル構築にデータ全体を使用する場合、テスト用のデータは残されません。 したがって、通常、データセット全体を2つの部分、たとえば70/30パーセントに分割します。 データの70%をモデル作成に使用し、残りを作成したモデルの予測の精度をテストします。 要件に応じて異なる分割比を使用できます。
フィーチャ配列の作成
データを分割する前に、データを2つの配列XとYに分離します。 X配列には、分析するすべての機能(データ列)が含まれ、Y配列は、予測の出力であるブール値の単一次元配列です。 これを理解するために、いくつかのコードを実行してみましょう。
まず、次のPythonステートメントを実行してX配列を作成します-
In [17]: X = data.iloc[:,1:]
*X* の内容を調べるには、 *head* を使用していくつかの初期レコードを印刷します。 次の画面は、X配列の内容を示しています。
In [18]: X.head ()
配列には、複数の行と23の列があります。
次に、「 y 」値を含む出力配列を作成します。
出力配列の作成
予測値列の配列を作成するには、次のPythonステートメントを使用します-
In [19]: Y = data.iloc[:,0]
*head* を呼び出して、その内容を調べます。 以下の画面出力は結果を示しています-
In [20]: Y.head()
Out[20]: 0 0
1 0
2 1
3 0
4 1
Name: y, dtype: int64
今、次のコマンドを使用してデータを分割します-
In [21]: X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=0)
これにより、 X_train、Y_train、X_test、およびY_test という4つの配列が作成されます。 前と同様に、headコマンドを使用してこれらの配列の内容を調べることができます。 モデルのトレーニングにはX_trainおよびY_train配列を使用し、テストおよび検証にはX_testおよびY_test配列を使用します。
これで、分類子を作成する準備が整いました。 次の章でこれを検討します。
Pythonでのロジスティック回帰-分類子の構築
分類子を最初から作成する必要はありません。 分類子の作成は複雑であり、統計、確率理論、最適化手法などのいくつかの分野の知識が必要です。 これらの分類子の完全にテストされた非常に効率的な実装を備えた、いくつかの事前構築されたライブラリが市場で入手可能です。 sklearn から事前に作成されたモデルを1つ使用します。
sklearn分類子
sklearnツールキットからロジスティック回帰分類器を作成することは簡単であり、ここに示すように単一のプログラムステートメントで行われます-
In [22]: classifier = LogisticRegression(solver='lbfgs',random_state=0)
分類子が作成されたら、内部パラメーターを調整し、将来のデータの予測に備えて、トレーニングデータを分類子にフィードします。 分類子を調整するには、次のステートメントを実行します-
In [23]: classifier.fit(X_train, Y_train)
これで、分類子をテストする準備ができました。 次のコードは、上記の2つのステートメントの実行の出力です-
Out[23]: LogisticRegression(C = 1.0, class_weight = None, dual = False,
fit_intercept=True, intercept_scaling=1, max_iter=100,
multi_class='warn', n_jobs=None, penalty='l2', random_state=0,
solver='lbfgs', tol=0.0001, verbose=0, warm_start=False))
これで、作成した分類子をテストする準備が整いました。 これについては次の章で説明します。
Pythonでのロジスティック回帰-テスト
上記で作成した分類器を実稼働で使用する前にテストする必要があります。 テストでモデルが目的の精度を満たしていないことが判明した場合は、上記のプロセスに戻って、別の機能セット(データフィールド)を選択し、モデルを再構築してテストする必要があります。 分類器が目的の精度の要件を満たすまで、これは反復ステップになります。 それでは、分類器をテストしましょう。
テストデータの予測
分類子をテストするには、前の段階で生成されたテストデータを使用します。 私たちは、作成されたオブジェクトで predict メソッドを呼び出し、次のコマンドに示すようにテストデータの X 配列を渡します-
In [24]: predicted_y = classifier.predict(X_test)
これにより、トレーニングデータセット全体に対して1次元配列が生成され、X配列の各行の予測が提供されます。 次のコマンドを使用して、この配列を調べることができます-
In [25]: predicted_y
以下は、上記の2つのコマンドの実行時の出力です-
Out[25]: array([0, 0, 0, ..., 0, 0, 0])
出力は、最初と最後の3人の顧客が*定期預金*の候補者ではないことを示しています。 アレイ全体を調べて、潜在的な顧客を整理できます。 これを行うには、次のPythonコードスニペットを使用します-
In [26]: for x in range(len(predicted_y)):
if (predicted_y[x] == 1):
print(x, end="\t")
上記のコードを実行した出力は以下に示されています-
出力には、TDのサブスクライブの候補となる可能性のあるすべての行のインデックスが表示されます。 これで、この出力を銀行のマーケティングチームに渡すことができます。このチームは、選択した行の各顧客の連絡先の詳細を取得し、仕事を進めます。
このモデルを生産に導入する前に、予測の精度を検証する必要があります。
精度の検証
モデルの精度をテストするには、以下に示すように分類器でスコアメソッドを使用します-
In [27]: print('Accuracy: {:.2f}'.format(classifier.score(X_test, Y_test)))
このコマンドを実行する画面出力は以下に示されています-
Accuracy: 0.90
モデルの精度は90%であり、ほとんどのアプリケーションで非常に優れていると考えられます。 したがって、これ以上のチューニングは必要ありません。 これで、顧客は次のキャンペーンを実行し、潜在的な顧客のリストを取得し、TDを開いて高い確率で成功を収めることができます。
Pythonでのロジスティック回帰-制限
上記の例からわかるように、機械学習にロジスティック回帰を適用することは難しくありません。 ただし、独自の制限があります。 ロジスティック回帰では、多数のカテゴリ機能を処理できません。 これまで説明した例では、フィーチャの数を非常に大幅に削減しました。
ただし、これらの機能が予測で重要な場合、それらを含めることを余儀なくされましたが、ロジスティック回帰では適切な精度が得られませんでした。 ロジスティック回帰もオーバーフィットに対して脆弱です。 非線形問題には適用できません。 ターゲットに相関せず、互いに相関している独立変数ではパフォーマンスが低下します。 したがって、解決しようとしている問題に対するロジスティック回帰の適合性を慎重に評価する必要があります。
機械学習には、他の手法が考案された多くの分野があります。 いくつか例を挙げると、k最近傍(kNN)、線形回帰、サポートベクターマシン(SVM)、決定木、単純ベイズなどのアルゴリズムがあります。 特定のモデルで最終決定する前に、解決しようとしている問題に対するこれらのさまざまな手法の適用可能性を評価する必要があります。
Pythonでのロジスティック回帰-まとめ
ロジスティック回帰は、バイナリ分類の統計的手法です。 このチュートリアルでは、ロジスティック回帰を使用するようにマシンをトレーニングする方法を学びました。 機械学習モデルを作成する場合、最も重要な要件はデータの可用性です。 適切で適切なデータがなければ、単に機械を学習させることはできません。
データを取得したら、次の主なタスクはデータをクレンジングし、不要な行、フィールドを削除し、モデル開発に適切なフィールドを選択することです。 これが完了したら、データをトレーニングのために分類器が必要とする形式にマップする必要があります。 したがって、データの準備は、機械学習アプリケーションの主要なタスクです。 データの準備ができたら、特定の種類の分類子を選択できます。
このチュートリアルでは、 sklearn ライブラリーで提供されるロジスティック回帰分類器の使用方法を学びました。 分類器をトレーニングするために、モデルのトレーニングにデータの約70%を使用します。 残りのデータはテストに使用します。 モデルの精度をテストします。 これが許容範囲内にない場合、新しい機能セットの選択に戻ります。
繰り返しますが、データの準備プロセス全体を実行し、モデルをトレーニングして、その精度に満足するまでテストします。 機械学習プロジェクトを開始する前に、これまでに開発され、業界で成功裏に適用されているさまざまな技術を学び、経験する必要があります。