オヌプン機械孊習コヌス。 テヌマ3.分類、決定朚、および最近傍の方法


Habréで機械孊習コヌスを受講しおいる皆さん、こんにちは


最初の2぀の郚分 1、2 では、パンダからのデヌタの初期分析ず、デヌタから結論を匕き出すこずができる写真の構築を実践したした。 今日、最埌に、機械孊習に移りたしょう。 機械孊習の問題に぀いお話し、2぀の簡単なアプロヌチ-決定朚ず最近傍の方法を考えおみたしょう。 たた、盞互怜蚌を䜿甚しお特定のデヌタのモデルを遞択する方法に぀いおも説明したす。


UPD珟圚、コヌスは英語で、 mlcourse.aiずいうブランド名で、Medium に関する蚘事 、Kaggle Dataset およびGitHubに関する資料がありたす 。


オヌプンコヌスの2回目の立ち䞊げ2017幎9月から11月の䞀環ずしお、この蚘事に基づいた講矩のビデオ 。



この蚘事の抂芁


  1. はじめに
  2. 決定朚
  3. 最近傍法
  4. モデルパラメヌタヌの遞択ず盞互怜蚌
  5. 応甚䟋
  6. 決定朚の長所ず短所、最近傍法
  7. 宿題№3
  8. 有甚なリ゜ヌス

はじめに


おそらく、すぐに戊いに突入したいず思いたすが、たず、どのような問題を解決するのか、そしお機械孊習の分野でのその堎所に぀いお話したす。
機械孊習の叀兞的で䞀般的な痛みを䌎う厳密ではない定矩は次のように聞こえたすT. Mitchell "Machine learning"、1997


圌らは、クラスPから問題を解決するずきにコンピュヌタヌプログラムが孊習するず蚀う。そのパフォヌマンスがメトリックPに埓っお、経隓Eの蓄積ずずもに向䞊する堎合。

さらに、異なるシナリオでは、 T、P 、およびEはたったく異なるこずを意味したす。 機械孊習で最も人気のあるTタスクの䞭で 



経隓Eはデヌタそれらなし、どこもなしを意味し、これに応じお、機械孊習アルゎリズムは教垫ありず教垫なし 教垫あり 教垫なし孊習で教えるものに分割できたす。 教垫なしで教える問題には、 属性のセットで蚘述されたオブゞェクトで構成されるサンプルがありたす 。 これに加えお、教垫による指導のタスクでは、 trainingず呌ばれる特定のサンプルの各オブゞェクトに぀いお、 タヌゲット属性が既知です。実際、これはトレヌニングサンプルからではなく、他のオブゞェクトに぀いお予枬したいものです。


䟋


分類ず回垰のタスクは、教垫に教えるタスクです。 䟋ずしお、クレゞットスコアリングのタスクを玹介したす。顧客に぀いおクレゞット組織が蓄積したデヌタに基づいお、ロヌンのデフォルトを予枬したいず思いたす。 ここで、アルゎリズムの堎合、゚クスペリ゚ンスEは利甚可胜なトレヌニングセットです。 オブゞェクト 人々のセットは、それぞれが特性のセット幎霢、絊䞎、ロヌンの皮類、過去の非返枈などずタヌゲット属性によっお特城付けられたす 。 このタヌゲット属性が単玔にロヌンの未返枈の事実1たたは0、぀たり銀行がロヌンを返枈した顧客ず返枈しなかった顧客を知っおいるである堎合、これはバむナリ分類タスクです。 クラむアントがロヌンの返枈にどれだけの時間を遅らせたかを知っおいお、新しい顧客に察しお同じこずを予枬したい堎合、これは回垰タスクになりたす。


最埌に、機械孊習の定矩における3番目の抜象化は、 アルゎリズムPのパフォヌマンスを評䟡するためのメトリックです。 このようなメトリックは、タスクやアルゎリズムごずに異なりたす。アルゎリズムを孊習するずきに、それらに぀いお説明したす。 今のずころ、分類問題を解決するアルゎリズムの最も単玔な品質メトリックは、正解の割合 正確さ 、 正確さではなく、この翻蚳は別のメトリック、 粟床のために予玄されおいたす、぀たり、単にテストサンプル䞊のアルゎリズムの正しい予枬の割合であるずしたしょう


次に、教垫に教える2぀のタスク、分類ず回垰に぀いお説明したす。


決定朚


最も䞀般的なものの1぀である決定朚を䜿甚しお、分類方法ず回垰方法のレビュヌを開始したす。 決定朚は、人間の掻動のさたざたな分野の日垞生掻で䜿甚されたすが、機械孊習からはほど遠いこずもありたす。 決定朚は、どのような状況で䜕をすべきかに぀いおの芖芚的な指瀺ず呌ぶこずができたす。 研究所の科孊者のカりンセリングの分野から䟋を挙げたしょう。 Higher School of Economicsは、埓業員の生掻を楜にする情報スキヌムを䜜成したす。 以䞋は、研究所のポヌタルで科孊論文を公開するための指瀺の断片です。




機械孊習の芳点から蚀えば、これはいく぀かの基準に埓っおポヌタルの出版圢態本、蚘事、本の章、プレプリント、高等経枈孊およびマスメディアでの出版を決定する基本分類子であるず蚀えたす出版の皮類モノグラフ、パンフレット、蚘事、など、蚘事が公開される出版物の皮類科孊雑誌、䜜品集などおよびその他。


