ロゞスティック回垰を理解する

ロゞスティック回垰を理解する

この蚘事では、倉換の理論蚈算を分析したす。 線圢回垰関数 в 逆ロゞット倉換関数 (ロゞスティック応答関数ずも呌ばれたす)。 次に、歊噚庫を䜿甚しお、 最尀法、ロゞスティック回垰モデルに埓っお、損倱関数を導き出したす。 物流損倱、蚀い換えれば、ロゞスティック回垰モデルで重みベクトルのパラメヌタが遞択される関数を定矩したす。 ロゞスティック回垰を理解する.

蚘事の抂芁:

  1. XNUMX ぀の倉数間の線圢関係を繰り返しおみたしょう
  2. 倉革の必芁性を特定したしょう 線圢回垰関数 ロゞスティック回垰を理解する в ロゞスティック応答関数 ロゞスティック回垰を理解する
  3. 倉換しお出力しおみたしょう ロゞスティック応答関数
  4. パラメヌタを遞択するずきに最小二乗法がなぜ悪いのかを理解しおみたしょう ロゞスティック回垰を理解する 機胜 物流損倱
  5. を䜿甚しおおりたす 最尀法 決定したす パラメヌタ遞択機胜 ロゞスティック回垰を理解する:

    5.1. ケヌス 1: 機胜 物流損倱 クラス指定のあるオブゞェクトの堎合 0 О 1:

    ロゞスティック回垰を理解する

    5.2. ケヌス 2: 機胜 物流損倱 クラス指定のあるオブゞェクトの堎合 -1 О +1:

    ロゞスティック回垰を理解する


この蚘事には簡単な䟋が豊富に蚘茉されおおり、すべおの蚈算は口頭たたは玙で簡単に行うこずができたすが、堎合によっおは電卓が必芁になる堎合もありたす。 だから準備をしおください:)

この蚘事は䞻に、機械孊習の基瀎に関する初期レベルの知識を持぀デヌタ サむ゚ンティストを察象ずしおいたす。

この蚘事では、グラフを描画したり蚈算したりするためのコヌドも提䟛したす。 すべおのコヌドは蚀語で曞かれおいたす python 2.7。 䜿甚するバヌゞョンの「新芏性」に぀いお事前に説明しおおきたす。これは、よく知られおいるコヌスを受講するための条件の XNUMX ぀です。 ダンデックス 同様に有名なオンラむン教育プラットフォヌム䞊で Coursera, そしお、ご想像のずおり、この教材はこのコヌスに基づいお䜜成されたした。

01. 盎線䟝存性

線圢䟝存性ずロゞスティック回垰はそれずどのような関係があるのでしょうか?ずいう質問をするのは非垞に合理的です。

それは簡単です ロゞスティック回垰は、線圢分類噚に属するモデルの XNUMX ぀です。 簡単に蚀えば、線圢分類噚のタスクはタヌゲット倀を予枬するこずです。 ロゞスティック回垰を理解する 倉数から (リグレッサヌ) ロゞスティック回垰を理解する。 特性間の䟝存関係があるず考えられおいたす。 ロゞスティック回垰を理解する ず目暙倀 ロゞスティック回垰を理解する 線圢。 したがっお、分類噚の名前は線圢です。 非垞に倧たかに蚀うず、ロゞスティック回垰モデルは、特性間に線圢関係があるずいう仮定に基づいおいたす。 ロゞスティック回垰を理解する ず目暙倀 ロゞスティック回垰を理解する。 これが぀ながりです。

スタゞオに最初の䟋がありたす。これは、正しくは、研究察象の量の盎線䟝存性に関するものです。 蚘事を準備する過皋で、すでに倚くの人を䞍安にさせおいる䟋、぀たり電流ず電圧の䟝存関係に遭遇したした。 (「応甚回垰分析」、N. ドレむパヌ、G. スミス)。 ここでも芋おいきたす。

に応じお オヌムの法則:

ロゞスティック回垰を理解するどこ ロゞスティック回垰を理解する - 珟圚の匷さ、 ロゞスティック回垰を理解する - 電圧、 ロゞスティック回垰を理解する - 抵抗。

私たちが知らなかったら オヌムの法則を倉曎するこずで、経隓的に䟝存関係を芋぀けるこずができたす。 ロゞスティック回垰を理解する そしお枬定 ロゞスティック回垰を理解する、サポヌトしながら ロゞスティック回垰を理解する 修理枈み。 次に、䟝存グラフが次のようになっおいるこずがわかりたす。 ロゞスティック回垰を理解する から ロゞスティック回垰を理解する 原点を通るほが盎線が埗られたす。 「ほが」ず蚀ったのは、この関係は実際には正確ですが、枬定倀には小さな誀差が含たれる可胜性があり、そのためグラフ䞊の点が正確に線䞊に収たらず、その呚りにランダムに点圚する可胜性があるためです。

グラフ1「䟝存性」 ロゞスティック回垰を理解する から ロゞスティック回垰を理解する»

ロゞスティック回垰を理解する

チャヌト描画コヌド

import matplotlib.pyplot as plt
%matplotlib inline

import numpy as np

import random

R = 13.75

x_line = np.arange(0,220,1)
y_line = []
for i in x_line:
    y_line.append(i/R)
    
y_dot = []
for i in y_line:
    y_dot.append(i+random.uniform(-0.9,0.9))


fig, axes = plt.subplots(figsize = (14,6), dpi = 80)
plt.plot(x_line,y_line,color = 'purple',lw = 3, label = 'I = U/R')
plt.scatter(x_line,y_dot,color = 'red', label = 'Actual results')
plt.xlabel('I', size = 16)
plt.ylabel('U', size = 16)
plt.legend(prop = {'size': 14})
plt.show()

02. 線圢回垰匏を倉換する必芁性

別の䟋を芋おみたしょう。 私たちが銀行で働いおおり、私たちの仕事は、特定の芁因に応じお借り手がロヌンを返枈する可胜性を刀断するこずであるず想像しおみたしょう。 タスクを単玔化するために、借り手の月絊ず月々のロヌン返枈額の XNUMX ぀の芁玠のみを考慮したす。

このタスクは非垞に条件付きですが、この䟋を䜿甚するず、なぜそれを䜿甚するだけでは十分でないのかがわかりたす。 線圢回垰関数、たた、その関数でどのような倉換を実行する必芁があるかを調べたす。

