Azure Machine Learning機械孊習サヌビスの開発ずモバむルアプリケヌションでの䜿甚

この蚘事の執筆に協力しおくれたマむクロ゜フト孊生パヌトナヌのEugene Grigorenko @ evgri243 による蚘事の準備に感謝したす。 Azure関連の残りの蚘事はazureweekタグにありたす。


機械孊習はコンピュヌタヌサむ゚ンスで最も人気のある分野の1぀ですが、同時に開発者の間では最も避けられおいる分野の1぀でもありたす。 これの䞻な理由は、機械孊習の理論的な郚分には深い数孊的なトレヌニングが必芁であり、倚くは倧孊を卒業した埌すぐに忘れるこずを奜むからです。 ただし、理論的な基瀎に加えお、実甚的な偎面もあるこずを理解する必芁がありたす。これは、毎日孊習しお䜿甚する方がはるかに簡単です。 この䜜業の目的は、プログラマヌずデヌタ凊理の専門家の間のギャップを埋め、アプリケヌションで機械孊習を䜿甚するこずが非垞に簡単なタスクであるこずを瀺すこずです。 この蚘事では、䞀連の特性に応じお自動車の䟡栌を予枬するためのモデルを構築するために必芁な䞀連の手順の抂芁を説明し、その埌Windows 10 Mobileのモバむルアプリケヌションで䜿甚したす。



Azure MLずは䜕ですか



぀たり、Azure Machine Learningは次のずおりです。



この蚘事の埌半で、Azure MLに関する詳现情報を芋぀けるこずができたす。たた、 リンクをクリックしおください。



Azure MLを遞ぶ理由

Azure Machine Learningは機械孊習を䜿甚するための最も単玔なツヌルの1぀であるため、ニヌズに合わせお䜿甚​​するこずを決定したすべおの人の参入障壁を取り陀きたす。 Azure MLを䜿甚するず、数孊者である必芁がなくなりたす。



機械孊習アルゎリズムを構築する論理プロセス







  1. 目的の定矩。 すべおの機械孊習アルゎリズムは、実隓の目的が明確に定矩されおいなければ圹に立ちたせん。 このラボの目暙は、゚ンドナヌザヌが提䟛する䞀連の特性に基づいお自動車の䟡栌を予枬するこずです。
  2. デヌタ収集。 この段階では、モデルのさらなるトレヌニングに必芁なデヌタサンプルが圢成されたす。 この堎合、カリフォルニア倧孊機械孊習リポゞトリデヌタが䜿甚されたす。

    archive.ics.uci.edu/ml/datasets/Automobile
  3. デヌタ準備。 この段階で、特性を圢成し、倖れ倀を陀去し、サンプルをトレヌニングずテストに分割するこずにより、デヌタを準備したす。
  4. モデル開発。 モデルの開発プロセスでは、1぀以䞊のデヌタモデルず察応するトレヌニングアルゎリズムが遞択されたす。これは、開発者によるず、望たしい結果が埗られたす。 倚くの堎合、このプロセスは、パタヌンを芋぀けるために、いく぀かのモデルの有効性の䞊行研究およびデヌタの芖芚的分析ず組み合わされたす。
  5. モデルトレヌニング。 トレヌニング䞭、孊習アルゎリズムは予枬方法を芋぀けるために、デヌタサンプル内の隠されたパタヌンを怜玢したす。 怜玢プロセス自䜓は、遞択したモデルず孊習アルゎリズムによっお決たりたす。
  6. モデル評䟡。 モデルがトレヌニングされた埌、その予埌特性を研究する必芁がありたす。 ほずんどの堎合、このために、テストサンプルで実行し、結果の゚ラヌレベルを評䟡したす。 この芁件ず粟床芁件に応じお、モデルを最終モデルずしお採甚するか、新しい入力特性を远加した埌、たたは孊習アルゎリズムを倉曎した埌でも、モデルを再トレヌニングできたす。
  7. モデルの䜿甚。 蚓緎されたモデルのテストが成功した堎合、その䜿甚の段階が始たりたす。 これは、Azure MLが䞍可欠になり、アルゎリズムの公開、監芖、収益化に必芁なすべおのツヌルを提䟛する堎合です




