無料の 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技術研究と政府と企業の協力の進捗状況の概要

ブログ    

推薦する

新しい研究:医療AIが新たな統合失調症患者の治療効果をほぼ盲検で評価

1月12日、新たな研究により、統合失調症患者の治療で医師を支援するために使用されるコンピューターアル...

テクノロジー | 12人の専門家が2021年の人工知能の発展動向について語る

2020年が終わり、2021年が始まりました!私たちは最近、人工知能の専門家たちにインタビューし、2...

ディープフィードフォワードシーケンスメモリニューラルネットワークに基づく大語彙連続音声認識

【51CTO.comオリジナル記事】まとめ本研究では、ディープフィードフォワードシーケンスメモリニュ...

アンドリュー・ン:AIはビッグデータから「スモールデータ」に移行する時が来た

AI界の巨匠アンドリュー・ン氏が最近、新型コロナウイルスの検査で陽性反応を示し、多くのネットユーザー...

COVID-19 最新情報: COVID-19 との戦いに役立つトップ 10 のイノベーション

[[320870]]迅速な感染検査から3Dプリントソリューションまで、世界中のテクノロジー企業が協力...

...

英国、心臓発作予測の精度向上のため新たな人工知能アルゴリズムを開発

心臓発作を事前に予測することは困難です。 17日のサイエンス誌によると、英国ノッティンガム大学の科学...

ディープラーニングのこれらの概念をすべて理解できましたか? TF、TLT、TRT、DS

最近、NVIDIA GPU 製品や SDK を使用してディープラーニングを学習している学生に多く出会...

ディープラーニングと通常の機械学習の違いは何ですか?

[[212077]]本質的に、ディープラーニングは、ディープニューラルネットワーク構造(多くの隠れ...

機械学習の次元削減手法で「次元の呪い」を打破する

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

人工知能は「教育革命」を起こしている

人工知能は教育分野に大きな波を起こしている。この傾向は、北京師範大学とiFLYTEKが共催した「人工...

2018年、ブロックチェーンは監査人の仕事を破壊するでしょうか?

電卓が普及した後、そろばんの使い方しか知らなかった会計士は失業した。ゴールドマン・サックスは最盛期に...

データ構造の8つの一般的なソートアルゴリズム

[[172688]]序文8 つのソート アルゴリズムと 3 つの検索アルゴリズムは、データ構造におけ...

...