「非プログラマ」の手による機械孊習クラむアントアプリケヌションのテクニカルサポヌトぞの分類パヌト1

こんにちは 私の名前はシリルで、ITマネヌゞャヌずしお10幎以䞊アルコヌル䞭毒者です。 MIPTで勉匷しおいるずきに、時々有料でコヌドを曞きたした。 しかし、厳しい珟実あなたはお金を皌ぐ必芁があり、できればそれ以䞊に盎面しお、私は䞋り坂になりたした。







画像



しかし、すべおがそれほど悪いわけではありたせん 最近、パヌトナヌず協力しお、 Okdeskの顧客䌚蚈およびクラむアントアプリケヌションシステムずいうスタヌトアップの開発に完党に取り組んでいたす 。 䞀方で-動きの方向を遞択する際のより倚くの自由。 しかし䞀方で、「6か月間で3人の開発者が研究を行い、... 私たちは倚くのこずをしなければなりたせん。 開発に関連するコア以倖の実隓補品の䞻な機胜に関連しない実隓を含みたす。



そのような実隓の1぀は、パフォヌマヌのグルヌプにさらにルヌティングするために、テキストによっおクラむアントアプリケヌションを分類するアルゎリズムの開発でした。 この蚘事では、「非プログラマヌ」が1.5か月でバックグラりンドでpythonを習埗し、実甚的な利点がある簡単なMLアルゎリズムを蚘述する方法に぀いおお話したいず思いたす。







勉匷する方法は



私の堎合、コヌスラでの遠隔孊習。 機械孊習や人工知胜に関連する他の分野のコヌスは非垞に倚くありたす。 叀兞は、コヌスラの創蚭者であるアンドリュヌ・りンアンドリュヌ・ンのコヌスず考えられおいたす。 しかし、このコヌスのマむナス点はコヌスが英語であるずいう事実に加えおこれは䞇人向けではありたせん、珍しいOctaveツヌルキットMATLABの無料のアナログです。 アルゎリズムを理解するために、これは䞻なこずではありたせんが、より䞀般的なツヌルから孊ぶ方が良いです。



MIPTずYandexの専門分野である「 機械孊習ずデヌタ分析 」を遞択したした6぀のコヌスがありたす。蚘事に曞かれおいるこずは、最初の2぀で十分です。 専門化の䞻な利点は、スラックの孊生ずメンタヌの掻気のあるコミュニティです。1日のほずんどの時間に、質問に連絡できる人がいたす。







機械孊習ずは䜕ですか



蚘事の䞀郚ずしお、甚語論争に飛び蟌むこずはありたせん。したがっお、数孊的な粟床が䞍十分な障害を芋぀けたい堎合はご遠慮ください私は品䜍の範囲を超えないこずを玄束したす:)。



それでは、機械孊習ずは正確には䜕ですか これは、知的人件費を必芁ずするがコンピュヌタヌを䜿甚する問題を解決するための䞀連の方法です。 機械孊習方法の特城は、前䟋぀たり、事前によく知られた正解がある䟋で「トレヌニング」されるこずです。



より数孊的な定矩は次のずおりです。







  1. 䞀連の特性を持぀倚くのオブゞェクトがありたす。 このセットを文字Xで瀺したす。
  2. 倚くの答えがありたす。 このセットを文字Yで瀺したす。
  3. 耇数のオブゞェクトず耇数の応答の間には未知の関係がありたす。 すなわち セットXのオブゞェクトをセットYのオブゞェクトに関連付ける関数。 関数yず呌びたす。
  4. Yからの回答が既知であるX トレヌニングセットからのオブゞェクトの有限サブセットがありたす。
  5. トレヌニングサンプルによるず、関数aを䜿甚しお、関数yをできるだけ近䌌する必芁がありたす。 関数aを䜿甚しお、 Xからの任意のオブゞェクトがYから正しい答えを適切な確率たたは数倀の答えに぀いお話しおいる堎合は粟床で取埗するようにしたす。 関数aの怜玢は、機械孊習の問題です。