予枬モデルの構築



開始するには、[補品]メニュヌのリンク [アナリティクス]を遞択し、[機械孊習]をクリックしたす。 たたは、 盎接リンクを䜿甚したす。







開いたペヌゞで、[今すぐ開始]をクリックしたす。



Azure MLを䜿甚するには、アクティブなMicrosoft Azureサブスクリプションが必芁です。 既にお持ちの堎合は、Azure管理ポヌタルにログむンしおください 。それ以倖の堎合は、 リンクをクリックしお無料詊甚アカりントを事前登録しおください 。



承認に成功するず、Azure ML Studioのメむンペヌゞに衚瀺されたす。これは、さらにすべおの䜜業が行われる環境です。







デヌタの読み蟌み



たず、トレヌニングセットをダりンロヌドする必芁がありたす。 これを行うには、 リンクをクリックしお 、車のデヌタの遞択を含むimports-85.dataファむルをコンピュヌタヌにダりンロヌドしたす。

このファむルをAzure ML Studioにアップロヌドするには、ペヌゞの䞋郚にある[新芏]をクリックし、開いたパネルで[デヌタセットずロヌカルファむルから]を遞択したす。 ブヌトメニュヌで、ダりンロヌドしたファむルぞのパス、名前を指定し、タむプずしおヘッダヌなしの汎甚CSVファむル.hn.csvを遞択したす。







新しい実隓を䜜成する



新しい実隓を䜜成するには、[新芏]-> [実隓]-> [空の実隓]を遞択したす。 その結果、ツヌルバヌが右偎にある新しい実隓ワヌクスペヌスが䜜成されたす。







デヌタサンプルの定矩



以前にダりンロヌドしたデヌタは、巊偎の[保存されたデヌタセット]セクションに反映されたす。 これを遞択しお、ワヌクスペヌス内の任意の堎所、たずえば、「ここにアむテムをドラッグ」矢印が指す堎所にドラッグしたす。







デヌタ゜ヌスには、他のコンポヌネントに接続するために䜿甚される円圢のゞャンクションがありたす。



デヌタ準備



機械孊習モデルを開発する堎合、各倉曎埌に実隓の予備結果を確認するこずをお勧めしたす。 したがっお、接続ポむントを右クリックしお、芖芚化を遞択したす。 その結果、デヌタずその分垃の䞀般的な抂念を瀺すりィンドりが衚瀺されたす。







ご芧のずおり、サンプルに問題がありたす。2番目の列には倀がありたせん。 これにより、孊習プロセスに望たしくない圱響が生じ、モデルの品質が倧幅に䜎䞋する可胜性がありたす。 しかし、幞いなこずに、これらの倀は保険コストによっお特城付けられ、車の䟡栌ずはあたり関係がないため、削陀できたす。 ずりわけ、列には名前がありたせん。これにより、列の凊理が倧幅に耇雑になりたす。



デヌタ倉換/操䜜グルヌプの名前に関する問題を修正するには、メタデヌタ゚ディタヌを䜜業面にドラッグしたす。



デヌタサンプルの出力䞋を新しいコンポヌネントの入力䞊にドラッグしお接続したす。 それをクリックしお、右偎の蚭定りィンドりを開きたす。 メタデヌタ゚ディタヌを䜿甚するず、タむプや名前など、1぀以䞊の列のメタ情報を倉曎できたす。 列遞択りィザヌドをクリックしお、列遞択りィザヌドを開きたす。 すべおの列を遞択するには、「開始」フィヌルドで「すべおの列」を遞択し、右偎の「-」蚘号をクリックしお遞択絞り蟌み線を削陀し、チェックマヌクをクリックしお確認したす。



蚭定パネルの[新しい列名]フィヌルドに、以前に提䟛されたリンクを䜿甚しおimport-85.namesファむルにある新しい列名をコンマで区切っお入力したす。 フィヌルド倀は次のようになりたす。



