無料の Python 機械学習コース パート 4: ロジスティック回帰アルゴリズム

無料の Python 機械学習コース パート 4: ロジスティック回帰アルゴリズム

ロジスティック回帰は、前世紀以来人気の手法です。カテゴリ変数と 1 つ以上の独立変数間の関係を確立します。この関係は、機械学習でカテゴリ変数の結果を予測するために使用されます。医療分野、貿易・ビジネス、テクノロジーなど、さまざまな分野で広く使用されています。

この記事では、バイナリ分類アルゴリズムの開発と、Kaggle の心臓病データセットへのその実装について説明します。

[[359397]]

問題の説明

この記事では、人口の健康データを含む Kaggle のデータセットを使用します。最後に、心臓病があるかどうかが記載された欄があります。私たちの目標は、表の他の列を使用して、ある人が心臓病を患うかどうかを予測できるかどうかを確認することです。

ここでデータセットを読み込みます。これには Pandas を使用します:

  1. pandasをpdとしてインポートする
  2. numpyをnpとしてインポートする
  3. df = pd .read_csv('Heart.csv')
  4. df.head()

データセットは次のようになります。

> Haert.csvデータセットの上位5行

データセットの最後の列を見てください。 「AHD」です。これは心臓の状態を示しています。残りの列を使用して心臓病を予測します。したがって、将来的には、すべてのデータを入手できれば、医療検査を行わなくても、ある人が心臓病を患っているかどうかを予測できるようになります。

出力は 0 または 1 のいずれかになります。私たちのアルゴリズムは、心臓病がある場合は 1 を返し、心臓病がない場合は 0 を返します。

重要な方程式

線形回帰式を暗記します。直線の非常に基本的な公式: Y = A + BX

ここで、A は切片、B は傾きです。この式で「切片」Aを使用しない場合、式は次のようになります: Y = BX

伝統的に、機械学習では、


ここで、「h」は仮説または予測値であり、X は予測変数または入力変数です。 Theta は最初にランダムに初期化され、その後更新されます。

ロジスティック回帰の場合、この単純な仮定をシグモイド関数(0 から 1 までの値を返す)を使用して変換する必要があります。シグモイド関数はロジスティック関数とも呼ばれます。ロジスティック回帰では、シグモイド関数を使用して出力を予測します。これはシグモイド活性化関数です。


z は、ランダムに初期化された項 theta を乗算した入力特徴です。

ここで、X は入力特徴であり、theta はこのアルゴリズムで更新されるランダムに初期化された値です。

ロジスティック関数を使用する必要がある理由は、ロジスティック関数の曲線が次のようになるためです。

> 著者による画像

上の画像からわかるように、0 から 1 の間の値が返されます。したがって、これは分類に非常に役立ちます。今日は二値分類を行うので、

論理関数によって返される値が 0.5 未満の場合は 0 を返し、論理関数によって返される値が 0.5 以上の場合は 1 を返します。

(1)コスト関数

コスト関数は、予測された出力 (計算された仮説「h」) が元の出力 (データセットの「AHD」列) とどの程度異なるかを測定します。

ロジスティック回帰のコスト関数について詳しく説明する前に、線形回帰のコスト関数の方がはるかに単純であることを思い出してください。線形回帰のコストは次のとおりです。


どこ、

yは元のラベル(データセットの「AND」列)

平均コスト関数は次のとおりです。


ここで、mはトレーニングデータの数である。

上記の式では、まず予測ラベル「h」と元のラベル「y」の差を考慮します。この式には負の値を避けるために二乗が含まれており、その二乗を最適化するために 1/2 が使用されます。

線形回帰では単純な線形方程式 (Y = A + BX) が使用されるため、この簡単な方程式は線形回帰に適しています。

しかし、ロジスティック回帰では線形ではないシグモイド関数が使用されます。

この単純なコスト関数はグローバル最小値に収束しないため、ここでは使用できません。この問題を解決するには、コスト関数がグローバル最小値に収束するように、log を使用してコスト関数を正規化します。

これは、グローバル最小値を保証するために使用するコスト関数です。

  • y = 1の場合、cost(h,y) = -log(h)
  • y = 0の場合、Cost(h, y) = -log(1 — h)