䟋に戻りたしょう。 絊䞎が高ければ高いほど、借り手は月々のロヌン返枈に充おるこずができる額が増えるこずが理解されおいたす。 同時に、特定の絊䞎範囲では、この関係は非垞に盎線的になりたす。 たずえば、絊䞎範囲が 60.000 RUR から 200.000 RUR であり、指定された絊䞎範囲では、月々の支払い額ず絊䞎額の䟝存関係が線圢であるず仮定したす。 指定された範囲の賃金に぀いお、絊䞎察支払比率が 3 を䞋回るこずはできず、借り手はただ 5.000 RUR の準備金を持っおいなければならないこずが刀明したずしたす。 そしおこの堎合に限り、借り手が銀行にロヌンを返枈するず仮定したす。 この堎合、線圢回垰方皋匏は次の圢匏になりたす。

ロゞスティック回垰を理解する

どこ ロゞスティック回垰を理解する, ロゞスティック回垰を理解する, ロゞスティック回垰を理解する, ロゞスティック回垰を理解する - 絊䞎 ロゞスティック回垰を理解する-番目の借り手、 ロゞスティック回垰を理解する - ロヌンの支払 ロゞスティック回垰を理解する-番目の借り手。

絊䞎ずロヌンの支払いを固定パラメヌタで方皋匏に代入する ロゞスティック回垰を理解する ロヌンを発行するか拒吊するかを決定できたす。

今埌のこずを考えるず、指定されたパラメヌタを䜿甚するず、 ロゞスティック回垰を理解する 線圢回垰関数、 で䜿われる ロゞスティック応答関数 倧きな倀が生成されるため、ロヌン返枈の確率を決定するための蚈算が耇雑になりたす。 したがっお、係数をたずえば 25.000 分の XNUMX に枛らすこずが提案されおいたす。 この係数の倉換によっおロヌン発行の決定が倉わるこずはありたせん。 この点は将来のために芚えおおいおください。しかし、ここで、私たちが話しおいるこずをさらに明確にするために、XNUMX 人の朜圚的な借り手の状況を考えおみたしょう。

è¡š 1 「朜圚的な借り手」

ロゞスティック回垰を理解する

テヌブルを生成するコヌド

import pandas as pd

r = 25000.0
w_0 = -5000.0/r
w_1 = 1.0/r
w_2 = -3.0/r

data = {'The borrower':np.array(['Vasya', 'Fedya', 'Lesha']), 
        'Salary':np.array([120000,180000,210000]),
       'Payment':np.array([3000,50000,70000])}

df = pd.DataFrame(data)

df['f(w,x)'] = w_0 + df['Salary']*w_1 + df['Payment']*w_2

decision = []
for i in df['f(w,x)']:
    if i > 0:
        dec = 'Approved'
        decision.append(dec)
    else:
        dec = 'Refusal'
        decision.append(dec)
        
df['Decision'] = decision

df[['The borrower', 'Salary', 'Payment', 'f(w,x)', 'Decision']]

衚のデヌタによるず、絊料 120.000 RUR の Vasya は、月々 3.000 RUR で返枈できるようロヌンを受け取りたいず考えおいたす。 ロヌンを承認するには、Vasya さんの絊䞎が支払額の 5.000 倍を超え、か぀ XNUMX RUR が残っおいる必芁があるず刀断したした。 Vasya は次の芁件を満たしおいたす。 ロゞスティック回垰を理解する。 106.000RURも残っおいたす。 にもかかわらず、蚈算するず、 ロゞスティック回垰を理解する 私たちは確率を䞋げたした ロゞスティック回垰を理解する 25.000 回実行しおも結果は同じで、ロヌンは承認できたした。 フェディアもロヌンを受け取るこずになるが、リヌシャは、圌が最も倚くを受け取っおいるずいう事実にもかかわらず、圌の食欲を抑えなければならないだろう。

この堎合のグラフを描いおみたしょう。

図衚「借入先の分類」

ロゞスティック回垰を理解する

グラフを描画するコヌド

salary = np.arange(60000,240000,20000)
payment = (-w_0-w_1*salary)/w_2


fig, axes = plt.subplots(figsize = (14,6), dpi = 80)
plt.plot(salary, payment, color = 'grey', lw = 2, label = '$f(w,x_i)=w_0 + w_1x_{i1} + w_2x_{i2}$')
plt.plot(df[df['Decision'] == 'Approved']['Salary'], df[df['Decision'] == 'Approved']['Payment'], 
         'o', color ='green', markersize = 12, label = 'Decision - Loan approved')
plt.plot(df[df['Decision'] == 'Refusal']['Salary'], df[df['Decision'] == 'Refusal']['Payment'], 
         's', color = 'red', markersize = 12, label = 'Decision - Loan refusal')
plt.xlabel('Salary', size = 16)
plt.ylabel('Payment', size = 16)
plt.legend(prop = {'size': 14})
plt.show()

したがっお、関数に埓っお構築された盎線は、 ロゞスティック回垰を理解する、「悪い」借り手ず「良い」借り手を区別したす。 欲望ず胜力が䞀臎しない借り手はラむンを䞊回っおいたすが (Lesha)、モデルのパラメヌタによればロヌンを返枈できる借り手はラむンを䞋回っおいたす (Vasya ず Fedya)。 蚀い換えれば、私たちの盎系は借り手を XNUMX ぀のクラスに分けおいるず蚀えたす。 それらを次のように衚したす。 ロゞスティック回垰を理解する ロヌンを返枈する可胜性が最も高い借り手を次のように分類したす。 ロゞスティック回垰を理解する たたは ロゞスティック回垰を理解する ロヌンを返枈できない可胜性が高い借り手も含めたす。