シンボル衚瀺、正芏化された損倱、メヌカヌ、燃料タむプ、吞匕、ドア数、ボディスタむル、駆動茪、゚ンゞン䜍眮、ホむヌルベヌス、長さ、幅、高さ、瞁石重量、゚ンゞンタむプ、シリンダヌ数、゚ンゞンサむズ、燃料システム、ボア、ストロヌク、圧瞮比、銬力、ピヌクrpm、city-mpg、highway-mpg、䟡栌



コンポヌネントの結果を衚瀺するには、䞋の[実行]をクリックしお、前述のようにメタデヌタ゚ディタヌの出力を芖芚化したす。







次に、正芏化された損倱を削陀したす。 これを行うには、同じグルヌプからプロゞェクト列をワヌクスペヌスにドラッグし、メタデヌタ゚ディタヌに接続しおその蚭定に移動したす。 行遞択りィザヌドを再床遞択し、今床は正芏化された損倱を陀くすべおの行を遞択しお、䞋図に瀺す蚭定ず同様の蚭定を行いたす。







実隓を実行し、結果を芖芚化しお、2番目の列が遞択から抜けおいるこずを確認したす。



残念ながら、倀のない列はただありたす。 しかし、それらの倚くはないため、䞍完党な行を砎棄するように制限するこずができたす。 これを行うには、Missing Value Scrubberを遞択しお、プロゞェクト列に接続したす。 [欠損倀の堎合]フィヌルドで、倀を[行党䜓を削陀]に倉曎したす。 空の倀を持぀行がなくなったこずを実行し、芖芚化し、怜蚌したす。







準備段階で答える必芁がある最埌の質問が残っおいたす。すべおの特性が車の䟡栌に圱響したすか この段階で、以䞋の少数の指暙に制限するこずができたす。その䞀芧を以䞋に瀺したす。 将来的には、い぀でも新しいモデルを远加し、結果のモデルの粟床を比范するこずで、それらの十分性の仮説をテストできたす。



メヌカヌ、ボディスタむル、ホむヌルベヌス、゚ンゞンサむズ、銬力、ピヌク回転数、ハむりェむmpg、シリンダヌ数、䟡栌



新しいプロゞェクト列を远加し、䞊の列を遞択したす。







結論ずしお、実隓を実行しお結果を芖芚化するこずにより、デヌタの準備が成功したこずを確認しおください。



サンプルの内蚳



これで、孊習プロセスでデヌタを䜿甚する準備が敎いたした。 しかし、機械孊習では、「再トレヌニング」ず呌ばれる効果が可胜です。䞀般化を䌎わないデヌタのモデルによる暗蚘です。 このような振る舞いは、異なるデヌタに察しお適切な予枬を䞍可胜にするこずに぀ながりたす。 この状況に察凊するには、サンプルを3に近い比率でトレヌニングずテストに分けたす。 それらの最埌は孊習プロセスに参加せず、最埌に予枬誀差の掚定に䜿甚されたす。 この゚ラヌがトレヌニングサンプルの゚ラヌず倧幅に異なる堎合、䞊蚘の効果が芋られたす。



テストサンプルを䜜成するには、実隓コンポヌネントをワヌクスペヌスに転送し、デヌタ倉換/サンプルおよび分割グルヌプのデヌタ分割コンポヌネントを最埌のプロゞェクト列に接続したす。 最初の出力の行の比率を0.75に蚭定し、[分割のランダム化]フラグが蚭定されおいるこずを確認したす。



線圢回垰モデルのトレヌニング



最初に、ツヌルバヌから線圢回垰、トレヌニングモデル、スコアモデル、およびモデル評䟡コンポヌネントをドラッグしたす。 モデルのトレヌニングは、任意のトレヌニングセットで任意のモデルのトレヌニングを可胜にする汎甚コンポヌネントです。 特定のケヌスを構成するには、スプリットデヌタの最初の巊出力ず線圢回垰の出力をトレむンモデルの察応する入力に接続したす。 Train Model蚭定で、䟡栌を目暙倀ずしお指定したす結果列。 これで、モデルをトレヌニングする準備ができたした。



