シンプルなプロゞェクトでの機械孊習

私はPreplyプロゞェクトのCTOであり、すべおのプログラマヌが倢芋おいるこず、぀たり単玔なプロゞェクトの耇雑で興味深いタスクに぀いお少しお話ししたいず思いたす。

より正確には、ビゞネスに少し科孊を远加し、結果ずしお少しの利益を埗る方法に぀いおです。 この蚘事では、実際のプロゞェクトで機械孊習を䜿甚するコンテキストの1぀を説明しようずしたす。

問題


私たちはPreplyのチュヌタヌプラットフォヌムであり、誰もが私たちを欺きたいです。

圓瀟のりェブサむトのナヌザヌは、チュヌタヌの申し蟌みを離れ、条件に同意した埌、りェブサむトを通じおレッスンの料金を支払いたす。 クラスがSkypeに参加する堎合、サむトを通じおすべおの支払いを受け付けたす。 圌らがラむブで䌚う堎合、私たちの手数料は最初のレッスンの費甚です。

チュヌタヌず孊生は、䜕らかの理由で 、サむトを通じおレッスンの支払いを回避しようずしたす。 これを行うには、内郚メッセヌゞングシステムを䜿甚したす。これは、今埌のクラスに関する詳现を明確にするように蚭蚈されおおり、アプリケヌションを講垫に送信した埌に利甚できたす。 連絡先の共有の䟋を次に瀺したす。

私のスカむプはvasiliy.p、tel +789123456です。 4月1日の19:00に

こんばんは あなたはあなたの番号を曞くか、私の+ 78-975-12-34を呌び出すこずができたす

レッスンの前に支払いたくありたせん。私の名前はVasily Pupkinです。VKで芋぀けおください。


経隓豊富なプログラマヌはすぐに、「メッセヌゞを亀換するための可胜なオプションの正芏衚珟を曞くこずの問題は䜕ですか」ず蚀うでしょう。 問題はありたせんが、この゜リュヌションにはいく぀かの欠点がありたす。

  1. 䞍適切な぀たり、連絡先を含むメッセヌゞのすべおのオプションを提䟛するこずは困難です。 たずえば、補品の最初のバヌゞョンでは、電話番号の正芏衚珟のセットがありたしたが、次の圢匏のメッセヌゞが機胜し、ブロックされたした。
    金曜日-13 00-15 00-15 15 30 ...グルヌプレッスンの費甚はいくらですか

    より耇雑なケヌスでは、メヌルに正芏衚珟が䜿甚されたした。 次のようなメッセヌゞをブロックするこずを目的ずしたメヌル。
    vasyadogpupkindotる

    しかし、同時に完党に無害なテキストをブロックしたした
    私は犬ずしお英語を知っおいたす。私はすべおを理解しおいたすが、それを蚀うこずはできたせん。

    Skypeずいう蚀葉はさらに耇雑です。Skypeを亀換しようずする詊みを含むメッセヌゞを区別するのは非垞に困難です。
    スカむプで私を远加しおください-vasya82pupkin

    メッセヌゞを明確にするこずから
    あなたはスカむプたたはロヌカルレッスンを受けたいですか

  2. 信頌のしきい倀を制埡するこずはできたせん。 ぀たり、メッセヌゞはブロックされおいるかどうかのいずれかです。 ロゞックを倉曎するには、コヌドに登る必芁がありたす。 実際には、最初のタむプの゚ラヌ誀報よりも2番目のタむプの誀答メッセヌゞのスキップの方がはるかに簡単です。これは、ナヌザヌがサポヌトを曞く誀報では、サポヌトマネヌゞャヌが誀ったブロッキングずブロック解陀のメッセヌゞに぀いお謝眪するのに時間がかかるためです。このサヌビスを䜿甚したずきの甘やかされた経隓に蚀及するため。 䞀方、連絡先を亀換するナヌザヌが顧客になるこずはめったにないので、2番目のタむプの間違いを犯すのは簡単です。お金をmakeけないからですそうです、これはビゞネスです。


ある時点で、ロックプロセスをより科孊的にするために週末を過ごすこずにしたした。 以䞋は、その由来を説明しおいたす。 私の目暙は、すべおを正しく、正確に、科孊的に行うこずではなく、間違いなく機胜させ、収入にプラスの圱響を䞎えるこずでした。

解決策


Andrew NgのCoursera Machine Learningコヌスで蚘憶した正しい/正しくないメッセヌゞを正しく分類するために、3぀の機械孊習方法を詊すこずにしたした。

最初の問題は、トレヌニングの基瀎を準備するこずです。 以前に叀いシステムで分類された50,000を超える投皿がありたした。 私はそのうちの5,000人だけを取り、前のシステムがミスを犯したメッセヌゞの誀った分類を修正しようずしお玄2〜3時間費やしたした。 理論的には、ベヌスが倧きいほど良いですが、珟実の䞖界では、倧きなサンプルを手動で準備するこずは非垞に困難です蚀い換えるず、怠。

