ロジスティック回帰アルゴリズムの導出とPythonをベースとした詳細な実装

1 ロジスティック回帰の概要

画像.png

ロジスティック回帰は、分類問題の統計的学習方法です。これは線形回帰の原理に基づいており、線形関数の出力値を [0,1] 区間の確率値にマッピングすることで分類します。

ロジスティック回帰の入力は一連の特徴変数であり、各特徴と対応する係数、切片項目の積を計算して線形関数を取得し、その関数の出力値をシグモイド関数でマッピングして、確率値。

ロジスティック回帰は、電子メールがスパムかどうかを判断するなど、サンプルを 2 つのカテゴリに分けるバイナリ分類問題でよく使用されます。ロジスティック回帰は、サンプルを 3 つ以上のクラスに分類するなど、複数の分類の問題にも拡張できます。

ロジスティック回帰には、単純さ、効率性、理解しやすさという利点があり、金融​​リスク管理、医療診断、推奨システムなどの実用的なアプリケーションで広く使用されています。

2 ロジスティック回帰式の導出と解法

2.1 式の導出

P ( y = 1 ∣ x ) = 1 1 + e − ( β 0 + β 1 x 1 + β 2 x 2 + . . . + β pxp ) P(y=1|x) = \frac{1}{ 1+e^{-(\beta_0+\beta_1x_1+\beta_2x_2+...+\beta_px_p)}}P (=1 x )=1+e( b0+ b1バツ1+ b2バツ2+ . + bpバツp)1
ロジスティック回帰の公式はよく知っていても、導出プロセスについては知らないかもしれませんが、実際、導出プロセスは非常に簡単です。

入力特徴x \mathbf{x}が与えられたとします。x、ロジスティック回帰モデルの出力yyy は次のように表現できます。

y = P ( y = 1 ∣ x ) = σ ( w T x ) y = P(y=1|\mathbf{x}) = \sigma(\mathbf{w}^T \mathbf{x})y=P (=1 x )=s ( wTx )_

其中, σ ( z ) \sigma(z) σ ( z )はシグモイド関数を表し、次のように定義されます。σ ( z ) = 1 / ( 1 + e − z ) \sigma(z) = 1 / (1 + e^{-z})σ ( z )=1 / ( 1+ez )この関数は後の深層学習でよく使われることになります。

シグモイド関数の使用については、理由は非常に単純で、多くの教科書ではこの重要な思考のリンクが無視されているため、ブロガーがここに追加します。
値の範囲が [0, 1] である関数を見つけたいと考えていますが、この種の関数を見つけるのは簡単ではありません。線形回帰で使用される式y = θ xy=\theta xy=θ xの値の範囲は(-∞, +∞) です。そこで、オッズ(確率)という概念を導入します。オッズ = P 1 − P オッズ=\frac{P}{1-P}ああああ_ _ _=1PPオッズの値は (0,+∞) で、対数関数の場合、その定義域はちょうど (0,+∞) で、値の範囲は (-∞,+∞) です。したがって、関数log ⁡ ( P 1 − P ) = θ x \log(\frac{P}{1-P})=\theta x を構築できます。ログ( _1PP)=θ xは P、つまりロジスティック回帰の基本形式P = 1 1 + e − x P=\frac{1}{1+e^{-x}} をP=1+e×1これは、私たちがよくシグモイド関数と呼ぶものです。

2.2 数式解

導出の便宜上、トレーニング データ セットにはmmが含まれていると仮定します。m個のサンプル、各サンプルにはnn がn 個の特徴、つまりX ∈ R m × n \mathbf{X} \in \mathbb{R}^{m\times n}バツRm × n、ラベルはy ∈ { 0 , 1 } my \in \{0, 1\}^my{ 0 ,1 }メートルモデルを構築するには、トレーニング データセットを使用してモデル パラメーターw \mathbf{w}w