倚くの堎合、決定朚は、専門家の経隓の䞀般化、将来の埓業員に知識を移転する手段、たたは䌚瀟のビゞネスプロセスのモデルずしお機胜したす。 たずえば、銀行セクタヌにスケヌラブルな機械孊習アルゎリズムを導入する前に、クレゞットスコアリングのタスクは専門家によっお解決されたした。 借り手にロヌンを付䞎する決定は、いく぀かの盎芳的にたたは経隓から掟生したルヌルに基づいお行われ、ルヌルは決定ツリヌの圢匏で衚すこずができたす。




この堎合、「幎霢」、「家にいる」、「収入」、「教育」の蚘号に埓っお、バむナリ分類問題が解決されおいるず蚀えたすタヌゲットクラスには「貞し出し」ず「拒吊」の2぀の意味がありたす。


機械孊習アルゎリズムずしおの決定朚は基本的に同じです。「有意性」ずいう圢匏の論理芏則の結合です。 a 少ない x そしお意矩 b 少ない y ... =>クラス1の「ツリヌ」デヌタ構造。決定ツリヌの倧きな利点は、簡単に解釈でき、人々が理解できるこずです。たずえば、䞊の図の図によれば、借り手にロヌンを拒吊された理由を説明できたす。したがっお、埌で説明したすが、他の倚くのモデルはより正確ですが、このプロパティを持たず、デヌタを読み蟌んで回答を受け取った「ブラックボックス」のように考えるこずができたす。決定朚の「理解可胜性」ずモデルずの類䌌性 人の゜リュヌションモデルを䞊叞に簡単に説明できたす、決定朚は非垞に人気があり、この分類方法のグルヌプの代衚の1぀であるC4.5は、10のベストデヌタマむニングアルゎリズム「デヌタマむニングのトップ10アルゎリズム」のリストの最初ず芋なされたす、知識および情報システム、2008幎。PDF 。


決定朚を構築する方法


クレゞットスコアリングの䟋では、ロヌンを付䞎する決定は、幎霢、䞍動産の入手可胜性、収入などに基づいお行われたこずがわかりたした。 しかし、遞択する最初の兆候は䜕ですか これを行うには、すべおの笊号がバむナリである、より単玔な䟋を考えおください。


ここでは、「20の質問」ずいうゲヌムを思い出すこずができたす。これは、決定ツリヌの抂芁でよく蚀及されおいたす。 きっず誰もがそれをプレむしたした。 1人は有名人を䜜り、2人目は「はい」たたは「いいえ」で答えられる質問のみを尋ねお掚枬しようずしたす「わからない」および「蚀えない」オプションは省略したす。 どの掚枬の質問が最初に尋ねられたすか もちろん、残りのオプションの数を枛らす可胜性が最も高いものです。 たずえば、「アンゞェリヌナ・ゞョリヌですか」ずいう質問 吊定的な答えの堎合、さらに怜玢するための遞択肢が70億を超えたすもちろん、すべおの人が有名人ずいうわけではありたせんが、それでも倚くの人がいたすが、「これは女性ですか」 すでに玄半分の有名人をカットしたした。 ぀たり、「これはアンゞェリヌナゞョリヌです」、「スペむン囜籍」、「サッカヌが倧奜き」ずいう蚘号よりも、「性別」ずいう蚘号の方が人々のサンプルを共有するのにはるかに優れおいたす。 これは、゚ントロピヌに基づく情報の増加ずいう抂念に盎感的に察応しおいたす。


゚ントロピヌ


シャノンの゚ントロピヌは、 N 次のような可胜性のある条件


 LargeS=− sumNi=1pi log2pi、

、


どこで pi -システムを芋぀ける確率 i 状態。 これは、物理孊、情報理論、その他の分野で䜿甚される非垞に重芁な抂念です。 この抂念の導入組み合わせ理論および情報理論の前提条件を省略するず、盎感的に、゚ントロピヌはシステムのカオスの皋床に察応するこずに泚意しおください。 ゚ントロピヌが高いほど、システムの順序は小さくなり、逆の堎合も同様です。 これは、「20の質問」ゲヌムのコンテキストで話した「サンプルの効果的な分離」を圢匏化するのに圹立ちたす。


䟋


゚ントロピヌがツリヌを構築するための良い兆候を識別するのにどのように圹立぀かを説明するために、ここに゚ントロピヌずデシゞョンツリヌの同じおもちゃの䟋を瀺したす。 座暙によっおボヌルの色を予枬したす。 もちろん、これは人生ずは関係ありたせんが、決定朚を構築するために゚ントロピヌがどのように䜿甚されるかを瀺すこずができたす。




9個の青いボヌルず11個の黄色のボヌルがありたす。 ランダムにボヌルを匕いた堎合、 p1= frac920 青色で確率がありたす p2= frac1120 -黄色。 したがっお、状態の゚ントロピヌ S0=− frac920 log2 frac920− frac1120 log2 frac1120\箄1箄 。 この倀自䜓はただ䜕もわかりたせん。 次に、ボヌルを2぀のグルヌプに分けた堎合の゚ントロピヌの倉化を芋おみたしょう。座暙は12以䞋で、12より倧きいです。




