この記事は、の一部として公開されました データサイエンスブログソン.
概要
線形回帰はベクトルをマッピングします x yに。 線形回帰の出力を0から1の範囲で押しつぶすことができれば、確率として解釈できます。 線形回帰モデルの出力を押しつぶすことにより、二項分類タスクのクラスラベルの確率を与える分類器を使用できます。 この教師あり学習分類子は、ロジスティック回帰分類子として知られています。
ここで、ロジスティック関数とも呼ばれるシグモイド関数は、バイナリ結果が発生する可能性を予測します。 シグモイド関数は、機械学習モデルに非線形性を導入するために使用される活性化関数です。 値を取り、それを0と1の間で変換します。関数は次のとおりです。
したがって、ロジスティック回帰は、独立した特徴変数間の接続を識別することによってクラスラベルを予測します。 決定境界は線形であり、分類の目的で使用されます。 損失関数は次のとおりです。
ロジスティック回帰の利点
- ロジスティック回帰モデルは簡単に実装できます。
- トレーニングは非常に効率的です。
- 過剰適合する傾向が少なくなります。
- この分類器は、線形分離可能なデータセットで効率的に実行されます。
ロジスティック回帰のデメリット
- このモデルは、離散関数のみを予測するために使用されます。
- 非線形問題は、ロジスティック回帰分類器を使用して解決することはできません。
アプリケーション
- 電子メールがスパムかどうかの分類
- 水質の分類は良いか悪いか
データセット
このプロジェクトで使用されるデータセットは、Kaggle(https://www.kaggle.com/nareshbhat/wine-quality-binary-classification)のワイン品質バイナリ分類データセットです。 このデータセットには、赤ワインの品質に影響を与えるさまざまな要因に関連する情報が含まれています。
インスタンス数:1600
欠落している値:NA
属性の数:12
属性情報:
入力変数:(すべて数値)
1 –固定酸性度
2 –揮発性酸性度
3 –クエン酸
4 –残留糖分
5 –塩化物
6 –遊離二酸化硫黄
7 –総二酸化硫黄
8 –密度
9 – pH
10 –硫酸塩
11 –アルコール
出力変数:(品質が良いか悪いかを検出します)
12 –品質(0-悪い、1-良い)
必要なPythonライブラリをインポートします
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings('ignore')
データセットをロードする
パンダのPythonライブラリを使用してCSVファイルであるwineデータセットをロードします。
df = pd.read_csv( "wine.csv")df.head()
データの前処理
#preprocessing#データセットの品質列は、悪い場合は0、良い場合は1としてマッピングする必要があります。 df = df.replace({'quality':{'good':1、'bad':0}})df.head()
欠落している値を確認します
#欠落している値をチェックするdf.isna()。any()。any()
出力:False
全体的な統計とプロット
df.describe()
#countplotを使用して、「品質」列の観測数を視覚化します。 sns.countplot(x ='品質'、データ= df)
#列の分布–アルコールデータ= df ['alcohol'] sns.distplot(data)plt.show()
特徴重要度スコア
import warnings warnings.filterwarnings('ignore')from sklearn.ensemble import ExtraTreesClassifier model = ExtraTreesClassifier()model.fit(features、target)print(model.feature_importances_)imp = pd.Series(model.feature_importances_、index = features.columns )imp.nlargest(10).plot(kind ='barh')plt.show()
機能とターゲット変数の定義
分類に使用される機能には、アルコール、硫酸塩、総二酸化硫黄、揮発性酸性度、クエン酸、残留糖分が含まれます。 #target = quality target = df.iloc [:、11] features = df.iloc [:、[10,9,6,1,2,3]]
特徴ベクトルを標準化する
#sklearn.preprocessingからの特徴ベクトルの標準化importStandardScaler#StandardScaler()は、標準偏差が1、.meanが0になるように特徴値を再スケーリングします。sc= StandardScaler()scaled_features = sc.fit_transform(features)
ロジスティック回帰モデル
Pythonのsklearnライブラリのロジスティック回帰組み込みモデルを使用します。このモデルでは、損失関数を定義して予測を行うこともできます。
まず、データセットを0.3つの部分に分割します。 70つはモデルのトレーニングセットとして、もう30つはモデルの予測を検証するためのテストセットとして使用します。 この手順を省略すると、モデルは同じデータセットでトレーニングおよびテストされ、過剰適合と呼ばれる現象である真のエラー率を過小評価します。 テストサイズを0に設定します。つまり、クラスラベルの1%がトレーニングセットに割り当てられ、残りのXNUMX%がテストセットとして使用されます。 Pythonのsklearnライブラリのtrain_test_splitメソッドを使用してこれを行います。 モデル。 fit()メソッドは、トレーニングデータを引数として取ることができます。 ここでのモデル名はLRです。 このモデルは、テストデータセットからラベルのないデータを取得し、各例にXNUMXからXNUMXの範囲の確率を効果的に割り当てることができます。これはロジスティック回帰モデルの重要な機能です。 次に、テストデータでモデルを評価します。
分割70:30の標準最急降下アルゴリズムを使用したロジスティック回帰
from sklearn.linear_model import LogisticRegression from sklearn.linear_model import SGDClassifier#70%トレーニングデータX_train、X_test、y_train、y_test = train_test_split(scaled_features、target、test_size = 0.3、random_state = 42)lr = LogisticRegression()lr.fit(X_train、 y_train)print(classification_report(y_test、lr.predict(X_test)))
ゼロからの最急降下法を使用したロジスティック回帰
ロジスティック回帰モデルのコスト関数は最小化できます
それはです 反復最適化アルゴリズムと微分可能関数の最小値を見つけます。 まず、関数から任意のランダムなポイントを選択する必要があります。 次に、関数の導関数を計算すると役立ちます。 これで、結果の勾配に学習率を掛けることができます。 次に、結果を差し引いて新しいものを取得する必要があります。 この更新は、反復ごとに同時に実行する必要があります. ローカルまたはグローバルの最小値に達するまで、これらの手順を繰り返します。 グローバル最小値に到達することにより、予測で可能な限り低い損失を達成しました。
from sklearn.datasets.samples_generator import make_blobs from matplotlib import pyplot as plt from pandas import DataFrame import numpy as np X、Y = make_blobs(n_samples = 100、centers = 2、n_features = 2、cluster_std = 5、random_state = 11)m = 100
#入力配列のシグモイドを含む配列を返しますdef sigmoid(z):return 1 /(1 + np.exp(-z))#入力配列の予測を含む配列を返しますdef hy(w、X):z = np.array(w [0] + w [1] * np.array(X [:、0])+ w [2] * np.array(X [:、1]))return sigmoid(z)# cost function def cost(w、X、Y):y_predictions = hy(w、X)#予測値の割り当てreturn -1 * sum(Y * np.log(y_predictions)+(1-Y)* np.log( 1-y_predictions))
#gradient descent def partial_derivatives(w、X、Y):y_predictions = hy(w、X)j = [0] * 3 j [0] = -1 * sum(Y *(1-y_predictions)-(1-Y )* y_predictions)#偏導関数の保存j [1] = -1 * sum(Y *(1-y_predictions)* X [:、0]-(1-Y)* y_predictions * X [:、0])j [ 2] = -1 * sum(Y *(1-y_predictions)* X [:、1]-(1-Y)* y_predictions * X [:、1])return j#偏導関数を含む配列を返すdefgradient_descent(w_new 、w_prev、learning_rate):print(w_prev)print(cost(w_prev、X、Y))j = 0 while True:w_prev = w_new#各反復で重みを更新w0 = w_prev [0] --learning_rate * partial_derivatives(w_prev、X 、Y)[0] w1 = w_prev [1] --learning_rate * partial_derivatives(w_prev、X、Y)[1] w2 = w_prev [2] --learning_rate * partial_derivatives(w_prev、X、Y)[2] w_new = [w0 、w1、w2] print(w_new)print(cost(w_new、X、Y))if(w_new [0]-w_prev [0])** 2 +(w_new [1]-w_prev [1])** 2 +(w_new [2]-w_prev [2])** 2 100:w_new j +=1を返します
w = [1,1,1] w =gradient_descent(w、w、0.0099)print(w)
def方程式(x):戻り値(-w [0] -w [1] * x)/ w [2] defグラフ(式、x_range):x = np.array(x_range)y =式(x)plt。 plot(x、y)df = DataFrame(dict(x = X [:、0]、y = X [:、1]、label = Y))colors = {0:'red'、1:'green'} fig、ax = plt.subplots()g = df.groupby('label')for key、group in g:group.plot(ax = ax、kind ='scatter'、x ='x'、y ='y '、label = key、color = colors [key])graph(equation、range(-20,15))plt.xlabel(' x0')plt.ylabel(' x1')plt.show()
ロジスティック回帰に基づく記事をもっと読む ウェブサイト.
まとめ
したがって、ロジスティック回帰は統計分析手法です。 私たちのモデルは、テストデータの72%を正確にラベル付けしており、データセットに別のアルゴリズムを使用することで、精度をさらに高めることができます。
この記事に示されているメディアは Analytics Vidhya が所有するものではなく、著者の裁量で使用されています。
関連記事
出典:https://www.analyticsvidhya.com/blog/2022/01/logistic-regression-an-introductory-note/