ただし、トレヌニング自䜓に加えお、トレヌニングの結果を知るこずが重芁です。 モデルのスコアコンポヌネントを䜿甚するず、任意のサンプルでトレヌニングされたモデルの出力を蚈算し、予枬の結果を蚈算できたす。 トレヌニング枈みモデルを含むトレヌニングモデル出力を察応するスコアモデル入力に接続し、デヌタサンプルずしお別の入力に接続し、2番目の分割デヌタ出力からテストサンプルを送信したす。 スコアモデルの出力を評䟡モデルの入力のいずれかに接続しお、トレヌニングの質の数倀特性を蚈算したす。 結果は、図に瀺すプロセスず同様のプロセスになるはずです。







モデルを実行し、評䟡モデルの結果を芖芚化したす。







決定係数は、回垰盎線が゜ヌスデヌタをどの皋床正確に蚘述しおいるかを瀺したす。 蚱容される倀の範囲は0〜1で、絶察粟床は1に察応したす。 この堎合、係数は82です。 これが良い結果であるかどうかは、問題のステヌトメントず特定の゚ラヌトレランスに䟝存したす。 車の䟡栌を予枬する堎合、82が優れた結果です。 改善したい堎合は、他の列をプロゞェクト列に远加するか、根本的に異なるアルゎリズムを詊しおください。 たずえば、ポア゜ン回垰。 埌者は、線圢回垰コンポヌネントをポア゜ンコンポヌネントに眮き換えるだけで実珟できたす。 しかし、より興味深いアプロヌチは、芁玠から䞊列トレヌニングを収集し、結果を評䟡モデルの2番目の出力に接続するこずです。これにより、䞡方のモデルの孊習結果を簡単に比范できたす。







モデルを実行し、結果を芖芚化したす。 結果からわかるように、デヌタは線圢回垰モデルによっおより適切に蚘述されおいるため、最終的なモデルずしお遞択する理由はすべおありたす。







線圢回垰に察応するトレヌニングモデルコンポヌネントを右クリックし、[トレヌニングモデルずしお保存]を遞択したす。 これにより、再トレヌニングの必芁なしに、取埗したモデルを他の実隓で䜿甚できたす。



Webサヌビスの公開



サヌビスを公開するには、線圢回垰に察応するトレヌニングモデルコンポヌネントを遞択し、[Webサヌビスのセットアップ]をクリックしたす。 開いたメニュヌで、予枬Webサヌビス[掚奚]を遞択し、Azure MLがサヌビスのニヌズに最適化された新しい実隓を䜜成するたで埅ちたす。 自動的に䜜成されたコンポヌネントWeb Service InputおよびWeb Service Outputを削陀したす-少し準備しおから埌で䜜成したす。



珟時点では、スコアモデル芁玠は出力ですべおの入力列を繰り返し、予枬倀にスコアラベルずいう名前を付けたす。 これを修正する必芁がありたす。



これを行うには、ツヌルバヌから䜜業画面に既によく知られおいる2぀のコンポヌネントプロゞェクト列ずメタデヌタ゚ディタヌを転送したす。 そしお、䞋図に瀺す順序でそれらを接続したす。 [プロゞェクトの列]蚭定で、スコアラベルの列を1぀だけ遞択し、メタデヌタ゚ディタヌを䜿甚しお、名前をpriceに倉曎したす。



結論ずしお、䜜成したサヌビスの入力ず出力を远加する必芁がありたす。 これを行うには、Webサヌビス入力ずWebサヌビス出力を実隓に远加したす。 最初をスコアモデル入力に接続し、2番目をメタデヌタ゚ディタヌ出力に接続したす。 䞡方の芁玠の蚭定で、名前をそれぞれ「input」および「prediction」に倉曎したす。



[実行]をクリックしおモデルを再床実行し、怜蚌の最埌に[Webサヌビスの展開]をクリックしおサヌビスを公開したす。







サヌビステスト



[Webサヌビスのデプロむ]をクリックするず、新しく䜜成されたサヌビスに関する情報を含むペヌゞにリダむレクトされたす。 HELP PAGE APIの䞋のリンクには、着信および発信JSONパケットの内容に関する情報を含むかなり詳现な説明ず、䜿甚方法のアむデアを提䟛するサンプルコン゜ヌルアプリケヌションコヌドが含たれおいたす。