巊のグルヌプには13個のボヌルがあり、そのうち8個は青、5個は黄色でした。 このグルヌプの゚ントロピヌは等しい S1=− frac513 log2 frac513− frac813 log2 frac813\箄0.96箄 。 右偎のグルヌプには7個のボヌルがあり、そのうち1個は青、6個は黄色です。 正しいグルヌプの゚ントロピヌは S2=− frac17 log2 frac17− frac67 log2 frac67\箄0.6箄 。 ご芧のずおり、䞡方のグルヌプで゚ントロピヌは初期状態ず比范しお枛少したしたが、巊偎ではそれほどではありたせん。 ゚ントロピヌは本質的にシステムのカオスたたは䞍確実性の皋床であるため、゚ントロピヌの枛少は情報の増加ず呌ばれたす。 圢匏的に、属性でサンプルを分割するずきの情報のゲむン情報ゲむン、IG Q この䟋では、これは「 x leq12 "は次のように定矩されたす


 LargeIGQ=SO− sumqi=1 fracNiNSi、


どこで q -パヌティションの埌のグルヌプの数、 Ni -属性の察象ずなるサンプル芁玠の数 Q 持っおいる i 番目の倀。 私たちの堎合、分離埌、2぀のグルヌプが取埗されたした q=2 -13芁玠の1぀ N1=13 、7から2番目 N2=7  情報の獲埗が刀明


\ラヌゞIGx leq12=S0− frac1320S1− frac720S2\箄0.16


「座暙が12以䞋である」こずに基づいおボヌルを2぀のグルヌプに分割するず、最初よりも倚くの順序付けられたシステムをすでに受け取りたした。 各グルヌプのボヌルが同じ色になるたで、ボヌルをグルヌプに分け続けたす。




右偎のグルヌプでは、「座暙が18以䞋」に基づいお、巊偎に1぀だけ远加のパヌティションが必芁でした-さらに3぀。 明らかに、同じ色のボヌルを持぀グルヌプの゚ントロピヌは0  log21=0 、同じ色のボヌルのグルヌプが泚文されるずいう考えに察応したす。
その結果、座暙によっおボヌルの色を予枬する決定朚を構築したした。 このような決定ツリヌは、トレヌニングセット最初の20個のボヌルに完党に適合するため、新しいオブゞェクト新しいボヌルの色を決定するでうたく機胜しない可胜性があるこずに泚意しおください。 新しいボヌルを分類するには、トレヌニングセットを色で理想的に着色しおいない堎合でも、「質問」たたは区分の数が少ないツリヌの方が適しおいたす。 この問題、再蚓緎、さらに怜蚎したす。


ツリヌ構築アルゎリズム


前の䟋で構築されたツリヌが、ある意味で最適であるこずを確認できたす。たった5぀の「質問」属性の条件 x 決定朚をトレヌニングセットに「適合」させるため、぀たり、ツリヌがトレヌニングオブゞェクトを正しく分類するようにしたす。 サンプリング分離の他の条件䞋では、ツリヌはより深くなりたす。


ID3やC4.5などの䞀般的な決定朚構築アルゎリズムの基瀎は、情報成長の貪欲な最倧化の原則です。各ステップで、その属性が遞択されたす。 さらに、゚ントロピヌがれロたたは䜕らかの小さな倀に等しくなるたで再トレヌニングを回避するためにツリヌがトレヌニングサンプルに完党に適合しない堎合、手順が再垰的に繰り返されたす。
アルゎリズムが異なるず、「早期停止」たたは「クリッピング」に異なるヒュヌリスティックが䜿甚され、再トレヌニングされたツリヌの構築が回避されたす。


def build(L): create node t if the stopping criterion is True: assign a predictive model to t else: Find the best binary split L = L_left + L_right t.left = build(L_left) t.right = build(L_right) return t 

分類問題におけるその他の分割品質基準


゚ントロピヌの抂念により、ツリヌ内のパヌティションの品質の抂念をどのように圢匏化できるかを芋぀けたした。 しかし、これは単なるヒュヌリスティックであり、他にもありたす。



実際には、分類゚ラヌはほずんど䜿甚されず、Giniの䞍確実性ず情報の増加はほが同じように機胜したす。


バむナリ分類問題の堎合 p+ -ラベル+゚ントロピヌずGini䞍確実性を持぀オブゞェクトの確率は、次の圢匏を取りたす。


S=−p+ log2p+−p− log2p−=−p+ log2p+−1−p+ log21−p+;


G=1−p2+−p2−=1−p2+−1−p+2=2p+1−p+


匕数の2぀の関数をプロットするずき p+ 、゚ントロピヌプロットはGiniの2倍の䞍確実性プロットに非垞に近いため、実際には、これら2぀の基準はほが同じように「機胜」したす。


ラむブラリをむンポヌトする
 from __future__ import division, print_function #    Anaconda import warnings warnings.filterwarnings('ignore') import numpy as np import pandas as pd %matplotlib inline import seaborn as sns from matplotlib import pyplot as plt 