この簡単な䟋から埗た結論をたずめおみたしょう。 ポむントを芋おみたしょう ロゞスティック回垰を理解する そしお、点の座暙を察応する盎線の方皋匏に代入したす。 ロゞスティック回垰を理解する、次の XNUMX ぀のオプションを怜蚎しおください。

  1. 点が線の䞋にあり、それをクラスに割り圓おる堎合 ロゞスティック回垰を理解する、次に関数の倀 ロゞスティック回垰を理解する からプラスになりたす ロゞスティック回垰を理解する ЎП ロゞスティック回垰を理解する。 これは、ロヌンを返枈できる確率が以䞋であるず仮定できるこずを意味したす。 ロゞスティック回垰を理解する。 関数の倀が倧きいほど、確率が高くなりたす。
  2. 点が線の䞊にあり、それをクラスに割り圓おる堎合 ロゞスティック回垰を理解する たたは ロゞスティック回垰を理解するの堎合、関数の倀は負の倀になりたす。 ロゞスティック回垰を理解する ЎП ロゞスティック回垰を理解する。 次に、借金返枈の確率が以䞋であるず仮定したす。 ロゞスティック回垰を理解する そしお、関数の絶察倀が倧きいほど、信頌床は高くなりたす。
  3. 点は XNUMX ぀のクラス間の境界䞊の盎線䞊にありたす。 この堎合、関数の倀は ロゞスティック回垰を理解する 等しくなりたす ロゞスティック回垰を理解する そしおロヌンを返枈する確率は次のずおりです ロゞスティック回垰を理解する.

さお、XNUMX ぀ではなく数十、XNUMX ぀ではなく数千の借り手がいるず想像しおみたしょう。 次に、盎線の代わりに次のようになりたす。 m次元 平面ず係数 ロゞスティック回垰を理解する 私たちは䜕もないずころから導き出されるのではなく、すべおのルヌルに埓っお、ロヌンを返枈したたたは返枈しおいない借り手に関する蓄積されたデヌタに基づいお導き出されたす。 そしお実際、珟圚、既知の係数を䜿甚しお借り手を遞択しおいるこずに泚意しおください。 ロゞスティック回垰を理解する。 実際、ロゞスティック回垰モデルのタスクはたさに​​パラメヌタを決定するこずです。 ロゞスティック回垰を理解する、損倱関数の倀は 物流損倱 最小限に抑える傟向になりたす。 ただし、ベクトルの蚈算方法に぀いおは、 ロゞスティック回垰を理解する、詳しくは蚘事の 5 番目のセクションで説明したす。 その間に、私たちは玄束の地、銀行家ず圌の XNUMX 人の顧客の元に戻りたす。

機胜のおかげで ロゞスティック回垰を理解する 私たちは誰に融資が可胜で、誰に融資を拒吊する必芁があるかを知っおいたす。 しかし、そのような情報を持っおディレクタヌに行くこずはできたせん。圌らは私たちから各借り手のロヌン返枈の可胜性を知りたかったからです。 䜕をするか 答えは簡単です。䜕らかの方法で関数を倉換する必芁がありたす。 ロゞスティック回垰を理解する、その倀は範囲内にありたす ロゞスティック回垰を理解する 倀が範囲内にある関数に ロゞスティック回垰を理解する。 そしおそのような関数が存圚し、それは呌ばれたす ロゞスティック応答関数たたは逆ロゞット倉換。 䌚う

ロゞスティック回垰を理解する

どのように機胜するかを段階的に芋おみたしょう ロゞスティック応答関数。 反察方向に歩くこずに泚意しおください。 からの範囲にある確率倀がわかっおいるず仮定したす。 ロゞスティック回垰を理解する ЎП ロゞスティック回垰を理解する 次に、この倀を次の数倀範囲党䜓に「巻き戻し」たす。 ロゞスティック回垰を理解する ЎП ロゞスティック回垰を理解する.

03. ロゞスティック応答関数を導出する

ステップ 1. 確率倀を範囲に倉換する ロゞスティック回垰を理解する

関数の倉換䞭 ロゞスティック回垰を理解する в ロゞスティック応答関数 ロゞスティック回垰を理解する 信甚アナリストのこずはそのたたにしお、代わりにブックメヌカヌのツアヌに参加したす。 いいえ、もちろん、賭けはしたせん。私たちが興味を持っおいるのは、その匏の意味だけです。たずえば、チャンスは 4 察 1 です。すべおのベッタヌにずっおおなじみのオッズは、「成功」ず「」の比率です。倱敗」。 確率の甚語では、オッズずは、むベントが発生する確率をむベントが発生しない確率で割ったものです。 出来事が起こる確率の蚈算匏を曞いおみたしょう ロゞスティック回垰を理解する:

ロゞスティック回垰を理解する

どこ ロゞスティック回垰を理解する - 事象が発生する確率、 ロゞスティック回垰を理解する — むベントが発生しない確率

たずえば、「ノェテロク」ずいうあだ名の若くお匷くお遊び心のある銬が、レヌスで「マチルダ」ずいう名前のたるんだ幎老いた老婊人に勝぀確率が次のずおりであるずしたす。 ロゞスティック回垰を理解するの堎合、「Veterok」の成功確率は次のようになりたす。 ロゞスティック回垰を理解する к ロゞスティック回垰を理解する ロゞスティック回垰を理解する 逆も同様で、オッズがわかれば、確率を蚈算するのは難しくありたせん。 ロゞスティック回垰を理解する:

ロゞスティック回垰を理解する

したがっお、私たちは確率をチャンスに「倉換」するこずを孊びたした。 ロゞスティック回垰を理解する ЎП ロゞスティック回垰を理解する。 もう䞀歩進んで、確率を次の数盎線党䜓に「倉換」する方法を孊びたしょう。 ロゞスティック回垰を理解する ЎП ロゞスティック回垰を理解する.

ステップ 2. 確率倀を範囲に倉換する ロゞスティック回垰を理解する

このステップは非垞に簡単です。オッズの察数をオむラヌ数の底に求めたす。 ロゞスティック回垰を理解する そしお次のようになりたす:

ロゞスティック回垰を理解する

これで、次のこずがわかりたす。 ロゞスティック回垰を理解する、倀を蚈算したす ロゞスティック回垰を理解する 非垞にシンプルで、さらにポゞティブなものになるはずです。 ロゞスティック回垰を理解する。 これは本圓です。

奜奇心から、どうなるかを確認しおみたしょう ロゞスティック回垰を理解するの堎合、負の倀が衚瀺されるこずが期埅されたす。 ロゞスティック回垰を理解する。 私たちは以䞋をチェックしたす: ロゞスティック回垰を理解する。 それは正しい。

これで、確率倀を次から倉換する方法がわかりたした。 ロゞスティック回垰を理解する ЎП ロゞスティック回垰を理解する からの数盎線党䜓に沿っお ロゞスティック回垰を理解する ЎП ロゞスティック回垰を理解する。 次のステップでは、その逆のこずを行いたす。

今のずころ、察数の法則に埓っお、関数の倀がわかっおいるこずに泚意しおください。 ロゞスティック回垰を理解する、オッズを蚈算できたす。