これが人生の䟋です。 銀行はロヌンを提䟛したす。 銀行は、ロヌンの返枈、返枈なし、延滞返枈など、結果がすでにわかっおいる借り手のプロファむルを倚数蓄積しおいたす。 この䟋のオブゞェクトは、蚘入枈みの申請曞を持぀借り手です。 アンケヌトからのデヌタ-オブゞェクトパラメヌタ。 ロヌンの返枈たたは未返枈の事実は、オブゞェクトに察する「応答」です借り手のアンケヌト。 既知の結果を持぀アンケヌトのセットは、トレヌニングサンプルです。



借䞻のプロフィヌルで、朜圚的な借り手によるロヌンの返枈たたは非返枈を予枬できるようにしたいずいう自然な欲求がありたす。 予枬アルゎリズムを芋぀けるこずは機械孊習タスクです。



機械孊習タスクには倚くの䟋がありたす。 この蚘事では、テキストを分類するタスクに぀いお詳しく説明したす。







問題の声明



顧客サヌビス甚のクラりドサヌビスであるOkdeskを開発しおいるこずを思い出しおください。 Okdeskを業務に䜿甚する䌁業は、クラむアントポヌタル、メヌル、サむトからのWebフォヌム、むンスタントメッセンゞャヌなど、さたざたなチャネルを介しおクラむアントアプリケヌションを受け入れたす。 アプリケヌションは、1぀たたは別のカテゎリに関連する堎合がありたす。 カテゎリに応じお、アプリケヌションには1人たたは別のパフォヌマヌがいる堎合がありたす。 たずえば、1Cのアプリケヌションは゜リュヌションのために1Cの専門家に送信し、オフィスネットワヌクに関連するアプリケヌションはシステム管理者のグルヌプに送信する必芁がありたす。



アプリケヌションのフロヌを分類するために、ディスパッチャを遞択できたす。 しかし、たず、お金がかかりたす絊䞎、皎金、オフィスレンタル。 次に、アプリケヌションの分類ずルヌティングに時間がかかり、アプリケヌションは埌で解決されたす。 内容に応じおアプリケヌションを自動的に分類するこずができたら、それは玠晎らしいこずです この問題を機械孊習および1人のITマネヌゞャヌで解決しおみたしょう。



この実隓では、分類された1200個のアプリケヌションのサンプルが取埗されたした。 サンプルでは、​​アプリケヌションは14のカテゎリに分類されおいたす。 実隓の目的コンテンツに応じおアプリケヌションを自動分類するメカニズムを開発したす。これにより、ランダムなアプリケヌションよりも䜕倍もの品質が埗られたす。 実隓の結果によれば、アルゎリズムの開発ず、アプリケヌションの分類に基づいた産業サヌビスの開発に関しお決定を䞋す必芁がありたす。







ツヌルキット



実隓には、Lenovoラップトップコアi7、8GB RAM、NumPy、Pandas、Scikit-learn、reラむブラリ、 IPythonシェルを備えたPython 2.7プログラミング蚀語を䜿甚したした。 䜿甚するラむブラリに぀いお詳しく説明したす。







  1. NumPy-倧きな倚次元数倀配列で算術挔算を実行するための倚くの䟿利なメ゜ッドずクラスを含むラむブラリ。
  2. Pandasは、デヌタを簡単か぀自然に分析および芖芚化し、それらに察しお操䜜を実行できるラむブラリです。 䞻なデヌタ構造オブゞェクトタむプは、 Series 1次元構造ずDataFrame 2次元構造。実際には同じ長さの䞀連です。
  3. Scikit-learn-機械孊習のほずんどの方法を実装するラむブラリ。
  4. Reは正芏衚珟ラむブラリです。 正芏衚珟は、テキスト分析に関連するタスクに䞍可欠なツヌルです。


Scikit-learnラむブラリからは、いく぀かのモゞュヌルが必芁になりたす。その目的は、資料のプレれンテヌションの過皋で䜜成したす。 したがっお、必芁なすべおのラむブラリずモゞュヌルをむンポヌトしたす。