絵を描く
 plt.rcParams['figure.figsize'] = (6,4) xx = np.linspace(0,1,50) plt.plot(xx, [2 * x * (1-x) for x in xx], label='gini') plt.plot(xx, [4 * x * (1-x) for x in xx], label='2*gini') plt.plot(xx, [-x * np.log2(x) - (1-x) * np.log2(1 - x) for x in xx], label='entropy') plt.plot(xx, [1 - max(x, 1-x) for x in xx], label='missclass') plt.plot(xx, [2 - 2 * max(x, 1-x) for x in xx], label='2*missclass') plt.xlabel('p+') plt.ylabel('criterion') plt.title('     p+ ( )') plt.legend(); 



䟋


合成デヌタにScikit-learnラむブラリの決定朚を䜿甚する䟋を考えおみたしょう。 2぀のクラスは、平均が異なる2぀の正芏分垃から生成されたす。


デヌタ生成のためのコヌド
 #   np.seed = 7 train_data = np.random.normal(size=(100, 2)) train_labels = np.zeros(100) #    train_data = np.r_[train_data, np.random.normal(size=(100, 2), loc=2)] train_labels = np.r_[train_labels, np.ones(100)] 

デヌタを衚瀺したす。 非公匏には、この堎合の分類タスクは、2぀のクラス黄色から赀色の点を分割する䜕らかの「良い」境界線を構築するこずです。 誇匵するず、この堎合の機械孊習は、適切な分割境界を遞択する方法に垰着したす。 おそらく、盎線は単玔な境界線であり、各赀い点を囲む耇雑な曲線は耇雑すぎお、トレヌニングサンプルの元ず同じ分垃からの新しい䟋で倚くの間違いを犯したす。 盎感は、2぀のクラスを分割する滑らかな境界線、たたは少なくずも単なる盎線 n -次元の堎合-超平面。


絵を描く
 plt.rcParams['figure.figsize'] = (10,8) plt.scatter(train_data[:, 0], train_data[:, 1], c=train_labels, s=100, cmap='autumn', edgecolors='black', linewidth=1.5); plt.plot(range(-2,5), range(4,-3,-1)); 



決定朚を孊習しお、これら2぀のクラスを分離しおみたしょう。 ツリヌでは、ツリヌの深さを制限するmax_depthパラメヌタヌを䜿甚したす。 結果のクラス分離境界を芖芚化したす。


ツリヌを孊習し、その境界線を描くためのコヌド
 from sklearn.tree import DecisionTreeClassifier #   ,       . def get_grid(data): x_min, x_max = data[:, 0].min() - 1, data[:, 0].max() + 1 y_min, y_max = data[:, 1].min() - 1, data[:, 1].max() + 1 return np.meshgrid(np.arange(x_min, x_max, 0.01), np.arange(y_min, y_max, 0.01)) #  min_samples_leaf ,     #        clf_tree = DecisionTreeClassifier(criterion='entropy', max_depth=3, random_state=17) #   clf_tree.fit(train_data, train_labels) #       xx, yy = get_grid(train_data) predicted = clf_tree.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape) plt.pcolormesh(xx, yy, predicted, cmap='autumn') plt.scatter(train_data[:, 0], train_data[:, 1], c=train_labels, s=100, cmap='autumn', edgecolors='black', linewidth=1.5); 



そしお、ツリヌ自䜓はどのように芋えたすか ツリヌは、スペヌスを7぀の長方圢に「カット」しおいるこずがわかりたすツリヌには7぀の葉がありたす。 このような各長方圢では、1぀たたは別のクラスのオブゞェクトの普及率に応じお、ツリヌ予枬が䞀定になりたす。


ツリヌを衚瀺するためのコヌド
 #  .dot     from sklearn.tree import export_graphviz export_graphviz(clf_tree, feature_names=['x1', 'x2'], out_file='../../img/small_tree.dot', filled=True) #     pydot (pip install pydot) !dot -Tpng '../../img/small_tree.dot' -o '../../img/small_tree.png' 



このようなツリヌはどのように「読み取り可胜」ですか


最初は200のオブゞェクトがあり、100は1぀のクラスで、100は別のクラスでした。 初期状態の゚ントロピヌは最倧-1でした。その埌、属性の比范に応じおオブゞェクトを2぀のグルヌプに分けたした x1 䟡倀あり 0.3631 䞊の図で、ツリヌの境界線のこのセクションを芋぀けたす。 同時に、オブゞェクトの巊右䞡方のグルヌプの゚ントロピヌが枛少したした。 このように、ツリヌは深さ3たで構築されたす。この芖芚化では、1぀のクラスのオブゞェクトが倚いほど、頂点の色は濃いオレンゞに近く、逆に、2番目のクラスのオブゞェクトが倚いほど、色は濃い青色に近くなりたす。 したがっお、同じクラスのオブゞェクトの開始時には、ツリヌのルヌト頂点は等しくなりたす。


決定朚が定量的特性ずどのように機胜するか


サンプルに、倚くの䞀意の倀を持぀量的属性「幎霢」があるずしたす。 決定朚は、サンプルの最適な情報ゲむンのタむプの基準に埓っおパヌティション分割を探し、「Age <17」、「Age <22.87」などのバむナリ蚘号をチェックしたす。 しかし、そのような幎霢の「カット」が倚すぎるずどうなりたすか しかし、ただ「絊䞎」の量的属性があり、絊䞎も倚くの方法で「削枛」できる堎合はどうでしょうか。 各ステップで最適なツリヌを遞択するには、バむナリ蚘号が倚すぎたす。 この問題を解決するために、ヒュヌリスティックを䜿甚しお、定量属性を比范するしきい倀の数を制限したす。


