異垞なプレむボヌむモデル、たたはScikit-learnを䜿甚したデヌタの異垞倀の怜出に぀いお

圢状ず高さによっおプレむボヌむモデルの重量を予枬するこずに関するBubaVVの蚘事に動機付けられ、著者は、 もしあなたが私が意味するこずを知っおいお、同じデヌタ、぀たりその圢で他の人から際立っおいる巚乳モデルを芋぀ける堎合 、研究の䞻題をより深く掘り䞋げるこずに決めたした、身長たたは䜓重。 このりォヌムアップの背景に察しお、同時にナヌモアの感情は、Scikit-learnラむブラリのOne-class Support Vector Machineの実装における異垞倀怜出ず異垞怜出デヌタに぀いお、初心者に少しだけ教えたす。 Pythonで。



ダりンロヌドおよび初期デヌタ分析



したがっお、デヌタの゜ヌスずそれらに取り組んだ人を正盎に参照し、 girls.csvデヌタを含むCSVファむルを開いお、そこに䜕があるかを確認したす。 1953幎12月から2009幎1月たでの604人のプレむボヌむガヌルのパラメヌタヌを芋る胞囲バスト、cm、腰囲り゚スト、cm、腰囲ヒップ、cm、身長高さ、cm 。および重量重量、kg。



お気に入りのPythonプログラミング環境私の堎合はEclipse + PyDevを開き、Pandasラむブラリを䜿甚しおデヌタをロヌドしたしょう。 この蚘事では、Pandas、NumPy、SciPy、sklearn、matplotlibラむブラリがむンストヌルされおいるこずを前提ずしおいたす。 そうでない堎合、Windowsナヌザヌはここからプリコンパむルされたラむブラリを喜んでむンストヌルできたす 。

たあ、nyxずpoppiesおよび著者のナヌザヌは少し苊しむ必芁がありたすが、蚘事はそれに぀いおではありたせん。



たず、必芁なモゞュヌルをむンポヌトしたす。 利甚可胜になったずきの圹割に぀いおお話ししたす。



import pandas import numpy as np import matplotlib.pyplot as plt import matplotlib.font_manager from scipy import stats from sklearn.preprocessing import scale from sklearn import svm from sklearn.decomposition import PCA
      
      





girls.csvファむルからデヌタを読み取るこずにより、Pandas DataFrameデヌタ構造のgirlsむンスタンスを䜜成したすこのpyファむルの隣にありたす。そうでない堎合は、フルパスを指定する必芁がありたす。 headerパラメヌタヌは、属性の名前が最初の行぀たり、プログラマヌずしお数えられる堎合はれロにあるこずを瀺しおいたす。



 girls = pandas.read_csv('girls.csv', header=0)
      
      





ちなみに、Pandasはpythonに慣れおいる人にずっおは玠晎らしいオプションですが、Rでのデヌタ解析の速床が倧奜きです。PandasがRから継承した䞻なものは、䟿利なDataFrameデヌタ構造です。

著者は、TitanicMachine Learning from DisasterのトラむアルコンペティションでKaggle チュヌトリアルでPandasに䌚いたした。 Kaggleを初めお䜿甚する人にずっお、これは最終的にこれを行うための倧きな蚀い蚳です。



私たちの女の子の䞀般的な統蚈を芋おみたしょう



 print girls.info()
      
      





604人の女の子が自由に利甚できるこずが通知されたす。各女の子には、7぀の兆候Monthtype object、Yeartype int64、さらに5個のint64の兆候がありたす。

次に、女の子に぀いおさらに孊びたす。



 print girls.describe()
      
      





ああ、人生のすべおがずおもシンプルだったら

通蚳者は、女の子の兆候の䞻な統蚈的特城、平均倀、最小倀、最倧倀をリストしたす。 もう悪くない。 このこずから、プレむボヌむモデルの平均的な圢状は89-60-88予想、平均の高さ-168 cm、重量-52 kgであるず結論付けられたす。

ここで、成長は小さいようです。 どうやら、これは、20䞖玀半ばからの歎史的デヌタが、珟圚、180 cmの高さがモデルの暙準であるず考えられおいるように芋えるずいう事実によるものです。

少女の胞の範囲は81〜104 cm、り゚スト-46〜89、ヒップ-61〜99、身長-150 cm〜188 cm、䜓重-42 kg〜68 kgです。

うわヌ、あなたはすでに゚ラヌがデヌタに忍び蟌んでいるず疑うこずができたす。 り゚ストが89cmのモデルはどのようなビヌル暜ですか そしお、ヒップはどのように61 cmになるこずができたすか



これらのナニヌクなものが䜕であるか芋おみたしょう



 print girls[['Month','Year']][girls['Waist'] == 89]
      
      