import pandas as pd import numpy as np import re from sklearn import neighbors, model_selection, ensemble from sklearn.grid_search import GridSearchCV from sklearn.metrics import accuracy_score
      
      





そしお、デヌタの準備に進みたす。



むンポヌトxxxのyyずしおの構築は、xxxラむブラリに接続しおいるこずを意味したすが、コヌドではyyを介しおアクセスしたす







デヌタ準備



機械孊習に関連する最初の実隓宀ではなく実際のタスクを解決するずき、アルゎリズムの孊習アルゎリズムの遞択、パラメヌタヌの遞択、さたざたなアルゎリズムの品質の比范などにほずんど時間を費やさないこずがわかりたす。 リ゜ヌスの倧郚分は、デヌタの収集、分析、準備に䜿甚されたす。



機械孊習タスクのさたざたなクラスのデヌタを準備するためのさたざたな手法、方法、および掚奚事項がありたす。 しかし、ほずんどの専門家は、デヌタの準備を科孊ではなく芞術ず呌びたす。 そのような衚珟もありたす-機胜゚ンゞニアリング぀たり、オブゞェクトを蚘述するパラメヌタヌの構築。



テキストを分類するタスクでは、機胜に1぀のオブゞェクト-テキストがありたす。 機械孊習アルゎリズムを圌に䞎えるこずは䞍可胜です私はすべおを知っおいるわけではありたせん:)。 テキストは䜕らかの圢でデゞタル化し、圢匏化する必芁がありたす。



実隓の枠組みでは、テキストを圢匏化する原始的な方法が䜿甚されたしたしかし、それらは良い結果を瀺したした。 これに぀いおは埌で説明したす。







デヌタの読み蟌み



初期デヌタずしお、1200のアプリケヌションのアップロヌドがあるこずを思い出しおください14のカテゎリに䞍均等に分垃しおいたす。 各アプリケヌションには、「件名」フィヌルド、「説明」フィヌルド、「カテゎリ」フィヌルドがありたす。 [件名]フィヌルドはアプリケヌションの短瞮コンテンツであり、必須です。[説明]フィヌルドは拡匵説明であり、空の堎合がありたす。



デヌタを.xlsxファむルからDataFrameにロヌドしたす。 .xlsxファむルには倚くの列実際のアプリケヌションのパラメヌタヌがありたすが、必芁なのは「Subject」、「Description」、および「Category」のみです。



デヌタをロヌドした埌、「Subject」フィヌルドず「Description」フィヌルドを1぀のフィヌルドに結合しお、さらに凊理しやすくしたす。 これを行うには、最初にすべおの空の説明フィヌルドたずえば、空の文字列を入力する必芁がありたす。







 #   issues  DataFrame issues = pd.DataFrame() #   issues  Theme, Description  Cat,     ,     .xlsx . u'...' —   '
'  utf issues[['Theme', 'Description','Cat']] = pd.read_excel('issues.xlsx')[[u'', u'', u'']] #     Description   issues.Description.fillna('', inplace = True) #   Theme  Description (    )   Content issues['Content'] = issues.Theme + ' ' + issues.Description
      
      





したがっお、DataFrameタむプのissue倉数がありたす。この倉数では、Content列SubjectフィヌルドずDescriptionフィヌルドの結合フィヌルドずCatアプリケヌションカテゎリを操䜜したす。 アプリケヌションのコンテンツ぀たり、[コンテンツ]列の圢匏化に進みたす。







アプリケヌションのコンテンツの圢匏化



圢匏化アプロヌチの説明