ロゞスティック回垰を理解する

オッズを決定するこの方法は、次のステップで圹立ちたす。

ステップ 3. を決定するための匏を導き出したしょう ロゞスティック回垰を理解する

それで私たちは孊び、知りたした ロゞスティック回垰を理解する、関数倀を怜玢したす ロゞスティック回垰を理解する。 しかし、実際には、たったく逆のこずが必芁です。぀たり、䟡倀を知るこずです。 ロゞスティック回垰を理解する 芋぀ける ロゞスティック回垰を理解する。 これを行うには、次のような逆オッズ関数などの抂念に目を向けたしょう。

ロゞスティック回垰を理解する

この蚘事では、䞊蚘の匏を導き出したせんが、䞊蚘の䟋の数倀を䜿甚しお確認したす。 オッズは 4 察 1 (ロゞスティック回垰を理解する)、むベントが発生する確率は 0.8 (ロゞスティック回垰を理解する。 眮き換えおみたしょう: ロゞスティック回垰を理解する。 これは、以前に実行した蚈算ず䞀臎したす。 次ぞ移りたしょう。

最埌のステップで次のように掚枬したした。 ロゞスティック回垰を理解するこれは、逆オッズ関数で眮換を行うこずができるこずを意味したす。 我々が埗る

ロゞスティック回垰を理解する

分子ず分母の䞡方を次の倀で割りたす。 ロゞスティック回垰を理解する次に

ロゞスティック回垰を理解する

念のため、どこにも間違いがないかを確認するために、もう 2 回小さなチェックを行いたす。 ステップ XNUMX では、 ロゞスティック回垰を理解する ず刀断した ロゞスティック回垰を理解する。 次に、倀を代入したす ロゞスティック回垰を理解する ロゞスティック応答関数に代入するず、次の結果が埗られるず期埅されたす。 ロゞスティック回垰を理解する。 眮き換えるず次のようになりたす。 ロゞスティック回垰を理解する

読者の皆さん、おめでずうございたす。ロゞスティック応答関数を導出し、テストしたした。 関数のグラフを芋おみたしょう。

グラフ3「ロゞスティック応答関数」

ロゞスティック回垰を理解する

グラフを描画するコヌド

import math

def logit (f):
    return 1/(1+math.exp(-f))

f = np.arange(-7,7,0.05)
p = []

for i in f:
    p.append(logit(i))

fig, axes = plt.subplots(figsize = (14,6), dpi = 80)
plt.plot(f, p, color = 'grey', label = '$ 1 / (1+e^{-w^Tx_i})$')
plt.xlabel('$f(w,x_i) = w^Tx_i$', size = 16)
plt.ylabel('$p_{i+}$', size = 16)
plt.legend(prop = {'size': 14})
plt.show()

文献では、この関数の名前を次のように芋぀けるこずもできたす。 シグモむド関数。 このグラフは、オブゞェクトがクラスに属する確率の䞻な倉化が比范的狭い範囲内で発生するこずを明確に瀺しおいたす。 ロゞスティック回垰を理解する、どこかから ロゞスティック回垰を理解する ЎП ロゞスティック回垰を理解する.

信甚アナリストに戻っお、ロヌン返枈の可胜性の蚈算を手䌝っおもらうこずをお勧めしたす。そうしないず、ボヌナスなしで取り残される危険がありたす:)

è¡š 2 「朜圚的な借り手」

ロゞスティック回垰を理解する

テヌブルを生成するコヌド

proba = []
for i in df['f(w,x)']:
    proba.append(round(logit(i),2))
    
df['Probability'] = proba

df[['The borrower', 'Salary', 'Payment', 'f(w,x)', 'Decision', 'Probability']]

そこで、ロヌン返枈の確率を求めたした。 䞀般に、これは真実であるようです。

実際、絊䞎が 120.000 RUR の Vasya が毎月 3.000 RUR を銀行に枡すこずができる確率は 100% に近いです。 ずころで、銀行の方針で、たずえばロヌン返枈の確率がたずえば 0.3 を超える顧客ぞの融資を芏定しおいる堎合、銀行は Lesha に融資を実行できるこずを理解する必芁がありたす。 ただ、この堎合、銀行は起こり埗る損倱に備えおより倧きな匕圓金を䜜成したす。

たた、絊䞎察支払比率は少なくずも 3 で、5.000 RUR のマヌゞンが䞊限から匕かれおいるこずにも泚意しおください。 したがっお、重みのベクトルを元の圢匏で䜿甚するこずはできたせんでした。 ロゞスティック回垰を理解する。 係数を倧幅に枛らす必芁があり、この堎合は各係数を 25.000 で陀算したした。぀たり、結果を調敎したした。 ただし、これは特に初期段階での内容の理解を容易にするために行われたした。 人生では、係数を発明したり調敎したりする必芁はなく、係数を芋぀ける必芁がありたす。 この蚘事の次のセクションでは、パラメヌタを遞択するための方皋匏を導き出したす。 ロゞスティック回垰を理解する.

04. 重みベクトルを決定するための最小二乗法 ロゞスティック回垰を理解する ロゞスティック応答関数で

重みのベクトルを遞択するこの方法はすでに知っおいたす ロゞスティック回垰を理解するずしお 最小二乗法 (LSM) 実際、二項分類問題でそれを䜿甚しおみおはいかがでしょうか? 確かに、䜿甚を劚げるものは䜕もありたせん MNC、分類問題ではこの方法のみが、以䞋の方法よりも粟床の䜎い結果をもたらしたす。 物流損倱。 これには理論的根拠がありたす。 たず簡単な䟋を XNUMX ぀芋おみたしょう。

私たちのモデルを䜿甚するず、 MSE О 物流損倱) すでに重みのベクトルの遞択を開始しおいたす ロゞスティック回垰を理解する そしおある段階で蚈算を䞭止したした。 䞭間、最埌、たたは最初のいずれであっおも、重芁なこずは、重みのベクトルの倀がすでにいく぀かあるずいうこずです。このステップでは、重みのベクトルは ロゞスティック回垰を理解する 䞡方のモデルに違いはありたせん。 次に、結果の重みを取埗しお次のように代入したす。 ロゞスティック応答関数 (ロゞスティック回垰を理解する) クラスに属するオブゞェクトの堎合 ロゞスティック回垰を理解する。 遞択した重みベクトルに埓っお、モデルが非垞に間違っおいる堎合ずその逆の XNUMX ぀のケヌスを調べたす。モデルは、オブゞェクトがそのクラスに属しおいるず匷く確信しおいたす。 ロゞスティック回垰を理解する。 䜿甚した堎合にどのような眰金が課されるのか芋おみたしょう MNC О 物流損倱.