これらは、それぞれ1998幎12月ず2005幎1月のプレむボヌむの女の子です。 ここで簡単に芋぀けるこずができたす 。 これらは、ニコヌル、゚リカ、ゞャクリンの3人組であり、非話者の姓は Dam Dahm です。3぀すべおが「1぀のアカりントの䞋」ずDestiny Davis Destiny Davis です。 トリプレットり゚ストは25むンチ64 cmで、89ではなく、Destiniのヒップは86 cmで、61ではありたせん。



矎容のために、女の子のパラメヌタヌの分垃のヒストグラムを䜜成するこずもできたす倉曎のために、Rで䜜成されたす。









そのため、デヌタを簡単に手䌝っお芋おみるず、もちろんデヌタがあたりなく、兆候が䜕らかの圢で人が理解できる方法で解釈できる堎合は、デヌタにいく぀かの奇劙な点を芋぀けるこずができたす。



デヌタの前凊理



モデルをトレヌニングするために、幎を陀き、数倀パラメヌタヌのみを残したす。 これらをNumPy girl_params配列に曞き蟌み、同時にfloat64型に倉換したす。 すべおの属性が-1〜1の範囲になるようにデヌタをスケヌリングしたす。これは、倚くの䞻芁な孊習アルゎリズムにずっお重芁です。 詳现を説明するこずなく、スケヌリングにより、倉化の範囲が広いずいう理由だけでサむンがより倚くの重みを受けるずいう事実を回避したす。 たずえば、「幎霢」ず「収入」ずいう蚘号に埓っおナヌクリッド距離を考慮するず、メトリックぞの寄䞎は、たずえば数千、数十の幎霢で枬定されるため、はるかに高くなりたす。



 girl_params = np.array(girls.values[:,2:], dtype="float64") girl_params = scale(girl_params)
      
      





次に、デヌタ内の2぀の䞻芁コンポヌネントを遞択しお、衚瀺できるようにしたす。 ここでは、Scikit-learn Principal Component Analysis PCA ラむブラリが圹に立ちたした。 たた、それは私たちの女の子の数を保぀ために私たちを傷぀けるこずはありたせん。 さらに、デヌタ内の排出量の1を探しおいるず蚀いたす。぀たり、6〜7人の「奇劙な」女の子に制限したす。 倧文字で蚘述されたPythonの倉数は定数を衚し、通垞はモゞュヌルを接続した埌、ファむルの先頭に曞き蟌たれたす。



 X = PCA(n_components=2).fit_transform(girl_params) girls_num = X.shape[0] OUTLIER_FRACTION = 0.01
      
      





モデルトレヌニング



デヌタ内の「倖れ倀」を怜出するには、サポヌトベクタヌマシンの単䞀クラスモデルを䜿甚したす。 SVMのこのバリ゚ヌションに関する理論的研究は、アレクセむ・ダコブレノィッチ・チェルノォンキスによっお始められたした。 Yandexによるず 、珟圚、この問題を解決する方法の開発は、機械孊習の理論の開発で最初に行われおいたす。

ここではSVMずコアに぀いおは説明したせん。たずえば、 Habré よりシンプルやmachinelearning.ru より耇雑には、SVMずコアに぀いお倚くのこずが曞かれおいたす。 名前が瀺すように、1クラスのSVMが同じクラスのオブゞェクトを区別するために呌び出すこずに泚意しおください。 デヌタの異垞を怜出するこずは、この考え方のささやかなアプリケヌションです。 珟圚、深局孊習の時代では、1クラス分類のアルゎリズムを䜿甚しお、たずえば子䟛が他のすべおのオブゞェクトず犬を区別するなど、オブゞェクトの「衚珟を䜜成する」ようにコンピュヌタヌに教えようずしおいたす。



しかし、Scikit-learnサむトで十分に文曞化されおいるOne-class SVMのScikit実装に戻りたす。

ガりスカヌネルを䜿甚しお分類子のむンスタンスを䜜成し、それにデヌタを「フィヌド」したす。



 clf = svm.OneClassSVM(kernel="rbf") clf.fit(X)
      
      







゚ミッション怜玢



トレヌニングセットXのオブゞェクトから構築された分割面たでの距離を栌玍する配列dist_to_borderを䜜成し、しきい倀を遞択した埌、オブゞェクトが倖れ倀ではなくこのクラスの代衚であるむンゞケヌタヌの配列TrueたたはFalseを䜜成したす。 さらに、オブゞェクトが構築された分割面で囲たれた領域の「内偎」にある堎合぀たり、クラスの代衚である堎合、距離は正になり、そうでない堎合は負になりたす。 しきい倀は、分割面たでの距離など、統蚈的に決定され、OUTLIER_FRACTIONこの堎合は1぀のサンプルの割合が倧きくなりたす぀たり、この堎合、 しきい倀は分割面たでの距離の配列の1パヌセンタむルです。



 dist_to_border = clf.decision_function(X).ravel() threshold = stats.scoreatpercentile(dist_to_border, 100 * OUTLIER_FRACTION) is_inlier = dist_to_border > threshold
      
      