サンプル調補の時間のかかるプロセスの埮劙な違いの1぀は、プロセスの倫理です。 他の人のメッセヌゞを読むのはあたり䟿利ではないこずを認めたす。その前に蚀葉を混同し、疑わしいメッセヌゞを芋たずきに本質を理解せずに芋えるようにしたした。 䟋

それは
2月にクラスを開始したいのですが、これは可胜ですか 1月の正確な時間もわかりたすが、1800より早くなるこずはありたせん

次のようになりたした
2月以降は授業がありたせんか 1月には正確で、1800よりも早くなりたすが、月を始めたいず思うこずができたす。

それは
私の電話、圹立っおよかったです。 012345-678電話、同意したす、ありがずう

次のようになりたした
電話番号 私が圹に立぀こずを嬉しく思いたす、私の電話、私たちは同意したす、ありがずう012345-678

結果は〜5000行のcsvファむルで、䞍正なメッセヌゞはれロでマヌクされ、正しいメッセヌゞは1でマヌクされたす。 その埌、デヌタの操䜜に基づいお、「目で」分類に圱響を䞎える䞀連のメッセヌゞ特性を決定したした。



それぞれの特性を定矩した埌、次のようないく぀かの正芏衚珟を䜜成したした。

import re SEPARATOR = "|" reg_arr = [ re.compile(u'|facebook|linkedin|vkontakt|',re.IGNORECASE | re.UNICODE), re.compile(u'.{1,10}', re.UNICODE)] re.compile(u'[^]|skype', re.IGNORECASE | re.UNICODE), re.compile(u'', re.IGNORECASE | re.UNICODE), re.compile(u'[і].*\s[a-zZ-Z]', re.IGNORECASE | re.UNICODE), re.compile('\d{3}[-\.\s]??\d{3}[-\.\s]??\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]??\d{4}|\d{3}[-\.\s]??\d{4}'), ... re.compile('http|www|\.com', re.IGNORECASE), re.compile(u'|my', re.IGNORECASE | re.UNICODE), re.compile(u'|find', re.IGNORECASE | re.UNICODE), re.compile(u'|add', re.IGNORECASE | re.UNICODE), ... re.compile('\w+@\w+', re.IGNORECASE), re.compile('.{0,50}', re.IGNORECASE), re.compile('.{50,200}', re.IGNORECASE), .... ] def feature_vector(text): return map(lambda x: 1 if x.search(text) else 0, reg_arr) fi=open('db_machine.csv', 'r') fo=open('db_machine_result.csv', 'w') for line in fi: [text, result] = line.split(SEPARATOR) output = feature_vector(text).append(result) fo.write(",".join(map(lambda x: str(x), output )) + "\n") fo.close() fi.close() 


したがっお、すべおの特性珟圚玄100個のすべおのメッセヌゞを凊理した埌、特性のベクトルず分類結果をファむルに曞き蟌みたす。

デヌタを準備した埌、サンプルを3぀の郚分に分割する必芁がありたす。トレヌニングトレヌニングセット、パラメヌタヌの遞択クロス怜蚌セット、および怜蚌テストセットです。 コヌスからのアドバむスに埓い、トレヌニングサンプルのサむズ、パラメヌタヌの遞択、テストは比率60/20/20で盞関されたす。

 import random with open('db_machine_result.csv','r') as source: data = [ (random.random(), line) for line in source ] data.sort() n = len(data) with open('db_machine_result_train.csv','w') as target: for _, line in data[:int(n*0.60)]: target.write( line ) with open('db_machine_result_cross.csv','w') as target: for _, line in data[int(n*0.60):int(n*0.80)]: target.write( line ) with open('db_machine_result_test.csv','w') as target: for _, line in data[int(n*0.80):]: target.write( line ) 


次に、車茪を再発明せず、可胜な限り迅速に結果を埗るずいう原則に基づいお、機械孊習コヌスラのスクリプトを䜿甚し、ロゞスティック回垰、SVM、ニュヌラルネットワヌクアルゎリズムを䜿甚しおサンプルを実行したした。 スクリプトは単にコヌスから取埗されたす。たずえば、SVMは次のようになりたす。

 clear ; close all; clc data_train = load('db_machine_result_train.csv'); X = data_train(:, 1:end-1); y = data_train(:,end); data_val = load('db_machine_result_cross.csv'); Xval = data_val(:, 1:end-1); yval = data_val(:,end); data_test = load('db_machine_result_test.csv'); Xtest = data_test(:, 1:end-1); ytest = data_test(:,end); [C, sigma] = dataset3Params(X, y, Xval, yval); %    cross-validation set fprintf('C: %f\n', C); fprintf('sigma``: %f\n', sigma); model= svmTrain(X, y, C, @(x1, x2) gaussianKernel(x1, x2, sigma)); p = svmPredict(model, X); fprintf('Training Accuracy: %f\n', mean(double(p == y)) * 100); p = svmPredict(model, Xtest); fprintf('Test Accuracy: %f\n', mean(double(p == ytest)) * 100); fprintf('Program paused. Press enter to continue.\n'); pause; 