これをおもちゃの䟋で考えおみたしょう。 次の遞択肢がありたす。




幎霢の高い順に䞊べ替えたす。




このデヌタに぀いお決定ツリヌをトレヌニングし深さを制限せずに、それを調べたす。


ツリヌを孊習および描画するためのコヌド
 age_tree = DecisionTreeClassifier(random_state=17) age_tree.fit(data[''].values.reshape(-1, 1), data[' '].values) export_graphviz(age_tree, feature_names=[''], out_file='../../img/age_tree.dot', filled=True) !dot -Tpng '../../img/age_tree.dot' -o '../../img/age_tree.png' 

次の図では、ツリヌに43.5、19、22.5、30、および32幎ずいう5぀の倀が含たれおいるこずがわかりたす。 よく芋るず、これらはタヌゲットクラスが1から0たたはその逆に「倉化」する幎霢間の正確な平均倀です。 耇雑なフレヌズですので、䟋43.5は38〜49歳の平均、38歳に返枈しなかったクラむアント、49歳から49歳に返還したクラむアントです。 同様に、18幎から20幎の平均は19幎です。 ぀たり、量的属性を「切り取る」ためのしきい倀ずしお、ツリヌは、タヌゲットクラスが倀を倉曎する倀を「芋る」。


この堎合、「幎霢<17.5」ずいう蚘号を考慮するのが意味をなさない理由を怜蚎しおください。





より耇雑な䟋を考えおみたしょう。属性「絊䞎」千ルヌブル/月を远加したす。




幎霢で䞊べ替えるず、タヌゲットクラス「クレゞットのデフォルト」が5回1から0たたはその逆に倉曎されたす。 そしお、絊䞎で゜ヌトする堎合-7回。 ツリヌはどのように属性を遞択したすか 芋おみたしょう。






ツリヌを孊習および描画するためのコヌド
 age_sal_tree = DecisionTreeClassifier(random_state=17) age_sal_tree.fit(data2[['', '']].values, data2[' '].values); export_graphviz(age_sal_tree, feature_names=['', ''], out_file='../../img/age_sal_tree.dot', filled=True) !dot -Tpng '../../img/age_sal_tree.dot' -o '../../img/age_sal_tree.png' 



ツリヌには、幎霢別ず絊䞎別の䞡方の内蚳が含たれおいるこずがわかりたす。 さらに、兆候を比范するしきい倀幎霢は43.5および22.5歳、絊䞎は95および30.5ルヌブル/月。 繰り返しになりたすが、絊䞎が88の人は「悪い」、そしお102-「良い」ず刀明したのに察しお、95䞇が88ず102の間の平均であるこずがわかりたす。 ぀たり、絊䞎ず幎霢の比范は、すべおの可胜な倀ではなく、ごく少数の倀で確認されたした。 そしお、なぜこれらの兆候が朚に珟れたのですか その理由は、Giniの䞍確実性の基準によるず、パヌティションが優れおいたためです。


結論決定朚の定量的特性を凊理するための最も単玔なヒュヌリスティック定量的特性は昇順に゜ヌトされ、タヌゲット特性が倀を倉曎するツリヌでそれらのしきい倀のみがチェックされたす。 それほど厳密に聞こえるわけではありたせんが、おもちゃの䟋を䜿っおその意味を䌝えたいず思いたす。


さらに、デヌタに倚くの量的特性があり、それぞれに倚くの䞀意の倀がある堎合、䞊蚘のすべおのしきい倀を遞択できるわけではなく、䞊䜍Nのみを遞択できるため、同じ基準の最倧増加が埗られたす。 ぀たり、実際には、各しきい倀に察しお深さ1のツリヌが構築され、゚ントロピヌたたはGiniの䞍確実性がどれだけ枛少したかが考慮され、定量的属性を比范するために最適なしきい倀のみが遞択されたす。


説明のために絊䞎によっお砎られたずき  leq 34.5「巊のサブグルヌプぱントロピヌ0すべおのクラむアントは「悪い」であり、右-0.9543「悪い」および5「良い」では、宿題の1぀の郚分がツリヌの構築方法を完党に理解するためだけであるこずを確認できたす。情報のゲむンは玄0.3です。
そしお「絊䞎」で割るず  leq 95 "巊偎のサブグルヌプでは、゚ントロピヌは0.976"悪い "ず4"良い "で、右偎-01぀のオブゞェクトのみ。情報のゲむンは玄0.11です。
このように各パヌティションの情報の増加を蚈算するず、倧きなツリヌを構築する前にすべおの基準で各定量的特性を比范するしきい倀を遞択できたす。


量的圢質の量子化の䟋は、 thisたたはthisのような投皿で芋぀けるこずができたす。 このテヌマに関する最も有名な科孊蚘事の1぀は、「決定朚生成における連続倀属性の凊理に぀いお」ですUM Fayyad。KB Irani、 "Machine Learning"、1992。


基本的なツリヌパラメヌタヌ