䜿甚される損倱関数に応じおペナルティを蚈算するコヌド

# класс Пбъекта
y = 1
# верПятМПсть ПтМесеМОя Пбъекта к классу в сППтветствОО с параЌетраЌО w
proba_1 = 0.01

MSE_1 = (y - proba_1)**2
print 'Ктраф MSE прО грубПй ПшОбке =', MSE_1

# МапОшеЌ фуМкцОю Ўля вычОслеМОя f(w,x) прО ОзвестМПй верПятМПстО ПтМесеМОя Пбъекта к классу +1 (f(w,x)=ln(odds+))
def f_w_x(proba):
    return math.log(proba/(1-proba)) 

LogLoss_1 = math.log(1+math.exp(-y*f_w_x(proba_1)))
print 'Ктраф Log Loss прО грубПй ПшОбке =', LogLoss_1

proba_2 = 0.99

MSE_2 = (y - proba_2)**2
LogLoss_2 = math.log(1+math.exp(-y*f_w_x(proba_2)))

print '**************************************************************'
print 'Ктраф MSE прО сОльМПй увереММПстО =', MSE_2
print 'Ктраф Log Loss прО сОльМПй увереММПстО =', LogLoss_2

倱敗䟋 — モデルはオブゞェクトをクラスに割り圓おたす ロゞスティック回垰を理解する 0,01の確率で

䜿甚時のペナルティ MNC になりたす
ロゞスティック回垰を理解する

䜿甚時のペナルティ 物流損倱 になりたす
ロゞスティック回垰を理解する

匷い自信の事䟋 — モデルはオブゞェクトをクラスに割り圓おたす ロゞスティック回垰を理解する 0,99の確率で

䜿甚時のペナルティ MNC になりたす
ロゞスティック回垰を理解する

䜿甚時のペナルティ 物流損倱 になりたす
ロゞスティック回垰を理解する

この䟋は、重倧な゚ラヌの堎合、損倱関数が ログロス モデルに以䞋のペナルティを倧幅に課す MSE。 ここで、損倱関数を䜿甚する理論的背景が䜕であるかを理解したしょう。 ログロス 分類問題で。

05. 最尀法ずロゞスティック回垰

冒頭で玄束したように、この蚘事には簡単な䟋が豊富にありたす。 スタゞオには、別の䟋ず叀いゲスト、銀行の借り手、ノァシャ、フェディア、レシャがいたす。

念のため、䟋を開発する前に、私たちは人生においお、数十たたは数癟の特城を持぀数千たたは数癟䞇のオブゞェクトのトレヌニング サンプルを扱っおいるこずを思い出させおください。 ただし、ここでの数倀は、初心者のデヌタ サむ゚ンティストの頭に簡単に収たるように取られおいたす。

䟋に戻りたしょう。 アルゎリズムがリヌシャにはロヌンを発行しないように指瀺したにもかかわらず、銀行の取締圹が困っおいる人党員にロヌンを発行するこずを決定したず想像しおみたしょう。 そしお今、十分な時間が経過し、XNUMX 人の英雄のうち誰がロヌンを返枈し、誰が返枈しなかったのかがわかりたした。 予想されおいたこずノァシャずフェディアはロヌンを返枈したしたが、リヌシャは返枈したせんでした。 ここで、この結果が私たちにずっお新しいトレヌニング サンプルになるず想像しおみたしょう。同時に、あたかもロヌン返枈の可胜性に圱響を䞎える芁玠 (借り手の絊䞎、毎月の支払い額) に関するすべおのデヌタが消えたかのようです。 次に、盎感的には、借り手の XNUMX 人に XNUMX 人が銀行にロヌンを返枈しないず仮定できたす。蚀い換えれば、次の借り手がロヌンを返枈する確率は次のずおりです。 ロゞスティック回垰を理解する。 この盎感的な仮定には理論的な裏付けがあり、以䞋に基づいおいたす。 最尀法、文献ではよくこう呌ばれおいたす。 最尀原理.

たず、抂念的な装眮に぀いお理解したしょう。

サンプリングの尀床 たさにそのようなサンプルが埗られる確率、぀たりたさにそのような芳察/結果が埗られる確率です。 各サンプル結果を取埗する確率の積 (たずえば、Vasya、Fedya、Lesha のロヌンが同時に返枈されたかどうか)。

尀床関数 サンプルの可胜性を分垃パラメヌタの倀に関連付けたす。

私たちの堎合、トレヌニング サンプルは䞀般化されたベルヌヌむ スキヌムであり、確率倉数は次の XNUMX ぀の倀のみを取りたす。 ロゞスティック回垰を理解する たたは ロゞスティック回垰を理解する。 したがっお、サンプルの尀床はパラメヌタの尀床関数ずしお曞くこずができたす。 ロゞスティック回垰を理解する 次のようにしたす。

ロゞスティック回垰を理解する
ロゞスティック回垰を理解する

䞊蚘の゚ントリは次のように解釈できたす。 Vasya ず Fedya がロヌンを返枈する共同確率は次のずおりです。 ロゞスティック回垰を理解する、リヌシャがロヌンを返枈しない確率は次のずおりです。 ロゞスティック回垰を理解する (起こったのはロヌンの返枈ではないため)、したがっお、XNUMX ぀のむベントすべおの同時確率は等しいです。 ロゞスティック回垰を理解する.

最尀法 未知のパラメヌタを最倧化するこずで掚定する手法です。 尀床関数。 私たちの堎合、そのような倀を芋぀ける必芁がありたす ロゞスティック回垰を理解するどこで ロゞスティック回垰を理解する 最倧倀に達したす。

尀床関数が最倧倀に達する未知のパラメヌタの倀を探すずいう実際のアむデアはどこから来たのでしょうか? このアむデアの起源は、サンプルが母集団に぀いお私たちが利甚できる唯䞀の情報源であるずいう考えに由来しおいたす。 母集団に぀いお私たちが知っおいるすべおがサンプルに衚珟されおいたす。 したがっお、私たちが蚀えるこずは、サンプルは私たちが利甚できる母集団を最も正確に反映しおいるずいうこずだけです。 したがっお、利甚可胜なサンプルの可胜性が最も高くなるパラメヌタを芋぀ける必芁がありたす。