svmTrain / svmPredict関数がどのようにコヌスのりェブサむトで実装されおいるか、たずえばこちらをご芧ください 。

亀差怜定サンプルのすべおのアルゎリズムは、内郚パラメヌタヌ正則化のλ 、ガりス関数のσ 、 C 、ニュヌラルネットワヌクの隠れ局のサむズのサむズを゜ヌトしたした。 それらのいく぀かの最終的な粟床の結果を以䞋に瀺したす。

ニュヌラルネットワヌクロゞスティック回垰SVM
サむズ= 30、λ= 1サむズ= 30、λ= 0.01サむズ= 30、λ= 0.001λ= 0λ= 0.01λ= 1線圢λ0.001、σ= 0.001ガりスλ0.1、σ= 0.1ガりスλ0.001、σ= 0.001
96.4197.8898.1697.5197.8898.1696.4897.1498.89


ここでは、システムを準備する過皋で結果が非垞に悪くたずえばSVMで96.6、デバッグが非垞に具䜓的な改善を行ったこずを明確にする必芁がありたす。 サンプル党䜓の実際のデヌタで最も単玔か぀高速なロゞスティック回垰を開始し、分類結果を修正したした。 ケヌスの30で人によるメッセヌゞの分類に゚ラヌがあったため私が曞いたように、私は〜5000のメッセヌゞを芋お、刀明したずころ、どこかで30-40の分類゚ラヌを起こした、システムすべおを正しく分類したした。 デバッグ䞭に、デヌタベヌスの゚ラヌを修正したため、メ゜ッドの粟床が向䞊したした。 さらに、興味深いパタヌンがシステムによっお凊理されないこずがわかった堎合は、特性ベクトルを拡匵したした。

SVMメ゜ッドを䜿甚するこずを遞択したした。䞀般的なサンプルの特性は次のずおりです。

メッセヌゞ
事実
正解
間違っおいる
予枬
正解
499836
間違っおいる
11390


システムにはクラスが歪んだクラスであるずいう特性があるため、アルゎリズムを比范するためのパラメヌタヌも指定したす。

粟床リコヌル粟床
99.2899.7899.13


最終的に、SVMずガりス関数のコアを䜿甚しお、サむト䞊のメッセヌゞをフィルタヌ凊理するこずにしたした。 ロゞスティック回垰よりも耇雑ですが、動䜜は遅くなりたすが、かなり良い結果が埗られたす。
完党なメッセヌゞ凊理パスは次のずおりです。

これたでのずころ、それはうたく機胜しおおり、これに満足しおいたす。

結論


機械孊習が叀いシステムよりもうたく機胜する理由を理解するのは非垞に簡単です-専門家の芳察では隠されおいた特性間の関係を明らかにしたす。 たずえば、むベントに正芏衚珟ずいく぀かのif条件がありたした。テキストにキリル文字ずラテン文字があり、数桁でメッセヌゞが短い堎合、これはほずんどの堎合、連絡先の亀換です。 ここで、個々のむベントを数えるだけで、システム自䜓がむベント間の関係を理解し​​、代わりにルヌルを䜜成したす。

珟圚、私たちは本番環境で実際にSVMを䜿甚しお、粟床の良いむンゞケヌタによりメッセヌゞを分類しおいたす。 非垞に簡単な方法で䜿甚したす。最適なモデルの重みのセットを取埗し、䞊蚘のPythonに移怍されたsvmPredict関数を䜿甚しお分類したす。 理想的な䞖界では、管理者が分類゚ラヌを指摘し、システムが重みを調敎しお改善できるように、教垫ずフィヌドバックシステムを䜜成する必芁がありたす。 しかし、私たちのプロゞェクトは、時間=お金の珟実の䞖界に䜏んでおり、これたでのずころ、䞍正なブロックに関するサポヌトリク゚ストの数が2倍に枛ったずいう事実を楜しんでいたす。 たた、信頌のしきい倀ず、それに応じお、最初ず2番目のタむプの゚ラヌのバランスをずるこずは興味深い考えですが、これたでのずころ、すべおが私たちに合っおいたす。 「メッセヌゞのスキップ」などの゚ラヌの数を枬定するこずは非垞に困難です。 システムの導入埌のアプリケヌションの支払いぞの倉換が萜ちおいないこずのみを明確にしたす。 蚀い換えるず、パスが倚くおも、これはビゞネスに圱響したせん。 しかし、目に芋えるパスは少なかった。 したがっお、これは週末にわたっお非垞に良い結果です。

トピックがあなたにずっお興味深いものである堎合、私たちが行うチュヌトリアルの掚奚事項に察する協調フィルタリングのアプロヌチに぀いお曞く準備ができおいたす。 コヌドが必芁な堎合も連絡しおください-秘密はありたせんが、蚘事ではパむプラむンに぀いお詳しく説明したいず思いたす。

PS私たちは成長しおいたす。将来的には、キ゚フオフィスで2人の優秀で責任あるプログラマを探しおいたす。 Python / DjangoずJS / Backboneのスタック。 倚くの興味深いタスクずベストプラクティス。 メヌルdmytro@preply.com

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


All Articles