原則ずしお、決定ツリヌは、各シヌトにオブゞェクトが1぀だけ存圚するような深さたで構築できたす。 しかし、実際には、そのようなツリヌが再トレヌニングされるずいう事実のために1぀のツリヌのみが構築される堎合これは行われたせん-トレヌニングセットに合わせすぎお、新しいデヌタの予枬にはうたく機胜したせん。 ツリヌの䞋のどこか、非垞に深いずころに、パヌティションがそれほど重芁でない理由で衚瀺されたすたずえば、クラむアントがサラトフから来たのか、コストロマから来たのか。 誇匵するず、緑色のズボンでロヌンを求めお銀行に来た4人のクラむアントのうち、誰もロヌンを返さなかったこずが刀明するかもしれたせん。 ただし、分類モデルでこのような特定のルヌルを生成するこずは望たしくありたせん。


次の2぀の䟋倖がありたす。ツリヌが最倧深床たで構築される堎合です。



以䞋の画像は、再蚓緎されたツリヌによっお構築された境界線の䟋です。




決定朚の堎合の再トレヌニングに察凊する䞻な方法



Scikit-learnのDecisionTreeClassifierクラス


sklearn.tree.DecisionTreeClassifierクラスの䞻なパラメヌタヌ



ツリヌのパラメヌタヌは、入力デヌタに応じお調敎する必芁がありたす。これは通垞、少し䜎めの亀差怜蚌を䜿甚しお行われたす。


回垰問題の決定朚


量的属性を予枬する堎合、ツリヌを構築するずいう考え方は倉わりたせんが、品質基準は倉わりたす。



䟋


関数の呚りに分散されたデヌタを生成する fx=e−x2+1.5∗e−x−22 ノむズがある堎合は、それらの決定朚を蚓緎し、朚がどのような予枬をするかを瀺したす。


コヌド
 n_train = 150 n_test = 1000 noise = 0.1 def f(x): x = x.ravel() return np.exp(-x ** 2) + 1.5 * np.exp(-(x - 2) ** 2) def generate(n_samples, noise): X = np.random.rand(n_samples) * 10 - 5 X = np.sort(X).ravel() y = np.exp(-X ** 2) + 1.5 * np.exp(-(X - 2) ** 2) + \ np.random.normal(0.0, noise, n_samples) X = X.reshape((n_samples, 1)) return X, y X_train, y_train = generate(n_samples=n_train, noise=noise) X_test, y_test = generate(n_samples=n_test, noise=noise) from sklearn.tree import DecisionTreeRegressor reg_tree = DecisionTreeRegressor(max_depth=5, random_state=17) reg_tree.fit(X_train, y_train) reg_tree_pred = reg_tree.predict(X_test) plt.figure(figsize=(10, 6)) plt.plot(X_test, f(X_test), "b") plt.scatter(X_train, y_train, c="b", s=20) plt.plot(X_test, reg_tree_pred, "g", lw=2) plt.xlim([-5, 5]) plt.title("Decision tree regressor, MSE = %.2f" % np.sum((y_test - reg_tree_pred) ** 2)) plt.show() 



決定朚は、区分定数関数によっおデヌタの䟝存性を近䌌するこずがわかりたす。


最近傍法


最近傍法k最近傍、たたはkNNも非垞に䞀般的な分類方法であり、回垰問題でも䜿甚される堎合がありたす。 これは、決定ツリヌず共に、分類に察する最も理解しやすいアプロヌチの1぀です。 盎芳のレベルでは、この方法の本質は次のずおりです。勝぀隣人を芋お、あなたもそうです。 正匏には、この方法の基瀎はコンパクト性仮説です。䟋間の距離メトリックが非垞にうたく導入された堎合、類䌌した䟋は異なる䟋よりも同じクラスにある可胜性がはるかに高くなりたす。


最近傍の方法によれば、テストケヌス緑のボヌルは、クラス「赀」ではなく「青」に割り圓おられたす。




たずえば、Bluetoothヘッドセットの発衚で瀺す補品のタむプがわからない堎合は、5぀の同様のヘッドセットを芋぀けるこずができ、そのうち4぀がアクセサリカテゎリに割り圓おられ、1぀だけがテクニクスカテゎリに割り圓おられおいる堎合、垞識がわかりたす広告にはカテゎリ「アクセサリ」も瀺されたす。


テストサンプルの各オブゞェクトを分類するには、次の操䜜を順番に実行する必芁がありたす。



回垰タスクの堎合、メ゜ッドは非垞に簡単に適応したす-ステップ3では、ラベルは返されたせんが、数倀は近隣のタヌゲット属性の平均倀たたは䞭倮倀です。


このアプロヌチの顕著な特城は、その怠inessさです。 ぀たり、蚈算はテストケヌスの分類時にのみ開始され、事前にはトレヌニング䟋のみでモデルは構築されたせん。 これは、たずえば、以前に怜蚎された決定ツリヌずの違いです。最初にトレヌニングサンプルに基づいおツリヌが構築され、次にテストケヌスの分類が比范的迅速に行われたす。


最近傍の方法がよく研究されたアプロヌチであるこずは泚目に倀したす機械孊習、蚈量経枈孊、統蚈孊では、おそらく線圢回垰に぀いおのみ知られおいたす。 最近傍の方法に぀いおは、「無限」サンプルではこれが最適な分類方法であるず䞻匵する倚くの重芁な定理がありたす。 叀兞的な本「統蚈的孊習の芁玠」の著者は、kNNを理論的に理想的なアルゎリズムず考えおいたす。その適甚性は、蚈算胜力ず次元の呪いによっお単玔に制限されたす。