最尤推定を使用してモデル パラメーターを解決します。最尤推定の目的は、一連のモデル パラメーターw \mathbf{w}を見つけることです。w、トレーニング データセットの発生確率を最大化します。トレーニング データ セット内のiii個のサンプルの入力特徴量は xi \mathbf{x}_iです。バツ私は、出力はyi y_iですy私は、その確率は次のように表されます。

P ( yi ∣ xi ; w ) = σ ( w T xi ) yi ( 1 − σ ( w T xi ) ) 1 − yi P(y_i|\mathbf{x}_i; \mathbf{w}) = \sigma( \mathbf{w}^T \mathbf{x}_i)^{y_i} (1 - \sigma(\mathbf{w}^T \mathbf{x}_i))^{1-y_i}P (私はx私は;=s ( wT ×私は)y私は( 1s ( wT ×私は) )1 y私は

トレーニング データセットの確率は次のように表すことができます。

P ( y ∣ X ; w ) = ∏ i P ( yi ∣ xi ; w ) = ∏ i σ ( w T xi ) yi ( 1 − σ ( w T xi ) ) 1 − yi P(y|\mathbf{X }; \mathbf{w}) = \prod_i P(y_i|\mathbf{x}_i; \mathbf{w}) = \prod_i \sigma(\mathbf{w}^T \mathbf{x}_i)^{ y_i} (1 - \sigma(\mathbf{w}^T \mathbf{x}_i))^{1-y_i}P ( y X ;=P (私はx私は;=s ( wT ×私は)y私は( 1s ( wT ×私は) )1 y私は

対数尤度関数は次のとおりです。

L ( w ) = log ⁡ P ( y ∣ X ; w ) = ∑ i [ yi log ⁡ ( σ ( w T xi ) ) + ( 1 − yi ) log ⁡ ( 1 − σ ( w T xi ) ) ] L (\mathbf{w}) = \log P(y|\mathbf{X}; \mathbf{w}) = \sum_i [y_i \log(\sigma(\mathbf{w}^T \mathbf{x}_i )) + (1-y_i) \log(1 - \sigma(\mathbf{w}^T \mathbf{x}_i))]L ( w )=ログ_P ( y X ;=[ y私はlog g ( σ ( wT ×私は) )+( 1y私は)ログ( 1 _s ( wT ×私は) ) )

私たちの目標は、対数尤度関数L ( w ) L(\mathbf{w}) を最大化することです。L ( w )勾配上昇アルゴリズムを使用して、最適なパラメーターw \mathbf{w}w。对L ( w ) L(\mathbf{w})L ( w )求导,得られた: ∂ L ( w ) ∂ w = ∑ i ( σ ( w T xi ) − yi ) xi \frac{\partial L(\mathbf{w})}{\partial \mathbf{ w}} = \sum_i(\sigma(\mathbf{w}^T \mathbf{x}_i) - y_i)\mathbf{x}_i∂w _L ( w )=( s ( wT ×私は)y私は) ×私は勾配上昇アルゴリズムを使用して、各更新w \mathbf{w}w個別:w ← w + α ∑ i ( σ ( w T xi ) − yi ) xi \mathbf{w} \leftarrow \mathbf{w} + \alpha \sum_i (\sigma(\mathbf{w}^ T \mathbf {x}_i) - y_i)\mathbf{x}_iww+ある( s ( wT ×私は)y私は) ×私はその中で、α \alphaαは学習率です。

3 Pythonベースの実装

3.1 許容可能なパラメータ

Python では、Scikit-learn ライブラリの LogisticRegression クラスを使用してロジスティック回帰モデルを作成できます。

LogisticRegression クラスの主なパラメータとメソッドは次のとおりです。

パラメータ:

  • ペナルティ: ペナルティ項目。「l1」、「l2」、「elasticnet」、「none」のいずれかになります。デフォルトは「l2」です。
  • C: 正則化係数。モデルの複雑さを制御するために使用されます。C の値が小さいほど、モデルは単純になります。デフォルトは 1.0 です。
  • solver: 問題を最適化するために使用されるアルゴリズム。「newton-cg」、「lbfgs」、「liblinear」、「sag」、「saga」のいずれかになります。デフォルトは「lbfgs」です。
  • max_iter: 最適化アルゴリズムの反復数を制御するために使用される反復の最大数。デフォルトは 100 です。

3.2 完全なコード例

モデルのトレーニングと予測には、sklearn に付属するウィスコンシン乳がんデータセットを使用します。

  1. まず必要なパッケージと sklearn などのデータをインポートします。
import pandas as pd  
from sklearn.datasets import load_breast_cancer  
from sklearn.linear_model import LogisticRegression  
from sklearn.model_selection import train_test_split  
import matplotlib.pyplot as plt  
import matplotlib as mpl  
  
## 设置字符集,防止中文乱码  
mpl.rcParams['font.sans-serif'] = [u'simHei']  
mpl.rcParams['axes.unicode_minus'] = False  
  
# 加载数据集  
data = load_breast_cancer()  
# 转换为DataFrame  
df = pd.DataFrame(data.data, columns=data.feature_names)  
df['target'] = pd.Series(data.target)

ここで skearn に付属するデータはすでにクリーンアップされたバージョンです。オリジナルのウィスコンシン州乳がんデータセットまたはその他の個人データセットを使用している場合は、データを表示、クリーンアップし、事前スクリーニングを行う必要があります。たとえば、特徴セットには患者 ID などの不要な情報が含まれる場合があり、そのような情報は直接削除できます。

同時に、一般的に使用される関数を使用して、データ セットのステータスを表示することもできます。

# 检测非数据类型与缺失值  
print(df.info())
# 检查异常值  
print(df.describe())

ここでの公式データの実行結果は次のとおりで、何も変更する必要がないことがわかります。出力は次のとおりです。
画像.png
Type に object が表示される場合、通常、この型の行に非数値型があることを意味し、次のように使用できます。

df['A'] = pd.to_numeric(df['A'], errors='coerce').astype(float)

この関数は、dfのA列をfloat型に変換し、変換できない値をnull値に変更することができます。次に、他の欠損値と組み合わせて使用​​してdropna削除します。
2. モデルの構築とフィッティング

# 分割数据集  
X = df.drop('target', axis=1)  
y = df['target']  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)  
  
# 创建逻辑回归模型  
clf = LogisticRegression(max_iter=100)  
  
# 拟合模型  
clf.fit(X_train, y_train)

モデルを構築する場合、通常はハイパーパラメーターを変更する必要はありません。また、データセットの実際の特性や、フィッティング後の警告 (関数が最終的に収束しないなど) に応じてハイパーパラメーターを調整することもできます。
3. モデルの予測とプロット

# 预测  
y_pred = clf.predict(X_test)  
  
# 评估  
accuracy = clf.score(X_test, y_test)  
  
print("预测结果:", y_pred)  
print("准确率:", accuracy)  
  
plt.plot(range(len(X_test)), y_test, 'ro', markersize=4, zorder=3, label=u'真实值')  
plt.plot(range(len(X_test)), y_pred, 'go', markersize=10, zorder=2, label=u'预测值')  
plt.legend()  
plt.show()

この図から、赤丸と緑丸が同時に出現する点が予測正解データであり、2 つだけが出現する点が誤予測データであることがわかります。ここでの予測結果の判定は、確率が 0.5 より大きいか、0.5 より小さいかで分けられます。0.8 より大きい確率が 0 である場合に、それを 0 と見なす (診断漏れの確率を減らす) ことを実現したい場合は、次の方法を使用できます。
画像.png

  1. カスタムしきい値
print(clf.predict_proba(X_test)[:,0]>0.8)

clf.predict_proba(X_test)さまざまなカテゴリの確率を出力するために使用され、その出力タイプの入力は次のとおりです。
画像.png
0.8 より大きい 0 に分類される確率のデータを取得したい場合は、列の値を抽出して判断できます。

この記事のコードはここからダウンロードできます

おすすめ

転載: blog.csdn.net/nkufang/article/details/129760817
おすすめ