前述のように、最初のステップはアプリケヌションテキストを圢匏化するこずです。 次のように圢匏化したす。







  1. アプリケヌションの内容を蚀葉に分解したす。 単語ずは、区切り文字ダッシュ、ハむフン、ピリオド、スペヌス、改行などで区切られた2぀以䞊の文字のシヌケンスを意味したす。 その結果、アプリケヌションごずに、そのコンテンツに含たれる単語の配列を取埗したす。
  2. セマンティックの負荷を持たない各アプリケヌションから「寄生虫の単語」を陀倖したすたずえば、挚拶フレヌズに含たれる単語「hello」、「good」、「day」など。
  3. 結果の配列から、蟞曞をコンパむルしたす。すべおのアプリケヌションのコンテンツを蚘述するために䜿甚される単語のセット。
  4. 次に、サむズアプリケヌションの数 x 蟞曞内の単語の数 の行列を䜜成したす。ここで、j番目の列のi番目のセルは、蟞曞のj番目の単語のi番目のアプリケヌションの゚ントリの数に察応したす。


請求項4のマトリックスは、申請内容の圢匏化された蚘述である。 数孊的には、行列の各行は、蟞曞空間内の察応するアプリケヌションのベクトルの座暙です。 アルゎリズムをトレヌニングするには、結果のマトリックスを䜿甚したす。



重芁なポむント p。3は、トレヌニングセットからアルゎリズムテストセットの品質管理甚のランダムサブサンプルを遞択した埌に実行されたす。 これは、新しいデヌタでアルゎリズムが「戊闘䞭」に衚瀺する品質をよりよく理解するために必芁ですたずえば、トレヌニングサンプルで完党に正しい答えを䞎えるアルゎリズムを実装するこずは難しくありたせんが、新しいデヌタランダムではうたく機胜したせん この状況はリトレヌニングず呌ばれたす。 蟞曞をコンパむルする盎前にテストサンプルを分離するこずは重芁です。テストデヌタを含む蟞曞をコンパむルする堎合、サンプルでトレヌニングされたアルゎリズムは未知のオブゞェクトに粟通しおいるからです。 未知のデヌタでの品質に関する結論は正しくありたせん。



次に、p.p。 1-4のコヌドを芋おください。







コンテンツを単語に分割し、単語の寄生虫を削陀したす



たず、すべおのテキストを小文字にしたす「プリンタヌ」ず「プリンタヌ」-人に察しおのみ同じ蚀葉を䜿甚したすが、機械に察しおは䜿甚したせん







 #       def lower(str): return str.lower() #      Content issues['Content'] = issues.Content.apply(lower)
      
      





次に、「寄生虫の蚀葉」の補助蟞曞を定矩したすその充填は、アプリケヌションの特定のサンプルの反埩実隓によっお実行されたした。







 garbagelist = [u'', u'', u'', u'', u'',u'', u'', u'', u'']
      
      





各アプリケヌションのテキストを2文字以䞊の長さの単語に分割し、「寄生単語」を陀く結果の単語を配列に含める関数を宣蚀したす。







 def splitstring(str): words = [] #     [] for i in re.split('[;,.,\n,\s,:,-,+,(,),=,/,«,»,@,\d,!,?,"]',str): #  ""  2    if len(i) > 1: #  - if i in garbagelist: None else: words.append(i) return words
      
      





正芏衚珟ラむブラリreずそのsplitメ゜ッドは、区切り文字でテキストを単語に分割するために䜿甚されたす。 区切り文字の配列がsplitメ゜ッド区切り文字のセットが反埩的に補充されたず分割される文字列に枡されたす。



宣蚀された関数を各アプリケヌションに適甚したす。 出力では、元のDataFrameを取埗したす。このDataFrameには、各アプリケヌションを構成する単語の配列「寄生単語」を陀くを含む新しいWords列が衚瀺されたす。







 issues['Words'] = issues.Content.apply(splitstring)
      
      





蟞曞を䜜成したす



次に、すべおのアプリケヌションのコンテンツに含たれる単語の蟞曞のコンパむルを開始したす。 しかしその前に、䞊で曞いたように、トレヌニングサンプルをコントロヌルサンプル「テスト」、「遅延」ずも呌ばれたすずアルゎリズムをトレヌニングするサンプルに分割したす。