むンタラクティブな調査を行うには、[テスト]をクリックし、開いたりィンドりで各入力パラメヌタヌの倀を入力したす。 たずえば、以䞋にリストされおいるものを遞択し、チェックマヌクをクリックしおテスト芁求を送信したす。



アりディセダン99.8 4 109102 5500 30 13950







アプリケヌション開発



結論ずしお、Azure MLをバック゚ンドサヌビスずしお䜿甚するモバむルアプリケヌションの開発プロセスを怜蚎しおください。 最初に、新しいナニバヌサルWindowsアプリケヌションプロゞェクトを䜜成したす。 これを行うには、開いおいるVisual Studio 2015で、[ファむル]-> [新芏]-> [プロゞェクト...]を遞択したす。開いたりィンドりで、巊偎のメニュヌの[Windows]タブに移動し、[空のアプリナニバヌサルWindows]を遞択したす。 名前フィヌルドにAzureMLDemoず入力し、[OK]をクリックしたす。 必芁に応じお、完成したプロゞェクトをGitHubで芋぀けるこずができたす。







準備が敎うず、Visual Studioは新しいナニバヌサルアプリケヌションプロゞェクトを開きたす。 [デバッグ]の右偎のプロセッサアヌキテクチャフィヌルドでx86が瀺されおいるこずを確認し、右偎でモバむル仮想マシンの1぀をスタヌトアップ環境ずしお遞択したす。 たずえば、モバむル゚ミュレヌタヌ10.0.10240.0 720p 5むンチ1GB。



これで、アプリケヌション自䜓の䜜成に進むこずができたす。 ゜リュヌション゚クスプロヌラヌメニュヌで、MainPage.xamlをダブルクリックしたす。 GUIマヌクアップ蚀語XAMLの説明はこの䜜業の範囲を超えおいるため、開始ず終了の<Grid ...>タグを次のコヌドに眮き換えるだけです。



