データサイエンスのプロセスが実際に機能する仕組み

こんにちは、 Habr!



最後の出版物である「Your Personal Big Data Course」の後、質問を含む数百通の手紙を受け取りました。読んだことには驚かされました。 今日は実際にどんな困難が現れるのか、そして実際の問題を解決する際に何をしなければならないのかをお話しします。





すでに多数の機械学習コースを受講し、 Kaggleで問題を解決し始めた人は、問題の典型的な声明がどのように見えるかをよく知っています:「 トレーニングセットのオブジェクトのセットが与えられそれぞれ兆候があり、ターゲット変数の値も与えられます。また、テストも与えられます。ターゲット変数の値を予測する必要がある各オブジェクトのサンプル。 より複雑な設定がありますが、ここでは回帰と分類の問題について、最も典型的なものを示しました。 問題の解決策はkaggle.comから始まります-問題の状態を安全に読み取り、品質メトリックを確認し、データセットをダウンロードし、 IPython Notebookを起動し、お気に入りのライブラリを接続し、データで一生懸命に作業を開始し、モデルハイパーパラメーターを選択し、機能選択を行い、トレーニングします多くの分類子を使用してそれらを計量し、複雑なオブジェクトを見つけて、それらをより慎重に調べます。したがって、品質指標を最適化し、 リーダーボードで適切な位置を獲得するために戦っています。



残念ながら、実際には、すべてが非常に異なって見えます。 実際、 作業の90%がすでに完了しています 。 品質モデルを構築するスキルはもちろん重要ですが、最重要ではありません 。 問題のステートメントで上で強調表示されている単語に注意してください-ランダムではありません 実際には、あなたに「与えられた」ものは何もありません。「品質測定基準」も「訓練サンプル」もありません。実際、 問題がないことは言うまでもありません。タスク。 そして、ここで科学者の実際の仕事はデータに従って始まります。その中でルーチンが大部分を占めており、問題の明確な声明と「オブジェクトサイン」マトリックスが構築されるずっと前にずっと前に考えなければなりません。



つまり、発生する最も一般的な問題は次のとおりです。





そのため、各問題を順番に分析します。



問題のぼやけた声明



タスクはそれ自体では発生しません-私たちが行うすべてのことは特定の目的のために行われます。 そして、 ビジネス目標は、しばしば非公式な顧客の解約」、「アフィリエイトプログラムからの収益の増加」、「ユーザーの保持」、「ビジネスプロセスの最適化による特定のビジネス部門の負担の軽減」を策定します。 タスクがData Scientistに到達するのは、この表現(より頻繁に-少し正確に)にあります。 それこそが、本当に必要なことを理解するために、この人がビジネスに精通していなければならない理由です。 たとえば、サービスを促進するタスクが解決されているか、ターゲットを絞った提案が開発されている場合-クライアントとの対話プロセスが後でどのように配置されるか、広告キャンペーンがどのように実行されるか、成功の基準がどのように決定されるか、そして機械学習が最終的にどのような目的で必要かを理解する必要があります-これらはすべて、細部まで正確に把握する必要があります。 しかし、詳細の処理を開始するとすぐに、次の問題が発生します。



多数の自由度



それは何ですか-「クライアントはドレインにあります」-ビジネスの言葉でそれは明らかです-ビジネスはお金を失い始めています。 しかし、クライアントに関する情報を含むストレージはこれを理解していません-流出がブロック、契約の終了、一定期間のサービスの不使用、請求書の支払い遅延を意味する可能性のある数十のステータスを保存します-これはすべてクライアントの流出と呼ばれることができます異なる程度。 また、ターゲットパラメータの定式化と問題のステートメントが非常に多くの自由度を許容する場合、タスクのサインを生成するのはどれくらい簡単ですか? そう! -それはさらに困難です。 ここで、タスク自体とサインについて決定したことを少し想像してください。 また、クライアントとの連絡はどのように行われますか? -ここで、顧客維持のプロセスは、一定の時間がかかり、特定の機能を備えた複雑な手順であることがわかりました。 私たちが言うなら、あなたはクライアントがどんな日付でも特定の確率で流出に入る傾向があると予測します。つまり、あなたは単に彼と対話する時間がない可能性もあります。 そして、これらすべては、アルゴリズムの開発のずっと前に考慮に入れられなければなりません。 そのため、プロセス全体とすべての詳細を知るためには、特定の分野にすばやく飛び込む方法を学ぶ必要があります。 これに対処したと仮定すると、問題を解決するために必要な機能も決定しました。 しかし、ここで新しい問題が発生します。



多数の異なるデータソース