遞択の分離は、 Scikit-learnラむブラリヌのmodel_selectionモゞュヌルのtrain_test_splitメ゜ッドによっお実行されたす。 デヌタを含む配列アプリケヌションテキスト、ラベルを含む配列アプリケヌションカテゎリ、およびテストサンプルのサむズ通垞は党䜓の30をメ゜ッドに枡したす。 出力では、トレヌニング甚のデヌタ、トレヌニング甚のラベル、制埡甚のデヌタ、制埡甚のラベルの4぀のオブゞェクトを取埗したす。







 issues_train, issues_test, labels_train, labels_test = model_selection.train_test_split(issues.Words, issues.Cat, test_size = 0.3)
      
      





ここで、トレヌニング甚に残されたデヌタ issues_train を䜿甚しお蟞曞をコンパむルする関数を宣蚀し、このデヌタに関数を適甚したす。







 def WordsDic(dataset): WD = [] for i in dataset.index: for j in xrange(len(dataset[i])): if dataset[i][j] in WD: None else: WD.append(dataset[i][j]) return WD #    words = WordsDic(issues_train)
      
      





そのため、トレヌニングサンプルのすべおのアプリケヌションのテキストを構成する単語の蟞曞を䜜成したしたアプリケヌションは制埡甚に残されおいたす。 蟞曞は可倉ワヌドに曞き蟌たれたした。 単語配列のサむズは12015番目の芁玠぀たり単語であるこずが刀明したした。







アプリケヌションのコンテンツを蟞曞スペヌスに翻蚳したす



トレヌニング甚のデヌタを準備する最終ステップに移りたしょう。 ぀たり、サむズマトリックスサンプルのアプリケヌションの数 x 蟞曞の単語の数を構成したす 。ここで、j番目の列のi番目の行は、サンプルのi番目のアプリケヌションの蟞曞のj番目の単語の出珟数です。







 #   len(issues_train)  len(words),    train_matrix = np.zeros((len(issues_train),len(words))) # ,   [i][j]   j-   words  i-    for i in xrange(train_matrix.shape[0]): for j in issues_train[issues_train.index[i]]: if j in words: train_matrix[i][words.index(j)]+=1
      
      





これで、トレヌニングに必芁なすべおのものがありたす train_matrixマトリックスすべおのアプリケヌション甚にコンパむルされた蟞曞空間のアプリケヌションに察応するベクトルの座暙圢匏のアプリケヌションの圢匏化されたコンテンツおよびlabels_train トレヌニング甚に残されたサンプルからのアプリケヌションのカテゎリ。







トレヌニング



ラベル付きデヌタ぀たり、正しい答えがわかっおいるデヌタ labels_trainのtrain_matrix行列のトレヌニングアルゎリズムに移りたしょう。 ほずんどの機械孊習メ゜ッドはScikit-learnラむブラリに実装されおいるため、このセクションにはほずんどコヌドがありたせん。 それらの方法の開発は、材料を習埗するのに圹立぀かもしれたせんが、実甚的な芳点からは、この必芁はありたせん。



以䞋では、機械孊習の特定の方法の原則を簡単な蚀語で述べようずしたす。







最適なアルゎリズムを遞択する原則に぀いお



どの機械孊習アルゎリズムが特定のデヌタで最良の結果をもたらすかは決しおわかりたせん。 しかし、問題を理解すれば、既存のすべおのアルゎリズムを通過しないように、最適なアルゎリズムのセットを決定できたす。 問題を解決するために䜿甚される機械孊習アルゎリズムの遞択は、トレヌニングセットのアルゎリズムの品質を比范するこずによっお実行されたす。



アルゎリズムの品質ず芋なされるものは、解決する問題によっお異なりたす。 品質メトリックの遞択は、別の倧きなトピックです。 アプリケヌション分類の䞀環ずしお、単玔なメトリックである粟床が遞択されたした。 粟床は、アルゎリズムが正しい答えを䞎えたアプリケヌションの正しいカテゎリを入力したサンプル内のオブゞェクトの割合ずしお定矩されたす。 したがっお、アプリケヌションのカテゎリをより正確に予枬できるアルゎリズムを遞択したす。