簡略化された組み合わせコスト関数:

コスト関数の式は次のとおりです。


なぜこの式はこのようになるのでしょうか? y = 0 または 1 となるケースは 2 つしかありません。上記のコスト関数方程式には、次の 2 つの条件があります。

  • y * loghと
  • (1-y)*log(1-h)。

y = 0 の場合、最初の項はゼロになり、2 番目の項は log(1-h) になります。式では、先頭にマイナス記号を付けています。

y = 1 の場合、2 番目の項はゼロになり、先頭に負の符号が付いた ylogh 項のみが残ります。

これで意味が理解できたと思います!

(2)勾配降下法

ランダムに初期化されたシータ値を更新する必要があります。勾配降下方程式はまさにそれを行います。コスト関数をθに関して部分的に微分すると次のようになります。


上記の式を使用すると、勾配降下法の式は次のようになります。


ここで、アルファは学習率です。

この式を使用すると、各反復で θ の値が更新されます。 Python で Thin を実装すると、より明確になります。

さて、上記のすべての方程式を使用してアルゴリズムを開発する時が来ました。

モデル開発

ステップ 1: 仮説を立てます。

この仮定はシグモイド関数の単なる実現です。

  1. def hypothesis(X, theta):
  2. z = np .dot(シータ, XT)
  3. 1/(1+np.exp(-(z))) - 0.0000001を返す

コスト関数の次の式のため、ここでは出力から 0.0000001 を減算しました。


式が 1 に評価されると想定される場合、式の結果はゼロの対数になります。これを緩和するために、私はこの非常に小さな数値を使用することになりました。

ステップ 2: コスト関数を決定します。

  1. defコスト(X, y, theta):
  2. y1 =仮説(X, θ)
  3. -(1/len(X)) * np.sum(y*np.log(y1) + (1-y)*np.log(1-y1)) を返します。

これは、上記のコスト関数方程式の単純な実装にすぎません。

ステップ 3: シータ値を更新します。

コスト関数が最小値に達するまで、シータ値を継続的に更新する必要があります。最終的なシータ値と各反復のコストが出力として取得されるはずです。

  1. 定義gradient_descent(X, y, theta, alpha, epochs):
  2. m =長さ(X)
  3. J = [コスト(X, y, θ)]
  4. i が範囲(0, エポック)内である場合:
  5. h =仮説(X, θ)
  6. iが範囲(0, len(X.columns))内にある場合:
  7. theta[i] - = (alpha/m) * np.sum((hy)*X.iloc[:, i])
  8. J.append(コスト(X, y, theta))
  9. J, θを返す

ステップ4: 最終的な予測と精度を計算する

「gradient_descent」関数からのシータ値を使用し、シグモイド関数を使用して最終予測を計算します。次に精度を計算します。

  1. def predict(X, y, theta, alpha, エポック):
  2. J, th = gradient_descent (X, y, theta, alpha, epochs)
  3. h =仮説(X, θ)
  4. iが範囲(len(h))内にある場合:
  5. h[i] > =0.5の場合はh[i]=1、それ以外の場合は0
  6. y =リスト(y)
  7. acc = np .sum([y[i] == h[i]、i が範囲(len(y))])/len(y)
  8. Jを返す、acc

最終的な出力は、各期間のコストと精度のリストです。このモデルを実装して実際の問題を解決してみましょう。

データ前処理

データセットはすでに冒頭で示しました。しかし、便宜上、ここで再度追加しました:


データセットにはいくつかのカテゴリ機能があることに注意してください。それを数値データに変換する必要があります。

  1. df["ChestPainx"] = df.ChestPain.replace({"typical": 1, "asymptomatic": 2, "nonanginal": 3, "nontypical": 4})
  2. df["Thalx"] = df.Thal.replace({"fixed": 1, "normal":2, "reversable":3})
  3. df["AHD"] = df.AHD.replace({"はい": 1, "いいえ": 0})

偏差用の列を追加します。実数を 1 倍しても変化しないため、これは 1 列になるはずです。

  1. df = pd .concat([pd.Series(1,インデックス= df .index,名前= '00' ), df],= 1 )