<ScrollViewer Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" HorizontalScrollMode="Disabled" VerticalScrollBarVisibility="Hidden"> <StackPanel> <TextBlock Text="Estimate the price of your dream car" Style="{ThemeResource TitleTextBlockStyle}" TextAlignment="Center" HorizontalAlignment="Center" Margin="5,20,5,5" TextWrapping="WrapWholeWords"/> <Border Margin="5 10" BorderBrush="LightGray" BorderThickness="2"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="40"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="40"/> <RowDefinition Height="40"/> <RowDefinition Height="40"/> <RowDefinition Height="40"/> <RowDefinition Height="40"/> <RowDefinition Height="40"/> <RowDefinition Height="40"/> <RowDefinition Height="40"/> </Grid.RowDefinitions> <TextBlock Text="Make" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="5"/> <TextBox Name="tbxMake" Text="Audi" Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2" VerticalAlignment="Center" HorizontalAlignment="Stretch" Margin="5"/> <TextBlock Text="Body Style" Grid.Row="1" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="5"/> <TextBox Name="tbxBodyStyle" Text="Sedan" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" VerticalAlignment="Center" HorizontalAlignment="Stretch" Margin="5"/> <TextBlock Text="Wheel Base" Grid.Row="2" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="5"/> <Slider Name="slWheelBase" Value="99" Grid.Row="2" Grid.Column="1" Minimum="86" Maximum="121" StepFrequency="1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Margin="5,5,3,5"/> <TextBlock Name="tbWheelBase" Grid.Row="2" Grid.Column="2" Text="{x:Bind slWheelBase.Value, Mode=OneWay}" VerticalAlignment="Center" Margin="2,5,5,5"/> <TextBlock Text="Number of Cylinders" Grid.Row="3" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="5"/> <TextBox Name="tbxNumberOfCylinders" Text="Four" Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="2" VerticalAlignment="Center" HorizontalAlignment="Stretch" Margin="5"/> <TextBlock Text="Engine Size" Grid.Row="4" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="5"/> <Slider Name="slEngineSize" Value="109" Grid.Row="4" Grid.Column="1" Minimum="61" Maximum="326" StepFrequency="1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Margin="5,5,3,5"/> <TextBlock Name="tbEngineSize" Grid.Row="4" Grid.Column="2" Text="{x:Bind slEngineSize.Value, Mode=OneWay}" VerticalAlignment="Center" Margin="2,5,5,5"/> <TextBlock Text="Horsepowers" Grid.Row="5" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="5"/> <Slider Name="slHorsepowers" Value="102" Grid.Row="5" Grid.Column="1" Minimum="48" Maximum="288" StepFrequency="1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Margin="5,5,3,5"/> <TextBlock Name="tbHorsepowers" Grid.Row="5" Grid.Column="2" Text="{x:Bind slHorsepowers.Value, Mode=OneWay}" VerticalAlignment="Center" Margin="2,5,5,5"/> <TextBlock Text="Peak PRM" Grid.Row="6" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="5"/> <Slider Name="slPeakRPM" Value="5500" Grid.Row="6" Grid.Column="1" Minimum="4150" Maximum="6600" StepFrequency="1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Margin="5,5,3,5"/> <TextBlock Name="tbPeakRPM" Grid.Row="6" Grid.Column="2" Text="{x:Bind slPeakRPM.Value, Mode=OneWay}" VerticalAlignment="Center" Margin="2,5,5,5"/> <TextBlock Text="Highway MPG" Grid.Row="7" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="5"/> <Slider Name="slHighwayMPG" Value="30" Grid.Row="7" Grid.Column="1" Minimum="16" Maximum="54" StepFrequency="1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Margin="5,5,3,5"/> <TextBlock Name="tbHighwayMPG" Grid.Row="7" Grid.Column="2" Text="{x:Bind slHighwayMPG.Value, Mode=OneWay}" VerticalAlignment="Center" Margin="2,5,5,5"/> </Grid> </Border> <Button Name="btnGetEstimate" Grid.Row="2" Content="Get estimate" HorizontalAlignment="Center"/> <TextBlock Name="tbResult" TextAlignment="Left" Margin="10 5" TextWrapping="Wrap"/> </StackPanel> </ScrollViewer>
      
      





明らかな耇雑さにもかかわらず、このコヌドは、ナヌザヌデヌタの入力に必芁なかなり単玔なマヌクアップを䜜成したす。 モデルパラメヌタヌの1぀の各入力芁玠には、tbxMake、txbBodyStyleなどの名前がありたす。 その䞋には、Azure MLサヌビスにメッセヌゞを送信するGet Estimateボタンがあり、すべおが呌び出しの結果が配眮されるtbResult芁玠で終わりたす。



[デバッグ]-> [デバッグの開始]をクリックしおアプリケヌションを起動し、すべおが正しく行われたこずを確認したす。プロゞェクトがコンパむルされお起動したす。 スラむダヌの䜍眮を倉曎するず、スラむダヌの右偎の数倀がそれに察応しお倉化するこずを確認しおください。



[デバッグ]-> [デバッグの停止]をクリックしお、デバッグセッションを停止したす。



゜フトりェアロゞック定矩



次に、[芋積もりを取埗]ボタンをクリックするための凊理コヌドを決定する必芁がありたす。 ゜リュヌション゚クスプロヌラヌで、MainPage.xamlを展開し、MainPage.xaml.csをダブルクリックしお、このGUIの分離コヌドファむルを開きたす。



最初のステップは、いく぀かの必芁なラむブラリを接続するこずです。 これを行うには、プロゞェクト名を右クリックし、[Nugetパッケヌゞの管理...]を遞択したす。開いたメニュヌでWebApi.Clientを怜玢し、Microsoft.AspNet.WebApi.Clientずいう名前のパッケヌゞをむンストヌルしたす。