アルゎリズムハむパヌパラメヌタヌなどの抂念に぀いお蚀うこずが重芁です。 機械孊習アルゎリズムには、䜜業の品質を決定する倖郚぀たり、トレヌニングセットから分析的に導出できないものパラメヌタヌがありたす。 たずえば、オブゞェクト間の距離を蚈算する必芁があるアルゎリズムでは、距離は異なるこずを意味する堎合がありたす。 マンハッタン距離 、叀兞的なナヌクリッド距離などです。



各機械孊習アルゎリズムには、独自のハむパヌパラメヌタヌセットがありたす。 奇劙なこずに、ハむパヌパラメヌタヌの最適な倀の遞択は列挙によっお実行されたす。パラメヌタヌ倀の各組み合わせに察しお、アルゎリズムの品質が蚈算され、倀の最適な組み合わせがこのアルゎリズムに䜿甚されたす。 このプロセスは、コンピュヌティングの芳点からはコストがかかりたすが、どこに行くべきですか。



盞互怜蚌は、ハむパヌパラメヌタヌの各組み合わせでアルゎリズムの品質を決定するために䜿甚されたす。 それが䜕であるか説明させおください。 トレヌニングサンプルは、N個の等しい郚分に分割されたす。 アルゎリズムは、N-1個の郚分のサブサンプルで順次トレヌニングされ、品質は1぀の遅延で考慮されたす。 その結果、N個の郚分はそれぞれ、品質のカりントに1回、アルゎリズムの孊習にN-1回䜿甚されたす。 パラメヌタヌの組み合わせでのアルゎリズムの品質は、盞互怜蚌䞭に取埗された品質倀間の平均ず芋なされたす。 取埗した品質倀をより信頌できるように、盞互怜蚌が必芁です平均化するずき、特定のサンプルパヌティションの考えられる「スキュヌ」を平準化したす。 どこでもう少し詳しく知っおいたす。



盞互怜蚌の抂念を瀺すすりィキペディアの画像



したがっお、各アルゎリズムに最適なアルゎリズムを遞択するには







  1. ハむパヌパラメヌタヌ倀の可胜なすべおの組み合わせが敎理されたす各アルゎリズムには、ハむパヌパラメヌタヌずその倀の独自のセットがありたす。
  2. 盞互怜蚌を䜿甚したハむパヌパラメヌタヌ倀の組み合わせごずに、アルゎリズムの品質が蚈算されたす。
  3. そのアルゎリズムは、最高の品質を瀺すハむパヌパラメヌタヌ倀の組み合わせで遞択されたす。


䞊蚘のアルゎリズムのプログラミングの芳点からは、耇雑なこずは䜕もありたせん。 しかし、これは必芁ありたせん。 Scikit-learnラむブラリヌには、グリッドに埓っおパラメヌタヌを遞択するための既補のメ゜ッドがありたす grid_searchモゞュヌルのGridSearchCVメ゜ッド。 必芁なのは、アルゎリズム、パラメヌタグリッド、および数Nクロス怜蚌のためにサンプルを分割する郚分の数。これらは「折り畳み」ずも呌ばれたすをメ゜ッドに転送するこずです。



問題の解決の䞀環ずしお、2぀のアルゎリズムが遞択されたしたk最近傍ずランダムツリヌの構成。 それぞれに぀いお、以䞋のストヌリヌがありたす。







k最近傍kNN



k最近傍法が最も簡単に理解できたす。 以䞋で構成されおいたす。



トレヌニングサンプルがあり、そのデヌタは既に正匏化されおいたすトレヌニングの準備ができおいたす。 ぀たり、オブゞェクトはある空間のベクトルずしお衚されたす。 私たちの堎合、アプリケヌションは蟞曞空間のベクトルずしお提瀺されたす。 トレヌニングセットの各ベクトルに぀いお、正しい答えがわかっおいたす。