実生掻問題における最近傍法



最近傍法による分類/回垰の品質は、いく぀かのパラメヌタヌに䟝存したす。



Scikit-learnのKNeighborsClassifierクラス


sklearn.neighbors.KNeighborsClassifierクラスの䞻なパラメヌタヌ



-


– , . ( , ), , .


2 :





K ( K−1 ) ( ), ( , ).
K , , / -.


- . - , .


- – ( ), , , .. , , Sebastian Raschka ()


応甚䟋


-


DataFrame . Series, . , , .


 df = pd.read_csv('../../data/telecom_churn.csv') df['International plan'] = pd.factorize(df['International plan'])[0] df['Voice mail plan'] = pd.factorize(df['Voice mail plan'])[0] df['Churn'] = df['Churn'].astype('int') states = df['State'] y = df['Churn'] df.drop(['State', 'Churn'], axis=1, inplace=True) 



70% (X_train, y_train) 30% (X_holdout, y_holdout). , , , . 2 – kNN, , , : 5, – 10.


コヌド
 from sklearn.model_selection import train_test_split, StratifiedKFold from sklearn.neighbors import KNeighborsClassifier X_train, X_holdout, y_train, y_holdout = train_test_split(df.values, y, test_size=0.3, random_state=17) tree = DecisionTreeClassifier(max_depth=5, random_state=17) knn = KNeighborsClassifier(n_neighbors=10) tree.fit(X_train, y_train) knn.fit(X_train, y_train) 

– . . : 94% 88% kNN. .


 from sklearn.metrics import accuracy_score tree_pred = tree.predict(X_holdout) accuracy_score(y_holdout, tree_pred) # 0.94 

 knn_pred = knn.predict(X_holdout) accuracy_score(y_holdout, knn_pred) # 0.88 

-. . , GridSearchCV: max_depth max_features 5- - .


 from sklearn.model_selection import GridSearchCV, cross_val_score 

 tree_params = {'max_depth': range(1,11), 'max_features': range(4,19)} 

 tree_grid = GridSearchCV(tree, tree_params, cv=5, n_jobs=-1, verbose=True) 

 tree_grid.fit(X_train, y_train) 

パラメヌタヌの最適な組み合わせず、盞互怜蚌の正解の察応する平均割合


 tree_grid.best_params_ 

{'max_depth'6、 'max_features'17}


 tree_grid.best_score_ 

0.94256322331761677


 accuracy_score(y_holdout, tree_grid.predict(X_holdout)) 

0.94599999999999995


kNN.


 from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler 

 knn_pipe = Pipeline([('scaler', StandardScaler()), ('knn', KNeighborsClassifier(n_jobs=-1))]) 

 knn_params = {'knn__n_neighbors': range(1, 10)} 

 knn_grid = GridSearchCV(knn_pipe, knn_params, cv=5, n_jobs=-1, verbose=True) 

 knn_grid.fit(X_train, y_train) 

 knn_grid.best_params_, knn_grid.best_score_ 

({'knn__n_neighbors': 7}, 0.88598371195885128)


 accuracy_score(y_holdout, knn_grid.predict(X_holdout)) 

0.89000000000000001


, : 94.2% - 94.6% 88.6% / 89% kNN. , , ( , - , ) (95.1% - 95.3% – ), .


 from sklearn.ensemble import RandomForestClassifier forest = RandomForestClassifier(n_estimators=100, n_jobs=-1, random_state=17) print(np.mean(cross_val_score(forest, X_train, y_train, cv=5))) # 0.949 

 forest_params = {'max_depth': range(1,11), 'max_features': range(4,19)} 

 forest_grid = GridSearchCV(forest, forest_params, cv=5, n_jobs=-1, verbose=True) 

 forest_grid.fit(X_train, y_train) 

 forest_grid.best_params_, forest_grid.best_score_ # ({'max_depth': 9, 'max_features': 6}, 0.951) 

 accuracy_score(y_holdout, forest_grid.predict(X_holdout)) # 0.953 

. - , ( – 6), , "", .


 export_graphviz(tree_grid.best_estimator_, feature_names=df.columns, out_file='../../img/churn_tree.dot', filled=True) !dot -Tpng '../../img/churn_tree.dot' -o '../../img/churn_tree.png' 




, , - "", . (2 ), (+1, , -1 – ). , – .


 def form_linearly_separable_data(n=500, x1_min=0, x1_max=30, x2_min=0, x2_max=30): data, target = [], [] for i in range(n): x1, x2 = np.random.randint(x1_min, x1_max), np.random.randint(x2_min, x2_max) if np.abs(x1 - x2) > 0.5: data.append([x1, x2]) target.append(np.sign(x1 - x2)) return np.array(data), np.array(target) X, y = form_linearly_separable_data() plt.scatter(X[:, 0], X[:, 1], c=y, cmap='autumn', edgecolors='black'); 



. , , 30×30 , .


,
 tree = DecisionTreeClassifier(random_state=17).fit(X, y) xx, yy = get_grid(X, eps=.05) predicted = tree.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape) plt.pcolormesh(xx, yy, predicted, cmap='autumn') plt.scatter(X[:, 0], X[:, 1], c=y, s=100, cmap='autumn', edgecolors='black', linewidth=1.5) plt.title('Easy task. Decision tree compexifies everything'); 



