ロジスティック回帰(クラス分類編)Python機械学習scikit-learnはじめにロジスティック回帰は、説明変数の情報にもとづいてデータがどのクラスに属するかを予測・分類する(例:ある顧客が商品を買うか買わないかを識別する)注目している出来事が発生する確率を予測する(例:ある顧客が何%の確率で商品を買うか予測する)ために利用されるモデルです。この記事では、Scikit-learnライブラリを使い、ロジスティック回帰によりクラス分類を行う方法を備忘録として書いておきます。ついてScikit-learnは、Pythonの機械学習ライブラリの一つです。故障しないクラスに分ける)。単純なアルゴリズムなので実装しやすい一方で、特徴量空間(説明変数となるデータがある空間)が線形分離可能な場合のみ高い性能を発揮します。線形分離可能とは、説明変数が二次元平面上にあるとすると、あるクラスに対応する説明変数(の値の集合)と、他のクラスに対応する説明変数(の値の集合)を、一本の直線を挟んで隔てることができることを言います。書くことができ、正事象の起こりやすさを表します。オッズの対数をとったものが、対数オッズです。学習することが目的です。ロジスティック回帰を利用するときに関心があるのは、説明変数の値を与えたときの正事象の確率$p$です。\frac{1}{1+\exp(-\sum^m_{i=0}w_ix_i)}となります。学習後、この式を利用して説明変数の値が与えられたときの正事象の確率を求めることができ、その確率が一定値以上であれば正事象のクラスに分類することができます。利用するメソッドは以下の通りです。公開されている、アヤメの品種データを使います。ライブラリに付属のデータセットを読み込んでいます。簡単のため、2品種に絞るデータを覗いてみると、こんな感じです。iris_df.head()各変数(データ項目)の説明は以下の通りです。各変数の値の関係を見てみましょう。以下のコードでは、各変数の関係を可視化する散布図行列をプロットしています。品種ごとの、がく片と花弁の長さおよび幅の値と品種の関係が見て取れます。3行3列目のグラフに着目すると、花弁の長さ(petal_length)が小さい場合の品種はversicolorであり、大きい場合の品種はvirginicaに分類できそうです。hue='species')plt.show()以降では、花弁の長さ(petal_length)を使って品種を分類するロジスティック回帰モデルを構築します。ロジスティック回帰モデルの構築ロジスティック回帰モデルのインスタンスを作成し、fitメソッドで説明変数の重みを学習することで、ロジスティック回帰モデルを構築します。ここでは、品種versicolorをクラス0に、品種virginicaをクラス1としており、scikit-learnライブラリのmodel_selection.train_test_splitメソッドで、データをモデル構築用データ(学習データ)と予測精度検証用データ(検証データ)に分割し、学習データをfitメソッドの引数として与え、ロジスティック回帰モデルを構築しています。上のコードでは省略していますが、ロジスティック回帰のインスタンスを作成する際、いくつかパラメータを設定することができます(下記は、指定できるパラメータの一部)。正則化の方法を指定するパラメータ。'l1'か'l2'を指定する。'l1'を指定した場合はL1正則化、'l2'を指定した場合はL2正則化を行う(デフォルト値は'l2')。L1正則化は多くの説明変数の重みが0になるようにし、特徴選択の手法としても使用される。L2正則化は説明変数の重みが大きくなりすぎるのを防ぎ、過学習を回避するために利用される。正則化の強さを指定するパラメータ。正の値を指定する(デフォルト値は1.0)。Cの値が小さいほど正則化の強さが増す。乱数生成器のシードを指定するパラメータ。数値(int型)かRandomStateインスタンスを指定する。モデルの再現性を担保するために、適当な値を指定しておいたほうがよい。coef_属性に格納されます。学習結果を確認すると、係数は約0.74、切片は約-3.39であることがわかります。[-3.39483004]このモデルに対し、検証データの説明変数の値を引数としてpredictメソッドを実行すると、それぞれの検証データが属するクラスが予測できます。0]ロジスティック回帰モデルの性能評価クラス分類の性能評価には、主に以下のような指標が用いられます。下記のコードのように、scikit-learn.metricsライブラリの各種メソッドでこれらの指標の値を算出できます。matrix)正解率(accuracy)適合率(precision)再現率(recall)F1スコア(F1-score)AUC(曲線下面積)混同行列とは、実際のクラスが0,1のデータに対して、クラス0,1に分類されたデータの個数を要素とする行列です。「真・偽」は「分類が当たっているか」を表し、「陽性・陰性」は「クラス1・クラス0」を表します。偽陰性は、予測されたクラスは陰性だが分類が間違っていることを表します。正解率とは、分類したデータの総数のうち、正しく分類されたデータ数の割合です。式で書くと、(TP+TN)/(TP+FN+FP+TN)です。適合率とは、クラス1に分類されたデータのうち、実際にクラス1であるデータ数の割合です。式で書くと、TP/(TP+FP)です。再現率とは、実際にクラス1であるデータのうち、クラス1に分類されたデータ数の割合です。式で書くと、TP/(TP+FN)です。F1スコアは、適合率と再現率の調和平均で定義されます。一般に、適合率と再現率はトレードオフの関係にあるため、F1スコアはこれらのバランスを評価するための指標とみることができます。Characteristic)曲線の下側の面積で、この値が大きいほど分類性能がよいことを示す指標です(最大値は1)。Rate)をとった、モデルの分類性能を示した曲線です。クラス分類では、各データがクラス1に属する確率(スコア)を算出し、スコアが閾値を上回っていればデータをクラス1に分類します。したがって、その閾値を変化させると、偽陽性率(実際はクラス0だが誤ってクラス1に分類されるデータの割合)と真陽性率(実際にクラス1で正しくクラス1に分類される確率)が変化します。閾値を大きい値から小さい値に変化させていくと、スコアが大きいデータから順にクラス1に分類されるようになります。その結果、ROC曲線の下側の面積であるAUCの値が大きくなります。したがって、AUCは、実際にクラス1のデータに対するスコアが大きめに予測され、実際にクラス0のデータに対するスコアは低めに予測されているかを評価する指標といえます。下記のようなコードでROC曲線を描画し、AUCを算出することができます。rate')plt.show()また、下記のコードでは、ROC曲線を省略してAUCの値だけを取得しています。0.975実際にどの指標を利用してクラス分類の性能評価を行うべきかは、クラス分類により何を達成したいか・何を検証したいかという課題設定に依存します。実際にクラス1に属するデータが数%しかない状況でクラス1に属するデータを当てたい(例:故障する機器の特定・CVする顧客の特定など)場合、正解率を指標として利用するのは不適当です。その理由は、どんなデータに対してもクラス0と予測してしまえば、99%に近い正解率を得られるためです。おわりにこの記事では、scikit-learnライブラリでロジスティック回帰モデルを構築し、クラス分類の性能評価をする方法について簡単に触れました。requestStockLike44@0NE_shoT_新人データ分析コンサルタントとして働いています。仕事では大手企業のWebマーケティング施策に資するデータ分析をしています。upLoginユーザーは見つかりませんでした。