新しいオブゞェクトごずに、このオブゞェクトずトレヌニングセットのオブゞェクト間のペアワむズ距離が蚈算されたす。 次に、トレヌニングセットからk個の最も近いオブゞェクトが取埗され、k個の最も近いオブゞェクトのサブサンプルで優先される回答が新しいオブゞェクトに察しお返されたす数を予枬する必芁があるタスクの堎合、k最も近い倀から平均倀を取埗できたす。







最近傍のメ゜ッドkの図







アルゎリズムを開発するこずができたすより近いオブゞェクトのラベルの倀により倧きな重みを䞎えるため。 ただし、アプリケヌションを分類するタスクに぀いおは、これを行いたせん。



この問題のフレヌムワヌクにおけるアルゎリズムのハむパヌパラメヌタヌは、数k結論付ける最近傍の数ず距離の決定です。 1〜7の範囲で近傍の数を遞択し、マンハッタン距離座暙差のモゞュラスの合蚈ずナヌクリッド距離座暙差の平方和のルヌトからの距離を遞択したす。



簡単なコヌドを実行したす。







 %%time #     param_grid = {'n_neighbors': np.arange(1,8), 'p': [1,2]} #  fold-  - cv = 3 #  estimator_kNN = neighbors.KNeighborsClassifier() # ,    fold-       optimazer_kNN = GridSearchCV(estimator_kNN, param_grid, cv = cv) #        optimazer_kNN.fit(train_matrix, labels_train) #         print optimazer_kNN.best_score_ print optimazer_kNN.best_params_
      
      





2分40秒埌、マンハッタン距離によっお決定される3぀の最近傍のアルゎリズムにより、最高品質の53.23が衚瀺されるこずがわかりたす。







ランダムツリヌ構成



決定的な朚



決定朚は別の機械孊習アルゎリズムです。 アルゎリズムのトレヌニングは、䜕らかの理由で、トレヌニングサンプルを段階的に通垞は2぀に分割したすが、通垞は必芁ありたせんに分割したす。 決定朚の仕組みを瀺す簡単な䟋を次に瀺したす。



決定朚には、内郚頂点サンプルをさらに分割するこずで決定が行われるず最終頂点シヌトがあり、そこに萜ちたオブゞェクトを予枬するために䜿甚されたす。



決定的な頂点で、単玔な条件がチェックされたす。条件x jぞのオブゞェクトの䜕らかのこれに぀いおはj番目の特城の察応は、䜕らかのt以䞊です。 条件を満たすオブゞェクトは䞀方のブランチに送信され、もう䞀方のブランチには送信されたせん。



アルゎリズムを孊習する際、すべおの頂点に1぀のオブゞェクトが残るたでトレヌニングセットを分割するこずが可胜です。 このアプロヌチは、トレヌニングサンプルでは優れた結果をもたらしたすが、未知のデヌタでは「ハット」が発生したす。 したがっお、いわゆる「停止基準」を決定するこずが重芁です-頂点がリヌフになり、この頂点のさらなる分岐が䞭断される条件。 停止基準はタスクに䟝存したす。ここにはいく぀かのタむプの基準がありたす。最䞊郚のオブゞェクトの最小数ずツリヌの深さの制限です。 この問題を解決するために、頂点内のオブゞェクトの最小数の基準が䜿甚されたした。 オブゞェクトの最小数に等しい数は、アルゎリズムのハむパヌパラメヌタヌです。



新しい予枬を必芁ずするオブゞェクトは、トレヌニングされたツリヌを介しお実行され、察応するシヌトに分類されたす。 リスト内のオブゞェクトに察しお、次の答えを瀺したす。







  1. 分類の問題に぀いおは、このシヌトのトレヌニングセットで最も䞀般的なオブゞェクトのクラスを返したす。
  2. 回垰問題぀たり、答えが数倀である問題の堎合、このシヌトからトレヌニングサンプルのオブゞェクトの平均倀を返したす。


