Logistic regression is predictive modelling algorithms that is used when Y variable is binary categorical. 目標は、イベント1の確率を予測するために使用できる数式を決定することです。 一度、方程式が確立されると、X�だけ知られているときにY�を予測するために使用することができます。
Logistic Regression – A Complete Tutorial With Examples in R Contents1. ロジスティック回帰入門
2.バイナリ分類問題の実例
3.なぜ線形回帰ではないのか
4.ロジスティック方程式
5.Rでロジスティック回帰モデルを構築するには? 3521>6.How to deal with Class Imbalance? 3521>7.How to handle Class Imbalance with Upsample and Downsample? 3521>8.Building the Logistic Regression Model
9.Logistic Regression Modelの構築
10.Logistic Regression Modelの構築
11.Rでどのようにロジスティック回帰のモデル構築を行うか
12.Rでどのように行うか13.Rでどのようにロジスティック回帰モデルの構築を行うか10. なぜクラスインバランスへの対処が重要なのか
11. 結論
1.ロジスティック回帰の紹介
以前は、線形回帰とは何か、連続Y変数を予測するためにそれをどのように使用するかについて見てきました。
では、Yが2つのクラスを持つカテゴリ変数である場合、どうすればよいでしょうか。
ロジスティック回帰は、バイナリ分類問題とも呼ばれるような問題をモデル化して解くために使用することができます。
それでも、ロジスティック回帰は古典的な予測モデリング手法であり、バイナリ変数のモデリングによく使用されます。 詳細は実際にモデルを構築するときに説明します。
バイナリ分類問題のいくつかの実例
ロジスティック回帰をどのような問題に使用できるのか疑問に思われるかもしれません。
以下に2値分類問題の例を示します。
- Spam Detection : あるメールがスパムかどうかを予測する
- Credit Card Fraud : あるクレジットカード取引が詐欺かどうかを予測する
- Health : 健康。 健康 : ある組織の塊が良性か悪性かを予測する
- マーケティング : あるユーザーが保険商品を購入するかどうかを予測する
- 銀行 : 顧客が貸し倒れを起こすかどうかを予測する。
Why not linear regression?
応答変数が2つの可能な値しかないとき、その値を0か1、または0と1の間の確率スコアとして予測するモデルを持つことが望ましい。
ここで、ロジスティック回帰が登場します。 ロジスティック回帰では、イベントが発生する確率を反映した確率スコアを取得します。
この場合のイベントとは、学習データセットの各行です。 与えられた電子メールがスパムかどうか、細胞の塊が悪性かどうか、ユーザーが製品を購入するかどうかなどを分類するようなものです。
The Logistic Equation
Logistic regression はイベントのログ オッズ ln(P/1?P) を取ることによってこれを実現します。
式の両辺に指数を取ると、
この式は、family
引数を "binomial"
に設定することにより glm()
関数を使用して実装できます。
また、重要な注意点は、ロジスティック回帰モデルで predict
関数を使うときは必ず type="response"
を設定しなければならないことです。
How to build logistic regression model in R?
さて、mlbench
パッケージのBreastCancer
データセットを使って、ロジスティック回帰を実装する方法を見てみましょう。
ここでの目標は、与えられた標本(データセットの行)がbenign
かmalignant
かを、他の9つの細胞の特徴に基づいてモデル化し、予測することです。
このデータセットには699個のオブザベーションと11列があります。 Class
列は応答(従属)変数で、与えられた組織が悪性か良性かを示します。
このデータセットの構造を確認してみましょう。Id
を除いて、他の列はすべて因子です。
なぜならば、因子変数を特徴量としてロジスティックモデルを構築すると、因子の各水準を1と0のダミー2値変数に変換するからです。
たとえば、Cell shapeは10レベルの因子です。 glmを使ってClassをcell shapeの関数としてモデル化すると、cell shapeはモデルを構築する前に9つのバイナリ・カテゴリカル変数に分割されます。
もし、何の準備もせずにロジスティックモデルを構築するとしたら、次のようになります。 しかし、ロジットモデルを構築する前に注意すべき点があるので、これには従いません。
ロジットモデルを構築する構文は、線形回帰で見たlm
関数と非常によく似ています。
glm
は一般化線形モデルの略で、線形回帰やロジスティック回帰以外にも多くの種類の回帰モデルを構築することができます。
では、ロジスティックモデルを構築するコードがどのように見えるか見ていきましょう。
上のモデルでは、Class
は Cell.shape
単独の関数としてモデル化されています。
しかし、出力から Cell.Shape
が 9 つの異なる変数に分割されていることに注目してください。 これは、Cell.Shape
が因子変数として格納されているため、glm
はCell.Shape
の10のカテゴリレベルそれぞれに対して1つのバイナリ変数(ダミー変数)を作成するからです。
明らかに、Cell.Shape
の意味から、Cell.Shape
のカテゴリレベル内に何らかの順序があるようです。 つまり、セル形状値 2 はセル形状 1 よりも大きいなどです。
これは、データセットの他の変数でも同様です。
# remove id column
bc <- bc# convert factors to numeric
for(i in 1:9) { bc <- as.numeric(as.character(bc))}
Another important point to note. When converting a factor to a numeric variable, you should always convert it to character and then to numeric, else, the values can get screwed up.
Now all the columns are numeric.
Also I’d like to encode the response variable into a factor variable of 1’s and 0’s. Though, this is only an optional step.
So whenever the Class
is malignant
, it will be 1 else it will be 0. Then, I am converting it into a factor.
bc$Class <- ifelse(bc$Class == "malignant", 1, 0)bc$Class <- factor(bc$Class, levels = c(0, 1))
The response variable Class
is now a factor variable and all other columns are numeric.
Alright, the classes of all the columns are set. Let’s proceed to the next step.
How to deal with Class Imbalance?
Before building the logistic regressor, you need to randomly split the data into training and test samples.
Since the response variable is a binary categorical variable, you need to make sure the training data has approximately equal proportion of classes.
table(bc$Class)#> benign malignant #> 444 239
クラス「良性」と「悪性」は、およそ1:2の割合で分かれています。
明らかにクラスのアンバランスがあります。 したがって、ロジット モデルを構築する前に、1 と 0 の両方がほぼ同じ割合になるようにサンプルを構築する必要があります。
- Down Sampling
- Up Sampling
- SMOTE と ROSE を使用した Hybrid Sampling といういくつかのテクニックで通常処理されます。
では、ダウンサンプリングとアップサンプリングとは何ですか?
7.アップサンプリングとダウンサンプリングでクラスの不均衡を扱う方法
ダウンサンプリングでは、大多数のクラスが小さいクラスと同じサイズになるようにランダムにダウンサンプリングされる。 同様にアップサンプリングでは、少数クラス、つまりmalignant
の行が多数クラス(benign
)と同じサイズになるまで何度も繰り返しサンプリングされます。
では、caretパッケージを読み込んで、createDataPartition
関数を使用してトレーニングデータセットの行番号を生成しています。 p=.70
を設定することで、70%の行がtrainData
の中に入り、残りの30%がtestData
に入るようにしました。
table(trainData$Class)
良性のサンプルは約2倍あります。 そこで、caret
パッケージのdownSample
関数を使ってダウンサンプルしてみます。
これを行うには、XとYの変数を引数として与えるだけです。
これで良性と悪性が同じ比率になりました。
%ni%
は%in%
関数の否定で、ここではClass
列を除くすべての列を選択するために使用しました。
downSample
関数は要因変数として「y」を必要とし、これが元のデータでクラスを要因に変換した理由です。
素晴らしい! では、upSample
関数を使ってアップサンプリングをしてみましょう。 downSample
と同様の構文です。
予想通り、良性と悪性が同じ比率になりました。
次のステップでは、ダウンサンプルしたバージョンのデータセットを使ってロジットモデルを構築します。
Building the Logistic Regression Model
テストデータセットでの予測方法
logitmod
は構築完了しました。
pred <- predict(logitmod, newdata = testData, type = "response")
ここで、pred
は各オブザベーションの悪性である確率を含んでいます。
なお、ロジスティック回帰を使う場合、予測確率を計算するためにtype='response'
を設定する必要があることに注意してください。 この引数は線形回帰の場合には必要ありません。
一般的には確率のカットオフ値を0.5とすることが多いようです。 Yの確率が> 0.5であれば、イベント(悪性)に分類できます。
つまり、predが0.5より大きければ悪性であり、それ以外は良性です。
y_pred_num <- ifelse(pred > 0.5, 1, 0)y_pred <- factor(y_pred_num, levels=c(0, 1))y_act <- testData$Class
ここで、y_pred
がy_act
と一致する割合以外の何でもない精度(a accuracy)を算出してみましょう。
mean(y_pred == y_act)
ここで、94%の精度があります。
Why handling with class imbalance is important?
Alright I promised I will tell you why you need to take care of class imbalance early.なぜクラスの不均衡に注意しなければならないかをお話しします。 それを理解するために、Y 値の 95% が良性クラスに属し、5% が悪性クラスに属するデータセットがあるとします。
もし私がすべてのデータポイントを良性とやみくもに予測したならば、95% の精度パーセントを達成するでしょう。 これはかなり高いように聞こえます。 しかし、明らかにそれは欠陥があります。 重要なのは、悪性クラスをどれだけうまく予測できるかです。
つまり、良性と悪性のクラスがバランスされている必要があり、その上で、私の予測モデルを改善するために、より洗練された精度測定とモデル評価メトリックが必要なのです。
フル コード
結論
この投稿では、R でバイナリ応答変数を分類するために、いつ、どのようにロジスティック回帰を使用するかを見ました。
組織の与えられた塊が悪性か良性かを判断することが目標だった BreastCancer
データセットに基づく例で、これを見ました。 実際には、半分もありません。 なぜなら、モデルの有効性を判断する評価指標の範囲は広大であり、正しいモデルを選択するためには慎重な判断が必要だからです。 次のパートでは、分類モデルの性能をさまざまな観点から理解するのに役立つ、さまざまな評価指標について説明します
。