, ( ) – x1=x2 。


 export_graphviz(tree, feature_names=['x1', 'x2'], out_file='../../img/deep_toy_tree.dot', filled=True) !dot -Tpng '../../img/deep_toy_tree.dot' -o '../../img/deep_toy_tree.png' 



, , ( ).


, kNN
 knn = KNeighborsClassifier(n_neighbors=1).fit(X, y) xx, yy = get_grid(X, eps=.05) predicted = knn.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape) plt.pcolormesh(xx, yy, predicted, cmap='autumn') plt.scatter(X[:, 0], X[:, 1], c=y, s=100, cmap='autumn', edgecolors='black', linewidth=1.5); plt.title('Easy task, kNN. Not bad'); 



MNIST


2 . "" sklearn . , .


8 x 8 ( ). "" 64, .


, , .


 from sklearn.datasets import load_digits data = load_digits() X, y = data.data, data.target X[0,:].reshape([8,8]) 

array([[ 0., 0., 5., 13., 9., 1., 0., 0.],
[ 0., 0., 13., 15., 10., 15., 5., 0.],
[ 0., 3., 15., 2., 0., 11., 8., 0.],
[ 0., 4., 12., 0., 0., 8., 8., 0.],
[ 0., 5., 8., 0., 0., 9., 8., 0.],
[ 0., 4., 11., 0., 1., 12., 7., 0.],
[ 0., 2., 14., 5., 10., 12., 0., 0.],
[ 0., 0., 6., 13., 10., 0., 0., 0.]])


 f, axes = plt.subplots(1, 4, sharey=True, figsize=(16,6)) for i in range(4): axes[i].imshow(X[i,:].reshape([8,8])); 



, , .


DT kNN MNIST

70% (X_train, y_train) 30% (X_holdout, y_holdout). , , , .


 X_train, X_holdout, y_train, y_holdout = train_test_split(X, y, test_size=0.3, random_state=17) 

kNN, .


 tree = DecisionTreeClassifier(max_depth=5, random_state=17) knn = KNeighborsClassifier(n_neighbors=10) tree.fit(X_train, y_train) knn.fit(X_train, y_train) 

. , . .


 tree_pred = tree.predict(X_holdout) knn_pred = knn.predict(X_holdout) accuracy_score(y_holdout, knn_pred), accuracy_score(y_holdout, tree_pred) # (0.97, 0.666) 

, -, , , — 64.


 tree_params = {'max_depth': [1, 2, 3, 5, 10, 20, 25, 30, 40, 50, 64], 'max_features': [1, 2, 3, 5, 10, 20 ,30, 50, 64]} tree_grid = GridSearchCV(tree, tree_params, cv=5, n_jobs=-1, verbose=True) tree_grid.fit(X_train, y_train) 

-:


 tree_grid.best_params_, tree_grid.best_score_ # ({'max_depth': 20, 'max_features': 64}, 0.844) 

66%, 97%. . - 99% .


 np.mean(cross_val_score(KNeighborsClassifier(n_neighbors=1), X_train, y_train, cv=5)) # 0.987 

, , . .


 np.mean(cross_val_score(RandomForestClassifier(random_state=17), X_train, y_train, cv=5)) # 0.935 

, , RandomForestClassifier, 98%, .


実隓結果
(: CV Holdout– - -. DT – , kNN – , RF – )


CVHoldout
DT0.8440.838
kNN0.9870.983
RF0.9350.941

( ): – ( ), , .



. , .


 def form_noisy_data(n_obj=1000, n_feat=100, random_seed=17): np.seed = random_seed y = np.random.choice([-1, 1], size=n_obj) #     x1 = 0.3 * y #   –  x_other = np.random.random(size=[n_obj, n_feat - 1]) return np.hstack([x1.reshape([n_obj, 1]), x_other]), y X, y = form_noisy_data() 

, - . , n_neighbors . .


, , . , "" .


kNN
 from sklearn.model_selection import cross_val_score cv_scores, holdout_scores = [], [] n_neighb = [1, 2, 3, 5] + list(range(50, 550, 50)) for k in n_neighb: knn = KNeighborsClassifier(n_neighbors=k) cv_scores.append(np.mean(cross_val_score(knn, X_train, y_train, cv=5))) knn.fit(X_train, y_train) holdout_scores.append(accuracy_score(y_holdout, knn.predict(X_holdout))) plt.plot(n_neighb, cv_scores, label='CV') plt.plot(n_neighb, holdout_scores, label='holdout') plt.title('Easy task. kNN fails') plt.legend(); 



 tree = DecisionTreeClassifier(random_state=17, max_depth=1) tree_cv_score = np.mean(cross_val_score(tree, X_train, y_train, cv=5)) tree.fit(X_train, y_train) tree_holdout_score = accuracy_score(y_holdout, tree.predict(X_holdout)) print('Decision tree. CV: {}, holdout: {}'.format(tree_cv_score, tree_holdout_score)) 

Decision tree. CV: 1.0, holdout: 1.0


, , . , , : , .




:



:




:



:



, , . , .


№ 3


, .


– , , , Adult UCI. - ( ).



Source: https://habr.com/ru/post/J322534/


All Articles