その埌、次の远加の宣蚀をファむルの先頭に远加したす。



 using System.Net.Http; using System.Net.Http.Headers; using Newtonsoft.Json; using System.Threading.Tasks; </source      MainPage  ,       . <source lang="cs"> public sealed partial class MainPage : Page { const string _apiKey = @"<your API key>"; const string _requestUri = @"Your key";
      
      





アクセスキヌはサヌビスのダッシュボヌドペヌゞにあり、リク゚ストアドレスはREQUEST / RESPONSEヘルプペヌゞにありたす。リンク先には以䞋のリンクがありたす。









次のステップは、Azure MLサヌビスにリク゚ストを行うヘルパヌ関数を远加するこずです。 同じREQUEST / RESPONSEヘルプペヌゞで提䟛されるドキュメントに埓っお、応答を受信するには、次の䞀連のアクションを実行する必芁がありたす。芁求を生成し、HTTP POST芁求でサヌビス偎に送信し、応答を凊理したす。

すべおのモデルパラメヌタヌの入力を取埗し、䟡栌の芋積もりずずもに浮動小数点倀を返すCallAzureML関数を䜜成したす。 ここでの非同期タスクは、非同期/埅機パタヌンの実装に察応したす。これにより、アプリケヌションでの非同期呌び出しの操䜜が倧幅に簡玠化されたす詳现に぀いおは、 こちらをご芧ください 。



 private async Task<float> CallAzureML(string make, string bodyStyle, double wheelBase, string numberOfCylinders, int engineSize, int horsepowers, int peakRPM, int highwayMPG) { }
      
      





たた、JSONでの䜜業を簡玠化するために、Newtonsoft.Jsonラむブラリを䜿甚したす。 その特城的な機胜は、.NETレベルの通垞のオブゞェクトの圢匏で䟿利な抜象化を介しおJSONオブゞェクトず察話できるこずです。 メ゜ッドの先頭に次のコヌドを配眮したす。



  var requestBody = new { Inputs = new Dictionary<string, object>() { { "input", new { ColumnNames = new string[] {"make", "body-style", "wheel-base", "num-of-cylinders", "engine-size", "horsepower", "peak-rpm", "highway-mpg", "price"}, Values = new string[,] { { make, bodyStyle, wheelBase.ToString(), numberOfCylinders, engineSize.ToString(), horsepowers.ToString(), peakRPM.ToString(), highwayMPG.ToString(), "0" } } } } }, GlobalParameters = new Dictionary<string, int>() };
      
      





ここでは、JSON芁求オブゞェクトの構造が匿名クラスを䜿甚しお再䜜成され、予想される芁求の構造が完党に倧文字ず小文字が区別されたす繰り返されたす。 比范のために、REQUEST / RESPONSEペヌゞからのそのようなリク゚ストの䟋を以䞋に瀺したす。



{

"Inputs": {

"input": {

"ColumnNames": [ "make", "body-style", “wheel-base", "num-of-cylinders",

"engine-size", "horsepower", "peak-rpm", "highway-mpg",

"price" ],

"Values": [

[ "value", "value", "0", "value", "0", "0", "0", "0", "0" ],

[ "value", "value", "0", "value", "0", "0", "0", "0", "0" ]

]

}

},

"GlobalParameters": {}

}







次のステップは、サヌビス自䜓ぞの芁求を満たすこずです。 これを行うには、開発䞭のメ゜ッドに次のコヌドを远加したす。



  try { using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", _apiKey); client.BaseAddress = new Uri(_requestUri); var response = await client.PostAsJsonAsync("", requestBody); if (response.IsSuccessStatusCode) { // succeeded throw new NotImplementedException(); } else { // failed throw new NotImplementedException(); } } } catch (Exception e) { throw; }
      
      





最初のケヌスでは、HTTPクラむアントが䜜成され、Azure MLのサヌビスに正垞に接続するために必芁なすべおの情報アドレスずアクセスキヌがむンストヌルされたす。 次に、前に䜜成したJSONオブゞェクトを䜿甚しお、サヌビスの偎にPOSTリク゚ストが行われたす。 呌び出しが成功したかどうかは、HTTPステヌタスコヌドによっお確認されたす。



コメント成功のマヌクが付いた領域のコヌドを以䞋のコヌドに眮き換えたす。 サヌバヌの応答を文字列圢匏で順次受信し、Newtonsoft.Jsonコンバヌタヌを䜿甚しお動的オブゞェクトに解析し、䟡栌情報を取埗したす。 比范のためのサヌバヌ応答の䟋は、「サヌビスのテスト」セクションにありたす。



  var responseContent = await response.Content.ReadAsStringAsync(); var val = JsonConvert.DeserializeObject<dynamic>(responseContent); float? price = (float)val?.Results?.prediction?.value?.Values[0][0]; if (price == null) throw new InvalidDataException("Response message has unknown format" + " or is empty."); return (float)price;
      
      





゚ラヌ状態の堎合、メ゜ッドは最倧の情報を返す必芁がありたす。 したがっお、前の堎合ず同様に、ク゚リの内容は文字列ずしお取埗されたすが、今回は順次オブゞェクトに倉換され、文字列に戻されたす。 これは、パディングを远加しおその内容をより䟿利に読み取るために必芁です。 倱敗したコメントでマヌクされた領域のコヌドを以䞋のものに眮き換えたす。



  var responseContent = await response.Content.ReadAsStringAsync(); var responseObject = JsonConvert.DeserializeObject(responseContent); var formattedResponseContent = JsonConvert.SerializeObject(responseObject, Formatting.Indented); var message = String.Format("Server returned status code {0} with message {1}", response.StatusCode, formattedResponseContent); throw new InvalidDataException(message);
      
      





Azure MLの呌び出しメ゜ッドは完了したず芋なすこずができたす。 ご芧のずおり、その実装は非垞に簡単ですが、統蚈デヌタモデル、孊習アルゎリズム、および入力ベクトルの任意の掚定倀を評䟡する方法を実装するプロセス党䜓を構築したす。 むしろ耇雑な数孊的理論は、プログラムコヌドの数行に収たりたす。

結論ずしお、掚定ボタンの取埗むベントハンドラヌを実装する必芁がありたす。 たず、MainPage.xamlに移動し、むベントハンドラヌ情報をGetEstimateボタンXMLタグに远加したす。



  <Button 
 Click="GetEstimate_Click"/>
      
      





MainPage.xaml.csに戻り、適切なメ゜ッドを䜜成したす。 以前に䜜成したメ゜ッドを呌び出しおAzure MLサヌビスにアクセスし、結果をtbResultに蚭定したす。



  private async void GetEstimate_Click(object sender, RoutedEventArgs e) { try { var price = await CallAzureML(tbxMake.Text, tbxBodyStyle.Text, slWheelBase.Value, tbxNumberOfCylinders.Text, (int)slEngineSize.Value, (int)slHorsepowers.Value, (int)slPeakRPM.Value, (int)slHighwayMPG.Value); tbResult.Text = String.Format("You are lucky!\n" + "Today it is as cheap as {0:c}. Don't miss your chance!", price); } catch (Exception ex) { // Shows error in result TextBlock tbResult.Text = String.Format("Oops! Something went wrong.\n" + "This can be helpful:\n{0}", ex.ToString()); } }
      
      





すべお、アプリケヌションの準備ができたした。 それを実行し、異なる特性のセットで車の䟡倀を評䟡しお実隓しおください。







おわりに



Azure Machine Learningは、機械孊習アルゎリズムを操䜜するための新しい生産性の高いツヌルです。 おそらくこれは、アルゎリズムを個別のサヌビスずしお公開し、その埌アプリケヌションで䜿甚するこずを非垞に簡単にする唯䞀の環境です。 この䜜業では、最も単玔な孊習アルゎリズムの1぀である線圢回垰アルゎリズムが䜿甚されたした。 Azure MLには、さたざたな目的のために科孊者によっお䜜成された数十ものものがありたす。 そしお最も重芁なこずは、それらを䜿甚するために数孊者である必芁はたったくないずいうこずです。 コンポヌネントを䜿甚しお必芁なデヌタ凊理プロセスを収集し、いく぀かの実隓を行い、成功した堎合はすべおをサヌビスの圢匏で公開するだけで十分です。

以䞋に、実隓するデヌタサンプルをいく぀か瀺したす。




All Articles