各頂点の属性jの遞択方法ツリヌの特定の頂点でサンプルをどの属性で分割するかず、この属性に察応するしきい倀tに぀いおは匕き続き説明したす。 このために、いわゆる゚ラヌ基準QX m 、j、tが導入されたす。 ご芧のように、゚ラヌ基準は、サンプルX m 問題の頂点に到達したトレヌニングサンプルの郚分、サンプルX mが問題の頂点で分割されるパラメヌタヌj、およびしきい倀tに䟝存したす。 ゚ラヌ基準が最小になるようにjずtを遞択する必芁がありたす。 各トレヌニングセットのjおよびtの倀の可胜なセットは限られおいるため、列挙によっお問題は解決されたす。



゚ラヌ基準ずは䜕ですか この堎所の蚘事のドラフト版には、倚くの公匏ず付随する説明、情報コンテンツ基準ずその特殊なケヌスゞニヌ基準ず゚ントロピヌ基準に぀いおのストヌリヌがありたした。 しかし、蚘事は非垞に肥倧化したした。 手続きず数孊を理解したい人は、むンタヌネット䞊のすべおに぀いお読むこずができたすたずえば、 ここ 。 私は指の「物理的意味」に自分自身を制限したす。 ゚ラヌ基準は、分割埌に取埗されたサブサンプル内のオブゞェクトの「倚様性」のレベルを瀺したす。 分類問題の「倚様性」ずは、さたざたなクラスを意味し、回垰問題数倀が予枬されるでは分散を意味したす。 したがっお、サンプルをサンプリングするずき、結果のサブサンプルの「倚様性」を最小限に抑える必芁がありたす。



朚を芋぀けたした。 朚の構成に移りたしょう。







決定的なツリヌの構成



決定朚は、トレヌニングセットの非垞に耇雑なパタヌンを明らかにするこずができたす。 , — . ().



N “”. (, ) , — ( N ) .



, N . : N . : / (.. , ). — (.. , ; , — ). .



- ! 2- : ( ) ( ).



:







 %%time #     param_grid = {'n_estimators': np.arange(20,101,10), 'min_samples_split': np.arange(4,11, 1)} #  fold-  - cv = 3 #  estimator_tree = ensemble.RandomForestClassifier() # ,    fold-       optimazer_tree = GridSearchCV(estimator_tree, param_grid, cv = cv) #        optimazer_tree.fit(train_matrix, labels_train) #         print optimazer_tree.best_score_ print optimazer_tree.best_params_
      
      





3 30 , 65,82% 60 , 4.







結果





(, — ) .



test_matrix, , (.. , train_matrix, ).







 #   len(issues_test)  len(words) test_matrix = np.zeros((len(issues_test),len(words))) # ,   [i][j]   j-   words  i-    for i in xrange(test_matrix.shape[0]): for j in issues_test[issues_test.index[i]]: if j in words: test_matrix[i][words.index(j)]+=1
      
      





accuracy_score metrics Scikit-learn. :







 print u' :', accuracy_score(optimazer_tree.best_estimator_.predict(test_matrix), labels_test) print u'kNN:', accuracy_score(optimazer_kNN.best_estimator_.predict(test_matrix), labels_test)
      
      





51,39% k 73,46% .







""



, “ ” , random. “” , random. , “” , - .



3- “” :







  1. random;
  2. ;
  3. Random, .


random 14 100/14 * 100% = 7,14% . , 14,5% ( ). random- . , random-:







 #  random import random # ,    random-  rand_ans = [] # for i in xrange(test_matrix.shape[0]): rand_ans.append(labels_train[labels_train.index[random.randint(0,len(labels_train))]]) #  print u' random:', accuracy_score(rand_ans, labels_test)
      
      





14,52%.



, , “” . やった







次は



, 90% — . , . “” ( , ). -, (: " ", " ", " " ..) — ( ) .



, : . " " "", . . , , , .



, Okdesk .



"! !" c







( 2). .








All Articles