明らかに、私たちは関数の極倀点を芋぀ける必芁がある最適化問題を扱っおいたす。 極倀点を芋぀けるには、䞀次条件を考慮する必芁がありたす。぀たり、関数の導関数をれロに等しいずみなしお、目的のパラメヌタヌに関しお方皋匏を解く必芁がありたす。 ただし、倚数の因子の積の導関数を求めるのは時間のかかる䜜業になる可胜性があるため、これを回避するには、察数に切り替えるずいう特別なテクニックがありたす。 尀床関数。 なぜこのような移行が可胜なのでしょうか? 関数自䜓の極倀を探しおいるわけではないこずに泚意しおください。ロゞスティック回垰を理解する、および極倀点、぀たり未知のパラメヌタの倀 ロゞスティック回垰を理解するどこで ロゞスティック回垰を理解する 最倧倀に達したす。 察数は単調関数であるため、察数に移行する堎合、極倀点は倉わりたせん (極倀自䜓は異なりたすが)。

䞊蚘に埓っお、Vasya、Fedya、Lesha からのロヌンを䜿甚しお䟋を開発し続けたしょう。 たずは次ぞ進みたしょう 尀床関数の察数:

ロゞスティック回垰を理解する

これで、次のように匏を簡単に区別できたす。 ロゞスティック回垰を理解する:

ロゞスティック回垰を理解する

そしお最埌に、䞀次条件を怜蚎したす。関数の導関数をれロずみなしたす。

ロゞスティック回垰を理解する

したがっお、ロヌン返枈の確率に぀いおの盎感的な掚定は、 ロゞスティック回垰を理解する 理論的には正圓化されたした。

それはいいのですが、この情報を今どうすればいいでしょうか? 借り手の XNUMX 人に XNUMX 人が銀行にお金を返さないず仮定するず、銀行は必然的に砎産するこずになりたす。 そうですが、それはロヌン返枈の確率が以䞋ず等しいず評䟡した堎合に限りたす。 ロゞスティック回垰を理解する ロヌン返枈に圱響を䞎える芁因、぀たり借り手の絊䞎や月々の支払い額は考慮しおいたせん。 以前に、これらず同じ芁玠を考慮しお、各顧客によるロヌンの返枈確率を蚈算したこずを思い出しおください。 定数ず異なる確率が埗られたのは論理的です。 ロゞスティック回垰を理解する.

サンプルの可胜性を定矩したしょう。

サンプルの尀床を蚈算するコヌド

from functools import reduce

def likelihood(y,p):
    line_true_proba = []
    for i in range(len(y)):
        ltp_i = p[i]**y[i]*(1-p[i])**(1-y[i])
        line_true_proba.append(ltp_i)
    likelihood = []
    return reduce(lambda a, b: a*b, line_true_proba)
        
    
y = [1.0,1.0,0.0]
p_log_response = df['Probability']
const = 2.0/3.0
p_const = [const, const, const]


print 'ПравЎПпПЎПбОе выбПркО прО кПМстаМтМПЌ зМачеМОО p=2/3:', round(likelihood(y,p_const),3)

print '****************************************************************************************************'

print 'ПравЎПпПЎПбОе выбПркО прО расчетМПЌ зМачеМОО p:', round(likelihood(y,p_log_response),3)

䞀定倀でのサンプル尀床 ロゞスティック回垰を理解する:

ロゞスティック回垰を理解する

芁因を考慮しおロヌン返枈の確率を蚈算する際のサンプル尀床 ロゞスティック回垰を理解する:

ロゞスティック回垰を理解する
ロゞスティック回垰を理解する

芁因に応じお蚈算された確率を持぀サンプルの尀床は、䞀定の確率倀を持぀尀床よりも高いこずが刀明したした。 これはどういう意味ですか これは、芁因に関する知識により、各顧客のロヌン返枈の確率をより正確に遞択できるようになったずいうこずを瀺唆しおいたす。 したがっお、次の融資を実行するずきは、この蚘事のセクション 3 の最埌で提案されおいるモデルを䜿甚しお借金返枈の可胜性を評䟡するのがより正確です。

しかし、最倧化したい堎合は、 サンプル尀床関数では、Vasya、Fedya、Lesha の確率をそれぞれ 0.99、0.99、0.01 に等しくするアルゎリズムを䜿甚しおみおはいかがでしょうか。 おそらく、このようなアルゎリズムは、サンプルの尀床倀を次の倀に近づけるため、トレヌニング サンプルでうたく機胜するでしょう。 ロゞスティック回垰を理解するしかし、第䞀に、そのようなアルゎリズムは䞀般化胜力に問題がある可胜性が高く、第二に、このアルゎリズムは明らかに線圢ではありたせん。 そしお、オヌバヌトレヌニング (同様に匱い汎化胜力) に察抗する方法が明らかにこの蚘事の蚈画に含たれおいない堎合は、2.5 番目の点をさらに詳しく芋おみたしょう。 これを行うには、簡単な質問に答えるだけです。 私たちが知っおいる芁因を考慮するず、ノァシャずフェディアがロヌンを返枈する確率は同じになるでしょうか? 健党な論理の芳点から蚀えば、もちろんそうではありたせん。 したがっお、Vasyaはロヌンを返枈するために毎月絊䞎の27,8を支払い、Fedyaはほが2を支払いたす。 たた、グラフ XNUMX「クラむアントの分類」では、Vasya が Fedya よりもクラスを分ける線からはるかに離れおいるこずがわかりたす。 そしお最埌に、関数が ロゞスティック回垰を理解する Vasya ず Fedya では異なる倀が䜿甚されたす。Vasya では 4.24、Fedya では 1.0 です。 ここで、たずえば、Fedya の収入が桁違いに倚かった堎合、たたはより少ない融資を芁求した堎合、Vasya ず Fedya のロヌンを返枈する確率は同等になりたす。 蚀い換えれば、線圢䟝存性は隙されないずいうこずです。 そしお実際にオッズを蚈算しおみるず ロゞスティック回垰を理解する、そしお䜕もないずころからそれらを持ち出したわけではありたせんが、私たちの䟡倀芳は安党であるず蚀えたす。 ロゞスティック回垰を理解する 各借り手によるロヌンの返枈確率を掚定できるのが最善ですが、係数の決定は次のずおりであるず仮定するこずに同意したため、 ロゞスティック回垰を理解する すべおのルヌルに埓っお実行された堎合は、そのように仮定したす。係数を䜿甚するず、確率をより正確に掚定できたす:)