データは、特に大企業では、常に1つのソースに保存されるわけではありません。 また、常にこのデータを操作する手段は同じです。これは、 HDFSの シーケンスファイルnoSQLデータベース、およびリレーショナルソースのようなものになる可能性があるためです。 しかし、多くの場合、「オブジェクト属性」マトリックスが必要です。つまり、多数のお気に入りの結合を作成する必要があります。これは、ビッグデータの場合、クエリを最適に作成する方法を考えさせます。 ここでは、 SQL、Hive、Pigから始まり、多くの場合、SQLに似た言語を使用するよりもJava / Scalaでコードを記述する方が簡単であるという事実で終わるさまざまなツールを使用するスキルが必要になります。 ただし、これらのツールすべてに精通しており、複雑なjoinを正しく記述する方法を想像できる場合、他の問題が発生します。



データ品質と欠落



非常に頻繁に(会社が大きくなるほど-頻繁に) データギャップが多くなります -たとえば、タスクで特定の兆候を解決する必要がある場合-これらの兆候のほとんどは少数の顧客グループのみが利用できることがわかります。 さらに、顧客データが利用できる場合でも、いわゆる外れ値がデータ部分にあることがわかります。 データソースが異なる-同じデータを異なる形式で保存できるため、すべてを同じ結合で同じフォームにする必要があります。 しかし、あなたもこれに対処したとします。 Hive / PigまたはSparkで適切なスクリプトを作成して実行しました。 それをすべて考えますか? そうでもない。



データを操作するための生のソフトウェア



当時のビッグデータの人気の主な理由は安さでした。 特に、ビッグデータを操作するための一般的なツールのほとんどは、 Hive、Pig、またはみんなのお気に入りのApache Sparkであるかどうかにかかわらず、 オープンソース開発です。 しかし、オープンソースツールを使用した経験が少なくとも1度ある人は、それらをまったく期待する価値がないこと、およびすべてが最初から常に開始されるわけではないことを十分に認識しています。 たとえば、HDFSからファイルを順番に読み取り、数時間離れて移動する単純なスクリプトを記述した場合。 到着すると、誤って読み取ったファイルのあるフォルダーの中に、たとえばPigが読み取れなかった* .tmpファイルがあったために、スクリプトが「クラッシュ」したことが簡単にわかります。 Apache Sparkを使用したすべての人は、小さなファイルの読み取りの問題、ビルドされたモデルを保存するのが難しいことが多いという事実についても説明できます。独自のシリアライザーを作成する必要があります。 そのような例はたくさんあります。 しかし、長い間コードを実行およびテストしており、待望の「オブジェクトサイン」マトリックスがあるように思えます。



ビッグデータを扱うことの不便さ



そして、あなたは大量のデータを持っていると想像してください。 RAMに収まる小さなトレーニングサンプルがあり、すでに適切なモデルを構築しているとします。 原則として、同時に多数の新機能を生成しました( ここで 、そしてここで出会ったFeature Engineeringを作成しました )。 そして、待望のPredict関数を呼び出す必要があるオブジェクトの膨大な選択をどうしますか? 結局、トレーニングセットで行ったのと同じ変換をすべて行う必要があります-新しい列を追加し、ギャップを埋め、データを正規化します。 モデルを構築するときは、おそらくDataFramesを扱ったPandasのような素晴らしいパッケージの助けを借りてそれを行ったでしょう。 すべては、今ではもうありません-すべてはあなた自身の手で行われなければなりません。 ここで喜ぶことができるのは、Apache Sparkバージョン1.3がDataFrameをサポートしていることです 。これにより、 RまたはPythonで行われるのと同じくらい速くビッグデータを操作できます。 おそらく。



トレーニングサンプルの入手



これはおそらく最も不快ではありませんが、同時に実際に発生する重要な問題- トレーニングサンプルの入手先を教えてください。 考えるべきことはすでにたくさんあります。なぜなら トレーニングサンプルのサイズと品質の間でバランスを取ることが重要です。 たとえば、一部のタスクには特定のトレーニングオブジェクトのセットがあることが多く、トレーニングオブジェクトをクラスタリングして重ね合わせることにより、トレーニングサンプルのサイズを増やすことができます。 また、多くの補助的なタスクを解決することでトレーニングサンプルを見つけることができます-ここには一般的な方法はありません-特定のタスクのために毎回出る必要があります。



合計



ですから、この投稿を読んだ後でも、データ分析に積極的に参加したいと思っています。 結局のところ、これらの問題はすべて何らかの方法で解決されます(私の場合、これは他の企業の同僚にインタビューすることで言えます)。 これは、Apache Sparkの場合のように、新しいツールが表示されるときに常に発生します。 ただし、これらの機能と困難をすべて事前に知ることが重要です。



みなさん、幸運を祈ります!



All Articles