入力機能と出力変数を定義します。出力列は、予測するカテゴリ列です。入力機能は、先ほど変更したカテゴリ列を除くすべての列になります。

  1. X = df .drop( columns =["名前なし: 0", "胸痛", "Thal"])
  2. y = df ["AHD"]

正確な結果を取得する

最後に、リスト内のシータ値を初期化し、結果を予測して精度を計算します。ここでは、シータ値を 0.5 に初期化します。他の任意の値に初期化できます。各特徴には対応するシータ値が必要なため、X 内の各特徴 (バイアス列を含む) に対してシータ値を初期化する必要があります。

  1. θ = [0.5]*len(X.列)
  2. J, acc =予測(X, y, theta, 0.0001, 25000)

最終的な精度は84.85%です。学習率として 0.0001 を使用し、25000 回の反復を実行しました。

これを判断するためにアルゴリズムを数回実行しました。

このプロジェクトについては、以下の GitHub リンクを確認してください。

「予測」関数は、各反復のコストのリストも返します。優れたアルゴリズムでは、反復ごとにコストが減少し続けるはずです。各反復のコストをプロットして傾向を視覚化します。

  1. %matplotlib インライン
  2. matplotlib.pyplot を plt としてインポートします。
  3. plt.figure(図のサイズ= (12, 8))
  4. plt.scatter(範囲(0, len(J)), J)
  5. plt.show()

最初はコストが急速に低下しますが、その後低下率は緩やかになります。これは完璧なコスト関数の動作です。

結論は

これがお役に立てば幸いです。初心者の場合、最初はすべての概念を理解するのは難しいでしょう。ただし、すべてのコードをノートブックで自分で実行し、出力を注意深く確認することをお勧めします。これは非常に役立ちます。このタイプのロジスティック回帰は、多くの現実世界の問題を解決するのに役立ちます。素晴らしいプロジェクトの開発にぜひご活用ください!

コードの実行中に問題が発生した場合は、コメント セクションでお知らせください。

完全なコードはここにあります:

https://github.com/rashida048/Machine-Learning-With-Python/blob/master/LogisticRegressionWithHeartDataset.ipynb

<<:  詳細 | 顔認識が蔓延していますが、あなたの顔データを奪う権利は誰にあるのでしょうか?

>>:  2020年末総括:国際AI技術研究と政府と企業の協力の進捗状況の概要

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

より賢い人工知能が人間に取って代わるのはもうすぐなのでしょうか?

人工知能の発展により、機械ははるかに賢くなりました。コンピュータプログラムさえ設定しておけば、多くの...

北京大学の学部生がチップ研究で世界大会で優勝!筆頭著者はトップクラスのEDAカンファレンスで8本の論文を発表

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

ドローンは将来のスマートシティで重要な役割を果たすだろう

「スマートシティ」という概念は何十年も前から存在していたが、その最新版では、住民の生活を向上させるた...

生成 AI とその使用例とは何ですか?

生成 AI は私たちの働き方を変える運命にある驚異的な技術ですが、それは何を実現できるのでしょうか。...

最先端技術の共有:脳の信号を音声に変換するAIアルゴリズムは、失語症の人が正常に話すことを助けることが期待されています

カリフォルニア大学サンフランシスコ校の神経科学者チームは、ネイチャー誌に最近発表した研究で、脳の活動...

...

自然言語処理がデータ分析の世界をどう変えるか

【51CTO.com クイック翻訳】自然言語処理 (NLP) は、コンピューターが人間の自然な言語を...

エッジ AI は何ができるのでしょうか?

人工知能 (AI) は、デバイスがユーザーと最も近接するインタラクションポイントでデータに基づく意思...

顔認識で間違った人物が「捕まった」ため、その人物は10日間刑務所に収監された

それはとんでもないことだ。何もしてないのに理由もなく10日間警察に拘留されるんですか? ! [[39...

Cloudera は研究から実稼働までエンタープライズ機械学習を加速します

クラウド向けに最適化された機械学習および分析のための最新プラットフォームを提供する Cloudera...

...

自動運転のためのエンドツーエンドの計画方法の概要

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

機械学習: 密度ベースの外れ値検出アルゴリズム

外れ値検出 (異常検出とも呼ばれる) は、機械学習において、予想とは大きく異なる動作をするデータ オ...

...