Asp.Net Core API Backend ve Xamarin.Forms İle Kelime Oyunu Bölüm 2 (Asp.Net Core SignalR ve Azure SignalR Service)
Selamlar,
Xamarin Forms Mobile App ve Asp.Net Core backend tabanlı kelime oyunumuzdan bir önceki yazımda bahsetmiştim. Bu 1 aylık macerada yaşadıklarımızı ve kullandıklarımızı örneklerle anlatmaya devam ediyorum
Bu yazımda kullanıcıları aynı üzerinde oynatmak ve online olarak göstermek için faydalandığımız teknolojiden – ki herhangi bir .net projenizde bir şekilde bir realtime ihtiyacınız varsa kullanmanızı önereceğim teknoloji olan – SignalR dan bahsedeceğim.
Aslında daha da doğrusu Asp.Net Signalr Core dan bahsedeceğim. SignalR ve SignalR Core farklı iki API. Asp.Net Core ile beraber yeniden geliştirilmeye başlandı.
Biliyorsunuz ki bir uygulama da realtime ihtiyacımız olduğunda kullanabileceğimiz birçok yöntem var, bunlar;
- Web Socket
- Server Sent Events (SSE)
- Long Polling
- Short Polling
vs gibi birden çok seçeneğimiz var. En tavsiye edilen en yeni yöntem tabii ki websocket kullanmak. Ama yazdığınız uygulama her ne ise (web-mobil-desktop vs) kullanacak olan clientları ve kullanacakları donanım ve yazılımları bilemeyeceğiniz için sadece kalkıpta tüm iletişimi WebSocket ile kurmak çok doğru olmayacaktır, size kullanıcılar kaybettirecektir.
Peki SignalR ne yapıyor?
SignalR önce gerçek zamanlı haberleşme isteyen client ın kontrolünü yapıyor. İlk denediği seçenek WebSocket kullanarak haberleşmek eğer client bu teknolojiyi desteklemiyorsa sırası ile SSE, LongPolling vs deneyerek en sonunda doğru yöntemi bulup iletişimi sağlıyor.
Bir asp.net core projemizde signalr kullanmakta çok basit artık. Biliyorsunuz ki Asp.Net core da artık koca MVC akışı bi pipeline olarak proje ekleniyor. SignalR da bu şekilde projeye ekleniyor ve kullanmaya başlıyorsunuz.
Öncelikle biz Asp.Ne Core API projemizde bunun için neler yaptık buna bakalım.
Microsoft.AspNetCore.SignalR paketini kullandık. Bu paketi eğer projenizde Microsoft.AspNetCore.App paketi varsa indirmenize gerek yok zaten bu paket mevcut halde gelmiş oluyor.
Bundan sonra yapmanız gereken Signalr ın projenizle ilişki kurduğu Hub sınıfını oluşturmak.
Bizim projemiz içerisinde GameHub adında bir hub ımız mevcut.Aşağıdaki gibi bir kısmını inceleyelim.
public class GameHub : Hub { public IServiceProvider Services { get; } public GameHub(IServiceProvider services) { Services = services; } public async void ConnectToHub(string username) { await Clients.Caller.SendAsync("ConnectedToHub", username, Context.ConnectionId); await Clients.AllExcept(Context.ConnectionId).SendAsync("NewUserConnectedToHub"); } ...
Burada constructor tarafında kullandığımız ServiceProvider a çok takılmayın şimdilik. Bu aşağıda başka metodlar da application service ler tarafında yazdığımız ve container a register ettiğimiz serviceleri almak için kullandığımız yöntem. constructor injection yapamazdık çünkü Hub sınıfı parametresiz Constructor ı bulup çağıracaktır.
ConnectToHub metodunda iki şey yaptık.
- Bu metodu çağıran Client ın kendisin deki –Clients.Caller diyerek- Client tarafta ki ConnectedToHub metodunu çalıştırmasını söyledik. Parametre olarak ta signalr ın kendi oluşturmuş olduğu Context.ConnectionId yi geçtik, çünkü kullanıcıyı kendi db mizde online olarak update etmek ve bu kullanıcıyla doğrudan haberleşmelerde bu ContextId yi kullanmamız gerekeceği için o bağlantı boyunca saklamak istedik.
- Kullanıcı bir şekilde disconnected olduğunda signalr client tarafta zaten böyle bir event i tetikleyecek bizde kullanıcıyı offline olarak işaretleyip sakladığımı ConnectionId sini sileceğiz, taa ki yeniden bağlanıp yeni connectionId sini öğrenene kadar.
- İkinci satırda ise, uygulamada zaten mevcut oturum açmış insanların telefonunda online user sayını arttırabilmek yani yeni birinin geldğini söyleyebilmek adına, Clients.AllExcept(Context.ConnectionId) diyerek yani bu metodu çağıran kişi dışında herkese bir sinyal göndererek client tarafta NewUserConnectedToHub metodunu çalıştırmak istediğimizi söyledik.
Hub tarafında bu ve benzeri başka metodların tanımı dışında birşey yok.
Gelelim bu signalr ı Asp.net core un request pipeline ına nasıl eklediğimize.
public void ConfigureServices(IServiceCollection services) { // CORS services.AddCors(); // MVC var mvc = services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); //SignalR services.AddSignalR() .AddAzureSignalR("Endpoint=...;AccessKey=...;Version=...;"); ........
Startup tarafındaki ConfigureServices metoduna yukarıda gördüğünüz gibi AddSignalR diyerek SignalR service lerini kullanacağımızı söyledik. Biz bu projede signalr ın backend tarafı scale edilme yönetmi olarak Azure SignalR Service i kullandığımız için AddAzureSignalR diyerek içerisine azure tarafında oluşturmuş olduğumuz service url i ve accesskey i verdik. Azure SignalService tarafına daha sonra gelicem. Şimdilik SignalR ile devam edelim.
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { ... app.UseMvc(); app.UseAzureSignalR(routes => { routes.MapHub("/game"); }); ... }
Configure metodunda ise UseAzureSignalR diyerek AzureSignalService kullanacağımızı ve hub ımızı register etmiş olduk. Eğer AzureSignalService kullanmadan sadece SignalR ı eklemek isteseydik kod aşağıdaki gibi olacaktı.
app.UseSignalR(builder => builder.MapHub("/game"));
SignalR Client (Xamarin Forms)
Api tarafında Signalr ı ne şekilde kurup kullandığımızdan bahsettim. Xamarin Forms projemizde de signalr kullanmak için yaptığımız ilk şey aşağıdaki paketi tüm forms projelerine indirmekti
Microsoft.AspNetCore.SignalR.Client (1.1.0)
Bundan sonra uygulamanın App.cs tarafında aşağıdaki gibi HubConnectionBuilder ı kullanarak kullanıcıyı hub a bağladık.
public App() { InitializeComponent(); Connection = new HubConnectionBuilder() .WithUrl("http://appserversitename.net/game") .Build(); Connection.Closed += async (error) => { IsConnectedToHub = false; await Task.Delay(new Random().Next(0, 15) * 1000); MessagingCenter.Instance.Send(this, "Disconnected"); var disconnectResult = await ApiClient.UserApi.DisconnectUser(new Models.Models.Dto.Request.User.DisconnectUserRequestModel { Username = InMemorySettings.GetCurrentUser().Username }); await Connection.StartAsync(); }; RegisterSignalrEvents(); ....
Connection ın kapanması durumunda signalr bizim için bir event tetikliyor burada da istediğimiz diğer işlemleri yazdık.
RegisterSignalREvents metodumuz da ise, API tarafında kullanıcı tarafında şu metodları tetikle dediğimiz metodları oluşturduk. örnek olarak API tarafı client tarafında ConnectedToHub metodu tetiklediğinde ne olacağını, Connection.On metodu ile parametreleri de vererek, içeriye yazdık.
private void RegisterSignalrEvents() { Connection.On<string, string>("ConnectedToHub", (user, connectionId) => { Xamarin.Forms.Device.BeginInvokeOnMainThread(async () => { try { await ApiClient.UserApi.ConnectUser(new Models.Models.Dto.Request.User.ConnectUserReqModel { ConnectionId = connectionId, Username = user }); var onlineUserCount = await ApiClient.UserApi.GetOnlineUsers(); Device.BeginInvokeOnMainThread(() => { MessagingCenter.Instance.Send(this, "OnlineUserCountReceived", onlineUserCount); }); InMemorySettings.GetCurrentUser().ConnectionId = connectionId; MessagingCenter.Instance.Send(this, "Connected"); IsConnectedToHub = true; } catch (Exception ex) { ... } }); });
Burada basitçe kullanıcıyı db de online olarak set edip, signalrdan gelen connection id sini saklayıp, uygulama tarafında başka yerleri xamarin.forms un messaging center ını kullanarak tetikliyoruz. Aşağıdaki gibi o an kaş kişi oynuyor bunu görmemiz için kullandığımız yöntem bu idi.
ApiClient.. şeklindeki haberleşme yapısına benzer yapıyı nasıl kurduğumuza bakmak için aşağıdaki yazılarımı okuyabilirsiniz.
- Tüm .Net Client Projelerimizde Ortak Kullanabileceğimiz Bir API Client yazalım.
- Tüm .Net Client Projelerimizde Ortak Kullanabileceğimiz Bir API Client yazalım Bölüm 2
Client tarafında bundan fazla bir numara yok.
Gelelim Azure SignalR Service i neden kullandığımıza. Daha önceleri SignalR kullandıysanız bir gerçek hayat senaryosunda ve büyük bir projede signalr ı ya azure service bus ile ya redis ile yada mssqlserver ile desteklemişsinizdir. Bunun temel sebepleri hem signalrı scalable kılmak hemde daha persistant bir yapı oluşturmak diyebiliriz. İşte artık Azure Signalr Service ile bunları düşünmekten kurtuluyorsunuz. Bu şöyle oluyor. Artık kullanıcılar eskiden olduğu gibi doğrudan sizin appserver ına bağlanmıyorlar, sizin appserver ınızdan bir url alıp (negotiation url) Signalr Service e bağlanıyorlar, sizin app server ınızda buraya bağlanıyor ve nihayetinde client ile appserver ınız arasında realtime persistant bir connection kurulmuş oluyor.
Aşağıdaki görsel bunu anlatıyor.
Asp.net Core SignalR için, Signalr Service, hub başına 5 adet websocket açıyor. Bu service i ücretsiz olarak maximum 20 concurrent user için deneyebilirsiniz. Bu da zaten test etmeniz için yeterli bir sayı. Daha sonra concurrent kullanıcınız arttıkça paralı tarifeye geçip binlerce kullanıcıyı concurrent birşekilde yönetme ve realtime birbirini bağlama işini Azure a bırakabilirsiniz.
Azure portal e girdiğiniz de All Services den Web sekmesini tıklayarak ücretsiz bir SignalR Service oluşturun ve en kısa sürede denemeye çalışın derim.
Bu yazımda da yazmış olduğumuz kelime oyunu için realtime kısmını hem server hem de client tarafta nasıl çözdük ve azure signal service i neden nasıl kullandığımızı anlattım.
Bir sonraki yazımda görüşmek üzere.
Azure Machine Learning Studio ile Machine Learning’e Giriş Bölüm 3 – Regression, Evaluate Model Yorumlamak ve ML Projemizi WebService olarak Publish ederek .Net Core Console Client tarafında Kullanmak
Selamlar,
Bir önceki yazımızda kaldığımız yerden devam ediyoruz. En son Machine Learning studio üzerinde bir proje oluşturmuş ve elimizdeki dayayı Regression problemi olarak çözmek için Azure ML Studio nun bize verdiği imkanları kullanarak incelemiştik.
ML Studio tarafındaki projenin son hali şu şekilde;
Elimizdeki datayı birtakım hazırlık aşamasından geçirdikten sonra, hem Lineer Regression hem de Bayesian Lineer Regression modelleri çıkaracak şekilde train etmiştik. En son bu iki train edilmiş model i ,test datamız ile test edip birer score model oluşturmuş, bunları birbiri ile kıyaslamak içinde bir Evaluate model eklemiştik.
Evaluate model in altundaki kutuya tıklayıp Visualize dediğimizde karşımıza aşağıdaki gibi bir ekran geliyor.
Bu Visualize ekranı, problemin tipine göre değişiklik gösterir. Bunları yorumlamak için biraz daha fazla ML detayına girmek gerek. Bu detaylara zaten farklı problem tipleri denerken gireceksiniz. Ama şuan bizim örneğimiz için söyleyebileceğim şey, en sonda ki Coefficient of Determination alanı bizim bu train ettiğimiz modelimizin test dataları ile test edilmesi sonucu ortaya çıkan başarı oranını veren kısım olduğu.
Üstteki 0.901461 yani %90 başarılı değer, Lineer Regression model e, altındaki %87 lik değer ise Bayesian Lineer Regression model e ait başarı sonuçları. Yani buna göre diyebiliriz ki, elimizde ki datayı Lineer Regression model ile train ettiğimiz de Bayesian a göre daha iyi bir sonuç almışız dolayısı ile şimdilik bunun üzerinden gidip bir Trained Model oluşturup bunu uygulamalarımızda kullanabiliriz. Ama en başından beri dediğimiz gibi, bu demek değil ki başka bir yöntemle ile train etmiş olduğumuz model imiz daha iyi sonuç vermeyecek. Verebilir de. elimizde ki datalar değiştikçe biz farklı yöntemlerle ile yeni trained modeller oluşturdukça, yani kısaca bu ML projesini kullanacağımız uygulama devam edeceği sürece bu ML projesi de yaşayacaktır.
Şimdi gelelim bu trained modellerden seçtiğimiz bir tanesini web service olarak publish etme kısmına.
Eğer bu örnekteki gibi ekranda birden fazla trained model var ise, öncelikle hangisi üzerinden gideceğinizi belirtmek için kullanacağınız train model in üzerinde bir kere tıklayın onu seçili hale getirin. Daha sonra aşağıda Deploy Web Service butonuna bastığınızda güzel küçük animasyonlar la ML projeniz için yeni bir sekme açılacak ve bir kaç değişiklik göreceksiniz.
Projeniz Predictive Experiment adında yeni bir tabda input ve outputları web service input ve webservice output olarak değişmiş şekilde duruyor olacak . Burada halen experiment üzerinde bazı değişiklikler yapıp Run diyebilirisiniz. Herşey düzgün gidip yeşil tikleri gördükten sonra, aşağıda Deploy Web Service (Classic) butonuna tıklayarak yeni bir pencereye geçiyoruz.
Burada web service olarak deploy edilcek olan ML modelimizin testi için bazı bilgiler veriyor. Service için gerekli Api Key den, daha popup üzerinde service i deneme imkanı sunan birçok buton buraa mevcut. Request/Response yanında ki mavi TEST butonuna basarsak karşımıza service in istediği inputları içeren bir popup çıkacak. Burada ki inputlara değer girerek, aracın fiyatının tahmini service imize yani oluşturmuş olduğumuz Trained Model imize orup öğrenmiş oluruz.
Yada BatchExecution yanında ki Test linkine tıklarsak buradan da yeni bir sayfaya yönleniriz.
Bu yeni sayfada test inputlarını girerek yanda predict edilmiş sonucu görebiliriz. Tamamen bizim service miz üzerinden bizim train ettiğimiz model kullanılarak oluşturulmuş sonuçtur bu tabii ki.
Yada yine bu sayfa üzerinde yukarıdaki sekmelerden Test yerine Consume sekmesine geçersek, bize farklı dillerd bu web service imizi nasıl çağıracağımız ile ilgili bilgi veren hatta bilgiden fazlası direk kodu veren sayfayı görürüz 🙂
Kodların üzerinde bu api ile haberleşmek için gerekli olan key leri bize gösterir. Alt sekmelerde de istediğimiz dil için olan seçeneğe bakıp kodu inceleyebiliriz.
Örneğin c# tarafında bu publish ettiğimiz web service kullanmamız için bize şöyle bir kod bloğu çıkarmış.
// This code requires the Nuget package Microsoft.AspNet.WebApi.Client to be installed. // Instructions for doing this in Visual Studio: // Tools -> Nuget Package Manager -> Package Manager Console // Install-Package Microsoft.AspNet.WebApi.Client using System; using System.Collections.Generic; using System.IO; using System.Net.Http; using System.Net.Http.Formatting; using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; namespace CallRequestResponseService { class Program { static void Main(string[] args) { InvokeRequestResponseService().Wait(); } static async Task InvokeRequestResponseService() { using (var client = new HttpClient()) { var scoreRequest = new { Inputs = new Dictionary<string, List<Dictionary<string, string>>> () { { "input1", new List<Dictionary<string, string>>(){new Dictionary<string, string>(){ { "Col1", "3" }, { "Col2", "1" }, { "Col3", "alfa-romero" }, { "Col4", "gas" }, { "Col5", "std" }, { "Col6", "two" }, { "Col7", "convertible" }, { "Col8", "rwd" }, { "Col9", "front" }, { "Col10", "88.6" }, { "Col11", "168.8" }, { "Col12", "64.1" }, { "Col13", "48.8" }, { "Col14", "2548" }, { "Col15", "dohc" }, { "Col16", "four" }, { "Col17", "130" }, { "Col18", "mpfi" }, { "Col19", "3.47" }, { "Col20", "2.68" }, { "Col21", "9" }, { "Col22", "111" }, { "Col23", "5000" }, { "Col24", "21" }, { "Col25", "27" }, { "Col26", "13495" }, } } }, }, GlobalParameters = new Dictionary<string, string>() { } }; const string apiKey = "abc123"; // Replace this with the API key for the web service client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Bearer", apiKey); client.BaseAddress = new Uri("https://europewest.services.azureml.net/workspaces/42d606822f144b4daf8ded5246815466/services/4b633daa9b0442aa973676e106a78d6d/execute?api-version=2.0&format=swagger"); // WARNING: The 'await' statement below can result in a deadlock // if you are calling this code from the UI thread of an ASP.Net application. // One way to address this would be to call ConfigureAwait(false) // so that the execution does not attempt to resume on the original context. // For instance, replace code such as: // result = await DoSomeTask() // with the following: // result = await DoSomeTask().ConfigureAwait(false) HttpResponseMessage response = await client.PostAsJsonAsync("", scoreRequest); if (response.IsSuccessStatusCode) { string result = await response.Content.ReadAsStringAsync(); Console.WriteLine("Result: {0}", result); } else { Console.WriteLine(string.Format("The request failed with status code: {0}", response.StatusCode)); // Print the headers - they include the requert ID and the timestamp, // which are useful for debugging the failure Console.WriteLine(response.Headers.ToString()); string responseContent = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseContent); } } } } }
Bu kodu alıp yeni bir console projesi açıp yapıştırdığınızda, az önce publish ettiğiniz web service iniz ile haberleşip sonuç aldığınızı göreceksiniz.
Yaptıklarımıza bir özet geçecek olursak;
- Temel seviyede bir ML bilgisi ile Azure Machine Learning Studio ya giriyoruz 🙂
- Üzerinde çalışacağımız DataSet ile, ilgili problem tipimize göre olan model veya algoritmaları ekrana sürükleyip bırakıyoruz. RUN diyerek sonuçlarına bakıyoruz.
- İstediğimiz sonucu veren bir model i seçip, Web service olarak tek tıkla publih ediyoruz.
- Ve bu service i artık istediğimiz client taraftan çağırıp kullanbilir hale geliyoruz.
Bunları hala yazarken bile inanmakta zorluk çekiyorum bu kadar işin bu kadar kolay halde yapılabildiğine. İlk bir kaç denemeden sonra hız kazandığınızda, resmen oyun oynar gibi ML projesi testleri yapar buluyorsunuz kendinizi Azure ML Studio sayesinde. Tabii başka şeyler denedikçe de daha fazla şey öğrenmeye başlıyorsunuz.
Tabii tüm bunları yapınca insan bir an kendini DataScientist sanabiliyor 🙂 ama bunun için bu yaptıklarımızın yanında daha çoooo..ook iş var bunun unutmamak lazım. Yazının başında dediğimiz gibi, günümüzde herhangi bir uygulama artık işininin içerisine bir şekilde ML çözümleri katmak istiyor, e her firmada kendi alanında uzman olan data scientist bulamadığına göre, iş gün sonunda biz developer lara düşüyor, ve Azure ML sayesinde bu iş göreceli olarak az bir eforla gerçekleştirilebilir oluyor.
Bir sonraki yazımda görüşmek üzere.
Azure Machine Learning Studio ile Machine Learning’e Giriş Bölüm 3 – Machine Learning Studio Üzerinde Proje Oluşturma
Selamlar,
Önceki iki yazımda temel olarak Machine Learning nedir bundan bahsettim. Bu yazımızda öğrendiklerimizi Azure Machine Learning Studio tarafında uygulamaya başlayalım. Önceki iki yazıyı okumadıysanız buradan başlamanızı tavisye ederim. Eğer temel seviyede Machine learning bilginiz var ise, doğrudan Azure üzerinde uygulama kısmı için bu yazıdan devam edebilirsiniz.
Detaya girmeden önce neye benzer birşey ile karşılaşacağımızı şöyle bir göstereyim.
Evet resimdeki gibi baya sürükle bırak işlemleri yaparak bir ML projesi oluşturup bunu publish edeceğiz 🙂
Önce örneğimizden bahsedelim. Bir araba listesi elimizde olacak. Birçok özelliği ve satış fiyatları bulunan bir datasetinin içerisinden yola çıkacağız. Soracağımız soru şu olacak.
Yeni gelen ve şu şu özelliklere sahip arabanın fiyatı ne olmalıdır.?
Belki de bu şekilde bir ilan sitemizde insanların girdiği araba ilanlarının fiyatlarının tutarlı olup olmadıklarını ölçeceğiz, belki onlara geri bildirimler de bulunup;
“senin arabanın özelliklere sahip arabalar genelde şu fiyat civarında satılıyor.Fiyatını güncelle daha kısa sürede aracını sat” diyeceğiz.
Bu örnek için ilgili dataset i ben https://archive.ics.uci.edu/ml/index.php adresinden aldım. Bu Kaliforniya Üniversitesinin, Irvine kampüsüne ait, tamamen ML projeleri denemeleri için oluşturulmuş datasetler i barındıran bir site. Data setler ile beraber, featureların açıklamaları, tahmin edilmek istenen şeyler gibi birçok temel ihtiyaç burada mevcut.
Bu örneğimiz için ben şu dataset i kullandım;
https://archive.ics.uci.edu/ml/datasets/automobile
datalardaki attribute-feature-column isimleri ve açıklamaları şöyle;
Attribute: Attribute Range:
—————— ———————————————–
1. symboling: -3, -2, -1, 0, 1, 2, 3.
2. normalized-losses: continuous from 65 to 256.
3. make: alfa-romero, audi, bmw, chevrolet, dodge, honda,
isuzu, jaguar, mazda, mercedes-benz, mercury,
mitsubishi, nissan, peugot, plymouth, porsche,
renault, saab, subaru, toyota, volkswagen, volvo
4. fuel-type: diesel, gas.
5. aspiration: std, turbo.
6. num-of-doors: four, two.
7. body-style: hardtop, wagon, sedan, hatchback, convertible.
8. drive-wheels: 4wd, fwd, rwd.
9. engine-location: front, rear.
10. wheel-base: continuous from 86.6 120.9.
11. length: continuous from 141.1 to 208.1.
12. width: continuous from 60.3 to 72.3.
13. height: continuous from 47.8 to 59.8.
14. curb-weight: continuous from 1488 to 4066.
15. engine-type: dohc, dohcv, l, ohc, ohcf, ohcv, rotor.
16. num-of-cylinders: eight, five, four, six, three, twelve, two.
17. engine-size: continuous from 61 to 326.
18. fuel-system: 1bbl, 2bbl, 4bbl, idi, mfi, mpfi, spdi, spfi.
19. bore: continuous from 2.54 to 3.94.
20. stroke: continuous from 2.07 to 4.17.
21. compression-ratio: continuous from 7 to 23.
22. horsepower: continuous from 48 to 288.
23. peak-rpm: continuous from 4150 to 6600.
24. city-mpg: continuous from 13 to 49.
25. highway-mpg: continuous from 16 to 54.
26. price: continuous from 5118 to 45400.
dataset i indirip bir editörde açtığınızda da şöyle bir csv data göreceksiniz.
verdiğim linkten data set ile alakalı daha detaylı bilgi alabilirsiniz.
Şimdi geçelim azure tarafına. Azure tarafın portal kısmına giriş yaptıktan sonra.
https://portal.azure.com/#home dashboard da arolan bir resource unuz üzerinden yada yeni bir resource oluşturarak işleme başlayabilirsiniz.
Eğer bir account unuz yoksa ücretsiz olarak bir azure account unu buradan hızlıca ve ücretsiz olarak açabilirsiniz.
Ben varolan bir resouce grubumun altına yeni bir Macine Learning Studyo workspace i açtım. Aşağıdaki resimde görebilirsiniz.
Sizde sol taraftaki ana menüden All Service e tıklayıp, service ler içerisinde AI + Machine Learning sekmesini seçerek yeni bir workspace oluşturun.
Oluşturmuş olduğunuz Azure Machine Learning Workspace e tıkladığınızda sağ tarafta gelen detayların alt kısmında aşağıdaki resimde görmüş olduğunuz gibi bir kaç yardımcı link görünecektir. Buradan Launch Machine Learning Studio yu tıklayarak yeni bir browser tabında yeni bir siteye yönlendirileceksiniz.
Oluşturmuş olduğunuz worksapce in region ına göre yönlendiğiniz site
https://europewest.studio.azureml.net/
benzeri bir site olacak. Burada yeniden login olmanız istenebilir. Azure account nuz ile login olduktan sonra karşınıza aşağıdaki gibi bir ekran gelmeli.
Burada sol tarafta birkaç menü var. Experiments kısmı daha önce oluşturmuş olduğunu ML projelerinizin listeleneceği kısım.
WebServices tabında ML projesini tamamlayıp bir web service olarak publish ettiğiniz taktirde önceden yayınladığınız web serviceleriniz gelecektir.
DataSets kısmıda daha önceden buraya deneme amaçlı upload ettiğiniz datasetlerinizin olduğu kısım. Bu tab a tıklayarak daha önce buraya attığınız datasetlerinizi görebilirsiniz.
Trained Model tabında ise tahmin edeceğiniz gibi daha önceden train ettiğiniz modeller listelenecek.
Experiments tabına geri gelelim. Karşımıza template seçebileceiğimiz yeni bir alt pencere açılacak. Burada varolan ML projelerini açıp inceleyebilir, kendiniz yeni bir boş experiment başlatabilirsiniz.
Boş bir experiment açtığımızda karşımıza aşağıdaki gibi bir ekran gelecek.
Bu noktadan itibaren artık sürükle bırak yönetmiyle ML projemize başlayabiliriz.
İlk olarak sol tarafta neler var hızlıca bir baktığımızda, önceki yazılarımızda bahsettiğimiz terimleri göreceğiz. Örneğin Machine Learning menüsünü genişlettiğinizde farklı ML problemi seçeneklerini görebilirsiniz.
Buradan da örneğin Regression sekmesini genişlettiğinizde bir regression problemi için, Azure Machine Learning studyonun size hali hazırda sunduğu algoritmaları görebilirsiniz.
Burada her bir adımı detaylıca anlatmak uzun süreceği için resimleri paylaşıp üzerinden anlatacağım. Ama adım adım gittiğimiz bir video da hazırlamak niyetindeyim. .Nt Conf 2018 Istanbul Etkinliğine gelenlerle beraber adım adım hazırlamıştık bunu. Aynı şekilde bir video çekeceğim.
Şimdilik ilk data preperation adımını yaptığımız kısımlara bakalım.
Sol taraftaki Saved Datasets menüsünün altında My Dataset daha önce azure ML studio ya atmış olduğum txt formatındaki data seti ekrana sürükleyip bırakıyorum. Sonrasında Sol menüde Data Transformation menüsünde bu txt dosyası üzerinde bazı düzenlemeler yapıyorum. En son data yı hem test hem de train etmek için 2 farklı data set e ayırıyorum. Bunlardan %70 lik ayırdığım kısmı model imi train etmek için, kalan %30 luk kısmı da train edilmiş modeli mi test etmek için kullanacağım.
Split Data kısmında sonraki kısım ise şu şekilde ilerliyor.
SOl tarataki ML menüsünden iki farklı algoritma sürükleyip bırakıyorum. ama bunu sırayla yapmakta fayda var.Çünkü genelde her bir sürükle bırak işleminden sonra aşağıdaki RUN butonuna basarak herbir sürüklenmiş item ın yanındaki yeşil tiki görmeniz gerekiyor.
Önce LineerRegression algoritmasını sürükleyip ekrana bıraktıktan sonra. Onun altın bir Trained Model sürüklüyorum. Bu trained model in sol üst tarafına algoritmayı, sağ üst taraına ise split data kısmının sol tarafından yani traine edilmek için ayırdığım data yı sürükleyip bırakıyorum. Bu model Train olduktan sonra bana sonuçları vermesi için ekrana bir Score Model bırakıyorum. Bu score modelin ın sol üst kısmına trained modeli mi, sağ üst kısmına ise split data item ının sağ alt köşesinden gelen test datamı sürükleyip bırakıyorum. Ve bu score model den gelen sonuçların analizini görmek için de son olarak ekrana bir adet Evaluate model bırakıyorum. Tüm işlemleri RUN diyerek çalıştırdıktan sonra Evaluate Model imin altındaki yuvarlağa tıklayıp Visuzalize diyerek çıktıları görebilirim.
Burada bu yazıyı bırakıp bir sonraki bölümde bu çıktıları yorumlama ve web service olarak bu train edilmiş modelimiz -i publish etmeye a bakalım.
Bir sonraki yazımda görüşmek üzere.

Azure Machine Learning Studio ile Machine Learning’e Giriş
Selamlar,
20 Ekim Cumartesi günü Microsoft Türkiye’de gerçekleştirmiş olduğumuz .NetKonf Türkiye etkinliğinde bir çok değerli konuya değindik. İki farklı sunumda iki farklı konu paylaştım gelen arkadaşlarımızla. Çok keyifli geçen bu etkinliğin ardından anlattıklarımı buraya da daha detaylı olarak yazmak istedim.
Yaptığım iki sunum şunlardı;
- Machine Learning with Azure Machıne Learnıng Studio
- Xamarin forms 3.0-1-2-3 features and samples
Bu iki konudan ilkine bakalım bu yazımızda. Bugünlerde artık çokça Machine Learning, AI, DeepLearning vs vs terimlerini duymaya başladığınıza eminim. Birçok ürün herhangi bir reklamında bu terimlerle yer vermeden geçmiyorlar. Peki bizde bir data scientist olmadan kendi projelerimizde ML çözümleri uygulayamaz mıyız?
Tabii ki uygulayabiliriz. Bilgi düzeyimiz bir DataScientist insanının matematik, istatistik ve veri analizi kadar olmasa bile, şunu söyleyebilirim ki, elimizde yeterli derece de analiz edip tahminler yürütmek istediğimiz veriler var ise, kendi uygulamamıza da bu ML çözümlerini bir özellik katmanın özellikle Azure Machine Learning ile ne kadar olduğunu görünce çok şaşıracaksınız.
Tabii hiç bilmeden de olmaz değilmi, bir AI uzmanı olmasak da, öncelikle bu yazımızda bu Machine Learning denen şey nedir, ne değildir bundan bahsedelim. Sonra Azure un bize sağladığı kolaylıkları ve çözümleri görelim.
Machine Learning tam olarak şudur ;
:). Komik gelebilir, ama akademik camia da insanlar senelerdir matematik ve istatistik bilimi üzerinde çalışarak birçok algoritma geliştirdiler zaten. Bu ML in son zamanlarda çok popüler olmasının temel 3 sebebi var;
- Artık çok sayıda denemeler yapıp sonuçlar elde edeceğimiz algoritmalar oluşmuş ve bunlar denenmiş sonuç alınmış durumda
- Artık bilgisayarlar eskisinden çok daha güçlü, bu algoritmalar, belli problemler üzerinde çalıştırılarak çeşitli simülasyon ve analizler yapmak çok daha masrafsız hale gelmiş olmakta.
- Artık çok çok fazla data birikmiş durumda. Her konuda etrafımızda tonlarca data mevcut diyebiliriz.
Bu 3 temel madde bir araya geldi mi artık MachineLearning konuşmakta kaçınılmaz oluyor.
Peki yazının başında bahsettiğim gibi, Machine Learning ile beraber duymaya başlamış olduğunuz daha başka terimler de mevcuttur tahminimce
bunlar;
- Artificial Neural Networks
- Deep Learning
- Bayesian Networks
- Artificial Intelligence
gibi bu liste uzar bile. Peki bunlar nerede çakışır? çakışır mı? Daha büyük resme baktığımız zaman ne nereye oturur buna bakalım.
Yukarıdaki resimde kısaca özetlenmiş bir hali mevcut. Aslında bakarsanız özet şu;
- DeepLearning, Artificial N. Networks, vs vs hepsi özelinde Machine Learning kullanan ve farklı algoritmalar ile farklı sorunlara farklı yaklaşımlar getiren birer özel çözümlerdir. Ve tüm bu çözümler kendi içerisinde Machine Learning kullanırken, nihai amaçları ise, herşeyin özel çözümleri ile sonuçlanabilir olduğu bir Yapay Zeka (Artificial Intelligence) üretme çabasıdır.
Peki, madem artık biliyoruz ki tüm duyduğumuz terimler içerisinde Machine Learning daha da core bir seviyede kullanılıyor. O zaman şunu anlamaya çalışalım. Machine Learning ne demek?
Aslında biraz süslü bu tanımın arkasında yatan şey, insan gözüyle ve hızıyla bakıp çıkarımlar yapmamızın çok uzun süreceği şeyleri, bilgisayara aktarıp onun yapmasını sağlamak.
Yukarıda ki resme bir bakalım. Elimizde olan bu kredi kartı satışlarının fraud(sahte-hileli) olup olmama durumunu içeren kayıtlar sadece bu kadar olsa, bu datalara bakıp bir süre sonra birtakım çıkarımlarda bulunabilirdik değil mi?
Örneğin;
- 20 ile 30 yaşları arasında, Amerika da verilmiş, Rusyada kullanılmış ve 1000$ üzerinde olan işlemlerde fraud olma riski yüksek diyebilirdik.
Ama bu datanın milyonlarca kayıttan oluştuğunu düşünün. Üzerine bir de bu kadar az kolon yerine onlarca kolondan oluşan farklı detaylar içeren kayıtlar olduğunu düşünün.
Bu durumda bir yada onlarca insanın bu datalara bakıp çıkarımlar yapması yerine, yıllardır geliştirilmiş algoritmaları ve günümüzün güçlü bilgisayarlarını kullanıp bu işi onlara bıraksak daha kolay olmaz ve kısa sürmez mi? Şüphesiz. İşte tam da bu işi bilgisayarlara bırakalım o zaman dediğimiz noktada Machine Learning devreye girmiş oluyor.
Peki bir de büyük resimde bu Machine Learning nasıl işliyor buna bakalım.
Aslında en üstten baktığımızda tüm süreç bu kadar desek yanlış olmaz 🙂 tabii her zaman olduğu gibi detaylara indikçe boğulmalar olacaktır. Ama özetle olay şu;
- Elimizde bir tek bir kaynaktan yada farklı kaynaklarda olan takım datalar var. Bunları bir araya getirip incelemek istediğimiz tek bir data set i olarak birleştirelim. (Burası başlı başına olay zaten, sadece bunun için bile bir ton tool var)
- Daha sonra bizim yukarıdaki örnekte, insan gözüyle bir kaç saniyede yaptığımız gibi, bazı benzerlikler bulmaya çalışalım bu data içerisinde. Bunu yaparken de var olan onlarca data algoritmayı deneyerek başlayabiliriz.
- Artık bir benzerlik bulduğumuzu düşündüğümüz anda, bunu bir model olarak benimseyelim ve bundan sonraki datalara bakarken dataların bu modele e ne kadar uyup uymadıklarına bakalım.
Tüm süreç dediğimiz gibi aslında en dışarıdan bakıldığında bu kadar. Ama bu sürecin kendisi tamamen kendini tekrar eden bir süreç. Bunu unutmamak lazım. Yani bir Machine Learning Projesi, hiçbir zaman tam olarak bitti diyemezsiniz, çünkü yeni veri akışı oldukça, sizin data setleriniz değiştikçe, uyguladığınız algoritmalar, bulduğunuz benzerlikler ve nihayetinde ortaya çıkan modeller değiştikçe tum bu yukardıdaki resimdeki süreç aslında başa sarıp sarıp duracaktır. Yani sürecin kendisi tamamen iterative – kendini tekrar eden- bir süreçtir.
Günümüzde artık İş adamlarıi yazılımcılar, datascientist ler vs neredeyse herkes bu ML işine, işinin bir kısmında bir takım sorunlarına çözüm bulmak için ihtiyaç duyuyor.
Bu kadar çok adı geçmiş ken bir de şuna bakalım. Kim bu data scientist?
Data Scientist olmanız için 3 temel şart vardır diyebiliriz.
- İstatistik ve haliyle Matematik Bilgisi
- Programlama Bilgisi
- Belli bi Domain de (örn; bankacılık) iş anlamında yüksek derecede bilgi.
ilk iki madde olsa bile kendinize ben her konuda data scientist im demek, bir api yazıp, html editleyip, kendinize ben fullstack developer ım demek gibi olabilir. Çünkü veriyi yorumlayacığınız alanda bilgi sahibi olmak size, hangi algoritmaları seçmeniz gerektğinden hangi data setleri ile çalışmanız gerektiğine kadar birçok alanda fayda sağlayacaktır.
Peki, yazının başında dediğimiz gibi bir data Scientist olmadan da ML çözümleri üretemez miyiz üretebiliriz. Cloud ortamlarda bunu bize servis olarak sunan büyük küçük birçok vendor var.
Yukarıda gördüğünüz gibi Clouda olarak bu hizmeti veren en büyük iki firma Microsoft ve Amazon. Biz bunlarda Azure üzerinde neler yapabileceğimize bakacağız.
Bir ML projesinin temel düzeyde ne aşamalardan oluştuğunu gördüğümüze göre Azure tarafında büyük resimde işler nasıl işliyor buna bakalım.
Birçok farklı kaynaktan datanızı Machine Learning Studio üzerinde sürükle bırak (evet yanlış okumadınız baya sürükle bırak=)) yöntemiyle belli algoritmalar üzerinden geçirip, ortaya bir iki tıkla bir web service çıkartıyorsunuz. Ve bu servisi Web- mobil, yada diğer ihtiyaç duyduğunuz yerlerde kullanmaya başlıyorsunuz.
Bu yazıyı burada noktalıyorum. Bir sonraki yazımda Machine Learning in biraz da terimsel taraflarına bakıp. Azure tarafına giriş yapalım.
Bir sonraki yazımda görüşmek üzere.