しかし、話はそれたす。 このセクションでは、重みのベクトルがどのように決定されるかを理解する必芁がありたす。 ロゞスティック回垰を理解する、各借り手によるロヌンの返枈可胜性を評䟡するために必芁です。

どのような歊噚を䜿っおオッズを探すのかを簡単にたずめおみたしょう ロゞスティック回垰を理解する:

1. 察象倉数予枬倀ず結果に圱響を䞎える芁因ずの関係は線圢であるず仮定したす。 このような理由で䜿甚されるのです 線圢回垰関数 çš® ロゞスティック回垰を理解する、その行はオブゞェクト (クラむアント) をクラスに分割したす。 ロゞスティック回垰を理解する О ロゞスティック回垰を理解する たたは ロゞスティック回垰を理解する ロヌンを返枈できる顧客ずそうでない顧客。 私たちの堎合、方皋匏の圢匏は次のずおりです。 ロゞスティック回垰を理解する.

2.䜿甚したす 逆ロゞット関数 çš® ロゞスティック回垰を理解する オブゞェクトがクラスに属する確率を決定する ロゞスティック回垰を理解する.

3. 私たちは、トレヌニングセットを䞀般化されたトレヌニングの実装ずしお考えおいたす。 ベルヌヌむ スキヌム぀たり、オブゞェクトごずに確率倉数が生成されたす。 ロゞスティック回垰を理解する (オブゞェクトごずに独自のもの) は倀 1 をずり、確率で ロゞスティック回垰を理解する - 0。

4. 最倧化するために䜕が必芁かを知っおいたす サンプル尀床関数 利甚可胜なサンプルが最も劥圓なものになるように、受け入れられおいる芁玠を考慮に入れたす。 蚀い換えれば、サンプルが最も劥圓であるず思われるパラメヌタを遞択する必芁がありたす。 この堎合、遞択したパラメヌタヌはロヌン返枈の確率です。 ロゞスティック回垰を理解する、これは未知の係数に䟝存したす ロゞスティック回垰を理解する。 したがっお、そのような重みのベクトルを芋぀ける必芁がありたす ロゞスティック回垰を理解する、この時点でサンプルの尀床が最倧になりたす。

5. 私たちは䜕を最倧化すべきかを知っおいたす サンプル尀床関数 䜿甚するこずができ 最尀法。 そしお、私たちはこの方法を䜿甚するための難しいトリックをすべお知っおいたす。

このようにしお、耇数のステップを螏む必芁があるこずがわかりたす:)

ここで、蚘事の冒頭で XNUMX 皮類の損倱関数を導出しようずしたこずを思い出しおください。 物流損倱 オブゞェクトクラスの指定方法に応じお異なりたす。 偶然にも、XNUMX ぀のクラスを含む分類問題では、クラスは次のように衚されたす。 ロゞスティック回垰を理解する О ロゞスティック回垰を理解する たたは ロゞスティック回垰を理解する。 衚蚘法に応じお、出力には察応する損倱関数が含たれたす。

ケヌス 1. オブゞェクトの分類 ロゞスティック回垰を理解する О ロゞスティック回垰を理解する

以前は、サンプルの可胜性を決定するずきに、借り手による借金返枈の確率が係数ず䞎えられた係数に基づいお蚈算されたした。 ロゞスティック回垰を理解する、次の匏を適甚したした。

ロゞスティック回垰を理解する

実際に ロゞスティック回垰を理解する 意味は ロゞスティック応答関数 ロゞスティック回垰を理解する 指定された重みベクトルに察しお ロゞスティック回垰を理解する

そうすれば、次のようにサンプル尀床関数を曞くこずを劚げるものは䜕もありたせん。

ロゞスティック回垰を理解する

䞀郚の初心者アナリストにずっお、この関数がどのように機胜するかをすぐに理解するこずが難しい堎合がありたす。 すべおを明確にする 4 ぀の短い䟋を芋おみたしょう。

1. もし ロゞスティック回垰を理解する (぀たり、トレヌニング サンプルによれば、オブゞェクトはクラス +1 に属したす)、およびアルゎリズム ロゞスティック回垰を理解する オブゞェクトをクラスに分類する確率を決定したす ロゞスティック回垰を理解する が 0.9 に等しい堎合、このサンプル尀床は次のように蚈算されたす。

ロゞスティック回垰を理解する

2. もし ロゞスティック回垰を理解するず ロゞスティック回垰を理解するの堎合、蚈算は次のようになりたす。

ロゞスティック回垰を理解する

3. もし ロゞスティック回垰を理解するず ロゞスティック回垰を理解するの堎合、蚈算は次のようになりたす。

ロゞスティック回垰を理解する

4. もし ロゞスティック回垰を理解するず ロゞスティック回垰を理解するの堎合、蚈算は次のようになりたす。

ロゞスティック回垰を理解する

尀床関数がケヌス 1 ず 3、たたは䞀般的なケヌスで、オブゞェクトをクラスに割り圓おる確率の正しく掚枬された倀で最倧化されるこずは明らかです。 ロゞスティック回垰を理解する.

オブゞェクトをクラスに割り圓おる確率を決定するずき、 ロゞスティック回垰を理解する 係数だけがわからない ロゞスティック回垰を理解する、それからそれらを探したす。 䞊で述べたように、これは最適化問題であり、最初に重みのベクトルに関する尀床関数の導関数を芋぀ける必芁がありたす。 ロゞスティック回垰を理解する。 ただし、最初に自分自身でタスクを単玔化するこずは理にかなっおいたす。察数の導関数を探したす。 尀床関数.

ロゞスティック回垰を理解する

なぜ察数の埌に、 ロゞスティック誀差関数から看板を倉曎したした。 ロゞスティック回垰を理解する Ма ロゞスティック回垰を理解する。 モデルの品質を評䟡する問題では関数の倀を最小化するのが䞀般的であるため、すべおが単玔です。匏の右蟺に次の倀を掛けたす。 ロゞスティック回垰を理解する したがっお、関数を最倧化する代わりに、関数を最小化したす。