結果の衚瀺ず解釈



最埌に、䜕が起こったのかを芖芚化したす。 この時点で私はやめたせん。垌望する人は自分でmatplotlibを扱うこずができたす。 これは、Scikit-learnの「いく぀かの方法による異垞倀怜出」の䟋から再蚭蚈されたコヌドです。



 xx, yy = np.meshgrid(np.linspace(-7, 7, 500), np.linspace(-7, 7, 500)) n_inliers = int((1. - OUTLIER_FRACTION) * girls_num) n_outliers = int(OUTLIER_FRACTION * girls_num) Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) plt.title("Outlier detection") plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), threshold, 7), cmap=plt.cm.Blues_r) a = plt.contour(xx, yy, Z, levels=[threshold], linewidths=2, colors='red') plt.contourf(xx, yy, Z, levels=[threshold, Z.max()], colors='orange') b = plt.scatter(X[is_inlier == 0, 0], X[is_inlier == 0, 1], c='white') c = plt.scatter(X[is_inlier == 1, 0], X[is_inlier == 1, 1], c='black') plt.axis('tight') plt.legend([a.collections[0], b, c], ['learned decision function', 'outliers', 'inliers'], prop=matplotlib.font_manager.FontProperties(size=11)) plt.xlim((-7, 7)) plt.ylim((-7, 7)) plt.show()
      
      







次の図が衚瀺されたす。





7぀の「攟出」が衚瀺されたす。 この䞍快な「爆発」の䞋にどんな皮類の女の子が隠れおいるかを理解するために、゜ヌスデヌタでそれらを芋おみたしょう。



 print girls[is_inlier == 0]
      
      





  Month Year Bust Waist Hips Height Weight 54 September 1962 91 46 86 152 45 67 October 1963 94 66 94 183 68 79 October 1964 104 64 97 168 66 173 September 1972 98 64 99 185 64 483 December 1998 86 89 86 173 52 507 December 2000 86 66 91 188 61 535 April 2003 86 61 69 173 54
      
      





そしお今、最も面癜い郚分は、結果ずしお生じる攟出の解釈です。

Kunstkameraには7぀の展瀺しかないこずに気づきたしたOUTLIER_FRACTIONしきい倀を蚭定できたので、それぞれの展瀺を確認できたす。



  1. ミッキヌりィンタヌズ 。 1962幎9月。91-46-86、高さ152、重量45。



    もちろん、り゚スト46はクヌルです 圌らはこの胞91でどうしおいたすか

  2. クリスティン・りィリアムズ 1963幎10月。94-66-94、高さ183、重量68。



    その幎の少女ではありたせん。 これはミッキヌりィンタヌズではありたせん。

  3. ロヌズマリヌヒルクレスト 。 1964幎10月、104-64-97、身長168、䜓重66。



    すごいすごい 玠晎らしい女性。

  4. スヌザン・ミラヌ 1972幎9月。98-64-99、高さ185、䜓重64。



  5. キュヌティヌダムトリプレットダム 。 86-89実際の64-86、高さ173、重量52。



    デヌタ゚ラヌの䟋。 圌らが3぀すべおをどのように枬定したかはあたり明確ではない。

  6. カヌラ・ミシェル 。 2000幎12月。86-66-91、高さ188、䜓重61。



    成長188-この蚘事の著者の䞊。 このような「履歎」デヌタの明瀺的な「倖れ倀」。

  7. カルメラ・デ・チェザヌレ 。 2003幎4月。86-61-69、高さ173、重量54。



    おそらく腰のために。





ヒップが61 cmの女性は、他の女の子ずは非垞に異なり、他の点ではかなり正垞であり、SVMが「倖れ倀」ずしお定矩されおいなかったこずは泚目に倀したす。



おわりに



最埌に、最初のデヌタ分析の重芁性に泚目し、「目だけで」、そしおもちろん、デヌタの異垞の怜出は、より深刻なタスクにも䜿甚されるこずに泚意しおください-信頌できない顧客を認識するための信甚スコアリング、朜圚的な「ボトルネック」を怜出するセキュリティシステム、サむバヌ犯眪者などを怜玢するための銀行取匕の分析。 たた、興味のある読者は、デヌタずそのアプリケヌションの異垞ず異垞倀を怜出するための他の倚くのアルゎリズムを芋぀けるでしょう。



All Articles