実は今、あなたの目の前で、損倱関数が苊心しお導出されおいるのです - 物流損倱 XNUMX ぀のクラスを含むトレヌニング セットの堎合: ロゞスティック回垰を理解する О ロゞスティック回垰を理解する.

さお、係数を芋぀けるには、導関数を芋぀けるだけです。 ロゞスティック誀差関数 次に、募配降䞋法や確率的募配降䞋法などの数倀最適化手法を䜿甚しお、最適な係数を遞択したす。 ロゞスティック回垰を理解する。 ただし、この蚘事はかなりの量であるため、埮分を自分で実行するこずが提案されおいたす。あるいは、おそらくこれは、そのような詳现な䟋なしで倚くの蚈算を䌎う次の蚘事のトピックになるでしょう。

ケヌス 2. オブゞェクトの分類 ロゞスティック回垰を理解する О ロゞスティック回垰を理解する

ここでのアプロヌチはクラスの堎合ず同じです ロゞスティック回垰を理解する О ロゞスティック回垰を理解する、ただし、損倱関数の出力ぞのパス自䜓は 物流損倱、より華やかになりたす。 始めたしょう。 尀床関数には挔算子を䜿甚したす。 「もし だったら 」。 ぀たり、もし ロゞスティック回垰を理解する番目のオブゞェクトはクラスに属したす ロゞスティック回垰を理解する、次に、サンプルの尀床を蚈算するために、確率を䜿甚したす。 ロゞスティック回垰を理解する、オブゞェクトがクラスに属しおいる堎合 ロゞスティック回垰を理解するを確率に代入したす。 ロゞスティック回垰を理解する。 尀床関数は次のようになりたす。

ロゞスティック回垰を理解する

それがどのように機胜するかを指で説明しおみたしょう。 4 ぀のケヌスを考えおみたしょう。

1. もし ロゞスティック回垰を理解する О ロゞスティック回垰を理解するの堎合、サンプリング尀床は「枛少」したす。 ロゞスティック回垰を理解する

2. もし ロゞスティック回垰を理解する О ロゞスティック回垰を理解するの堎合、サンプリング尀床は「枛少」したす。 ロゞスティック回垰を理解する

3. もし ロゞスティック回垰を理解する О ロゞスティック回垰を理解するの堎合、サンプリング尀床は「枛少」したす。 ロゞスティック回垰を理解する

4. もし ロゞスティック回垰を理解する О ロゞスティック回垰を理解するの堎合、サンプリング尀床は「枛少」したす。 ロゞスティック回垰を理解する

ケヌス 1 ず 3 では、確率がアルゎリズムによっお正しく決定された堎合、次のこずが明らかです。 尀床関数 ぀たり、これはたさに私たちが埗たかったものです。 ただし、このアプロヌチは非垞に面倒なので、次に、よりコンパクトな衚蚘法を怜蚎したす。 ただし、最初に、尀床関数を最小化するので、笊号を倉曎しお察数蚈算したしょう。

ロゞスティック回垰を理解する

代わりに代甚したしょう ロゞスティック回垰を理解する 衚珟 ロゞスティック回垰を理解する:

ロゞスティック回垰を理解する

単玔な算術手法を䜿甚しお、察数の䞋の正しい項を単玔化し、次を取埗したしょう。

ロゞスティック回垰を理解する

今床はオペレヌタヌを排陀する時が来たした 「もし だったら 」。 オブゞェクトが ロゞスティック回垰を理解する クラスに属したす ロゞスティック回垰を理解する、察数の䞋の匏で、分母で、 ロゞスティック回垰を理解する 力を䞊げた ロゞスティック回垰を理解する、オブゞェクトがクラスに属しおいる堎合 ロゞスティック回垰を理解する、その埌 $e$ がべき乗されたす ロゞスティック回垰を理解する。 したがっお、床の衚蚘は、䞡方のケヌスを XNUMX ぀に組み合わせるこずで簡略化できたす。 ロゞスティック回垰を理解する。 それから ロゞスティック誀差関数 次の圢匏になりたす:

ロゞスティック回垰を理解する

察数の法則に埓っお、分数をひっくり返しお蚘号を出したす。ロゞスティック回垰を理解する" (マむナス) 察数の堎合、次のようになりたす。

ロゞスティック回垰を理解する

ここに損倱関数がありたす 物流損倱、クラスにオブゞェクトが割り圓おられたトレヌニング セットで䜿甚されたす。 ロゞスティック回垰を理解する О ロゞスティック回垰を理解する.

さお、この時点で䌑暇を取り、この蚘事を終わりたす。

ロゞスティック回垰を理解する 著者の過去の著䜜は「線圢回垰方皋匏を行列圢匏に倉換する」です。

補助材料

1. 文孊

1) 応甚回垰分析 / N. Draper、G. Smith - 第 2 版– M.: 財務ず統蚈、1986 (英語からの翻蚳)

2) 確率論ず数理統蚈 / V.E. グムルマン - 第 9 版- M.: 高等孊校、2003 幎

3) 確率論 / N.I. チェルノバ - ノボシビルスク: ノボシビルスク州立倧孊、2007

4) ビゞネス分析: デヌタから知識ぞ / Paklin N. B.、Oreshkov V. I. - 第 2 版— サンクトペテルブルク: ピヌタヌ、2013

5) デヌタ サむ゚ンス れロからのデヌタ サむ゚ンス / Joel Gras - サンクトペテルブルク: BHV Petersburg、2017

6) デヌタ サむ゚ンス スペシャリストのための実践統蚈 / P. ブルヌス、E. ブルヌス - サンクトペテルブルク: BHV Petersburg、2018

2. 講挔・講座動画

1) 最尀法の本質、ボリス・デメシェフ

2) 連続ケヌスにおける最尀法、Boris Demeshev

3) ロゞスティック回垰。 オヌプン ODS コヌス、ナヌリヌ・カシニツキヌ

4) 講矩 4、゚フゲニヌ・゜コロフ (ビデオの 47 分より)

5) ロゞスティック回垰、ノャチェスラフ・ボロンツォフ

3. むンタヌネット゜ヌス

1) 線圢分類および回垰モデル

2) ロゞスティック回垰を簡単に理解する方法

3) ロゞスティック誀差関数

4) 独立したテストずベルヌヌむの公匏

5) MMPのバラヌド

6) 最尀法

7) 察数の公匏ず性質

8) なぜ番号を付けるのか ロゞスティック回垰を理解する?

9) 線圢分類噚

出所 habr.com

コメントを远加したす