Tezli Yüksek Lisans Eğitimi Hakkındaki Değerlendirmelerim ve Özyeğin Üniversitesi Veri Bilimi Tezli Yüksek Lisans Programı Hakkındaki Deneyimlerim

Herkese Merhaba,

Bu yazı ile, uzunca bir süredir aklımda olan ve yazmayı planladığım bir konu üzerindeki fikirlerimi paylaşmak istiyorum. Aslında yazı içeriğini “Yüksek Lisans Yapmak Gerekli midir?” gibi bir eksende kaleme almak istesem de internet üzerinde onlarca nitelikli yorumun olduğunu gördükten sonra bundan vazgeçtim. Yapılan değerlendirmelerin büyük bir çoğunluğuna katıldığımı söylemek isterim.

Yüksek lisans programlarını, tasarımlarını göz önünde bulundurduğumuzda iki farklı şekilde incelemek mümkün. => Tezli veya Tezsiz. Tezli programların yükümlüküleri ile tezsiz programların yükümlülükleri birbirinden farklılıklar göstermekte ve gün sonunda da elde edeceğiniz sonuçların etkileri de birbirinden farklı olmakta. Örneğin tezsiz yüksek lisans sonucunda elde ettiğiniz diploma ile bir doktora programına başvuru yapamazken (lisans sonrası bütünleşik doktora programları hariç), tezli yüksek lisans diploması ile bir doktora programına başvurabilmektesiniz. Bu sonuçtan da çıkarabileceğimiz üzere tezli programların öğrenci üzerindeki çıktılarından en önemlisi de öğrencinin güncel teknikler ve yaklaşımlar ile bilimsel bir araştırma yapabilmesini öğreterek bilime pozitif bir katkı sunması hususunda onu yetiştirmektir. Doktora başvurularında tezli yüksek lisans diploması aranmasının temel mantığının da bu olduğunu söylemek bu bağlamda pek de yanlış olmayacaktır.

Tezli ve tezsiz programlar arasındaki temel farkın ne olduğuna değindikten sonra hayatınıza getireceği yükü de mutlaka değerlendirmek gerekiyor. Özellikle profesyonel iş hayatına devam eden kişiler için tezli programlar akademinin sizden beklentilerini karşılayabilmeniz adına oldukça zorlayıcı olabiliyor. Dolayısıyla yüksek lisans yapma kararı almadan önce mutlaka bu ayrıntıları ve başvuracağınız program için mezuniyet koşullarını gözden geçirmekte fayda var.

Çok basit anlamda temel kavramlardan bahsettikten sonra şimdi benim yüksek lisans sürecinde yaşadığım deneyime geçebiliriz.

Motivasyon

Eğer profesyonel bir çalışansanız ve bir yüksek lisans programına kayıt olup akademik olarak çalışma da yapmak istiyorsanız bunun için bence ciddi motivasyonunuzun olması gerekiyor. Çünkü tezli yüksek lisans “aile baskısı”, “çevre baskısı”, “sürü psikolojisi” vb sebepler ile asla altına girilecek bir yük değil. Motivasyonunuz o kadar baskın gelmeli ki, hem ders aşamasında yaptığınız uzun çalışmalarda hem de tez aşamasında yaptığınız yoğun ve uzun soluklu araştırmalarda yılmayın. Çünkü yoğun iş temposu üzerine bu denli kapsamlı programlara kayıt olmak için yeterince motive olmadığınız da sonuç programdan ayrılmaya kadar gidebiliyor. Çoğu öğrenci tezli programları bu nedenlerden dolayı bırakıyor. Dolayısıyla iş hayatı ile beraber bu yükü çekebilmek için mutlaka güçlü motivatörlere ihtiyaç fazlası ile var.

Peki lisanstan mezun olduktan 7 yıl sonra beni tekrardan öğrenci yapacak ve yoğun iş tempomun üzerine müthiş bir yük ekleyecek olan tezli yüksek lisans yapma kararımda ki temel motivasyon neydi? Yüksek lisans eğitimime başlamadan önce toplamda 7-8 yıldır sektörde bilgisayar mühendisi olarak çalışan biriydim. Türkiye’nin önde gelen IT organizasyonlarında veri mühendisliği, iş zekası, büyük veri çözümleri, yapay öğrenme ve veri bilimi konularında projeler geliştiren bir yazılım mühendisiydim. Veri ambarı sistemlerinde çalışmaya başladığım kariyerim, veri ekosisteminde yapılan teknolojik gelişmeler ile önce büyük veri sistemlerinde belirli bir uzmanlık edinmeme daha sonra da makine öğrenimi temelli uygulamalar geliştirmeye kadar uzandı. Makine öğrenimi ve veri bilimi projelerini geliştirmeye başladığımda daha çok online eğitimler ile kendimi destekleyerek belirli bir aşamaya gelmiştim ancak bulunduğum noktada sorumlu olduğum ürün ve servisleri daha ileriye götürmek için edindiğim bilgi ve yetkinlik asla bana yeterli gelmiyordu. Çünkü dokunduğunuz modellerin hangi veri setlerinde nasıl tepkiler vereceğini anlayabilmek online uygulamalı eğitimlerin çok ötesinde bir yetkinlik gerektiriyordu. Tam da bu noktadan hareketle ve yaklaşık 6 ay kadar da düşündükten sonra tezli bir yüksek lisans programının bana bu konuda katacaklarının, beni istediğim noktaya ulaştırmada oldukça önemli bir şey olacağına ikna oldum ve kararımı vermiş oldum. Buradaki motivasyonum oldukça iyidi çünkü öğreneceğim şeyler, yapacağım araştırmalar günlük hayatta iş yerinde geliştirdiğim projelere de katkı sunacak hatta onları daha da ileri götürmeme olanak sağlayacaktı. Bu motivasyon beni, tezli yüksek lisans eğitiminin hayatıma getireceği yükü göğüsleyebileceğim inancının oluşmasını sağladı.

Okul ve Bölüm Seçimi

Yüksek lisans yapma kararını aldıktan sonra okul seçim fazı benim için çok sancılı olmadı çünkü o dönem çalıştığım şirketin Özyeğin Üniversitesi ile bir anlaşması vardı. Bu anlaşma kapsamında çalıştığım kurumun sponsorluğunda ve zaman konusundaki destekleri ile bu üniversite de tezli yüksek lisansı daha optimum şartlarda şirket desteği ile gerçekleştirebilecektim. Okulu biraz araştırdıktan sonra okul seçiminin de çok doğru bir karar olduğuna ikna oldum ve 2018 yılında Özyeğin Üniversitesi – Bilgisayar Mühendisliği Tezli Yüksek Lisans programına kayıt oldum.

Ders Aşaması

Bölüme kayıt olmadan önce açılan dersleri ve içerikleri de uzunca bir süre incelemiştim. Çünkü klasik bir bilgisayar mühendisliği master’ı yapmak istemiyordum. Temeldeki başlama motivasyonum olan alanları daha net anlayabileceğim ve derinlemesine bilgiler edinebileceğim dersler almak istiyordum. Özyeğin Üniversitesinin esnek müfredatı da bu amaca tam olarak hizmet ediyordu. Dolayısıyla Fen Bilimleri Enstitüsünde, bölüm farketmeksizin açılan ve ilgimi çeken dersleri alabilmemi sağlayan bir alt yapı sunulmuştu. Ben de ağırlıklı olarak Yapay Zeka ve Veri Bilimi konusunda ilerlemek istediğim için 7 seçimlilik dersinin tamamını bu konulardan seçerek aldım. Şunu net bir şekilde söyleyebilirim ki Özyeğin Üniversitesinin akademik eğitimi ve araştırma vizyonu oldukça iyi. Akademik kadrosunun neredeyse tamamı ya doktora için yada doktora sonrasında araştırma yapmak için yurt dışında önemli üniversitelerde bulunmuş kişilerden oluşuyor. Bu durum da haliyle derslerin, projelerin, ödevlerin, sınavların ve araştırmaların oldukça zorlu geçmesine neden oluyor. Bu da ister istemez akademik alt yapınızın gelişmesine neden oluyor. Birçok dersin dönem sonunda, bir makaleye dönüşecek seviyede akademik çıktılar üretiliyor. Bu bağlamda aldığım akademik eğitimden inanılmaz memnun kaldım ve öğrendiğim bir çok şeyi iş hayatında da uygulama fırsatı buldum.

Ders aşamasında aldığım derslerin listesi de aşağıdaki gibidir.

– Mathematical & Statistical Foundations of Machine Learning
– Introduction to Artificial Neural Networks and Machine Learning
– Introduction to Deep Learning
– Deep Natural Language Processing
– Data Mining
– Data Science
– Customer Analytics

Bölüm Değişikliği

Özyeğin Üniversitesi Fen Bilimleri Enstitüsü 2019 yılında Veri Bilimi Tezli Yüksek Lisans programını açtı. Ben de bölümün müfredatını incelerken zorunlu ders havuzundaki derslerin tamamını aldığımı ve seçmeli derslerin de çoğunu tamamlamış olduğumu gördüm. Ayrıca Bilgisayar Mühendisliği yüksek lisans derecesinin de uzmanlaştığınız alanı sözel olarak yeterince anlatamadığını düşünerek akademik danışmanım ile de konuyu müzakere ederek bölüm değişikliği kararı aldım ve kayıdımı Veri Bilimi Tezli Yüksek Lisans programına aldırdım. Program değişikliği ile beraber almış olduğum tüm dersler sayılarak kayıpsız bir şekilde geçişim tamamlandı.

Veri Bilimi programı ile ilgili detaylı bilgiye aşağıdaki linki tıklayarak ulaşabilirsiniz.

https://www.ozyegin.edu.tr/tr/veri-bilimi-yuksek-lisans-programi

Özyeğin Üniversitesi Veri Bilimi yüksek lisans programı, hem oluşturulan müfredat ile hem de ders aldığınız akademisyenlerin kalitesi ile cidden çok iyi hazırlanmış. Akademik bilgi seviyenizi çok iyi noktalara getirme fırsatını yakalamanızın yanında modern bilimsel araştırma tekniklerini de çok iyi derece de öğrenebileceğiniz akademik bir program. Özellikle benimle aynı motivasyona sahip bir çok profesyonele fazlaca faydasının olacağını düşünüyorum.

Tez Aşaması

Kağıt üzerinde yüksek lisans mezuniyet yükümlülüklerini incelediğinizde “Yüksek Lisans Tez Çalışması” tek bir satır olarak görünse de, tez bence bir yüksek lisans eğitiminin en az %50’si. Tabi ki bu benim deneyimlerim ile ilgili bi bir öngörü, mutlaka daha rahat bu süreci yönetenler ve götürenler oluyordur ancak çok zor olduğunu ve uzun bir maraton olduğunu söylemek gerekir diye düşünüyorum.

Tez aşamasını 3 temel adımla projelendirmek mümkün.

-Tez Konusunun Belirlenmesi

Tez konusu bir yüksek lisans öğrencisinin daha bölüme kayıt olduğu anda düşünmesi gereken en önemli konulardan bir tanesi. Bu konunun belirlenmediği her günü, olası mezuniyet tarihinizin sonuna rahatlıkla ekleyebilirsiniz. Dolayısıyla çok önemli bir konu. Genel öğrenci davranışı “Ders kısmını bir halledeyim. Tez’e sonra bakarız.” şeklinde olsa da bu davranışın okulu uzatmaktan başka bir şeye yaramadığı açıktır. Ancak öğrencilerin büyük bir bölümünün tez çalışmasını hangi konu üzerinde yapacaklarını belirleyebilmeleri için de belirli sayıda ders almaları ve akademisyen tanımaları gerekliliği de açık konulardan bir tanesidir. Çünkü tez danışmanı belirleyebilmek için hocaları tanımak ve onların çalışma alanlarını anlamak gerekiyor. Bunun için ise en azından bir kaç tane ders alıp bu deneyime ulaşmak mümkün olacaktır. Burada sağlıklı bir karar verebilmek için kendinize 1 veya maksimum 2 yarıyıl süre tanımak, hem çalışılan konuyu belirlemede hem de çalışılacak akademisyeni bulmada yardımcı olacaktır.

Benim burada yaşadığım kendi deneyimim de şu şekilde oldu. İkinci dönemimin sonunda tez hocamı ve tez konumu belirlemiştim ve yaklaşık olarak iki dönem bu konu üzerinde çalışmıştım. Ancak bir iş değişikliği yapmam nedeni ile çalıştığım tez konusunu değiştirmek zorunda kalmıştım. Çünkü çalıştığım tez konusu çalıştığım kurumunun bir ar-ge projesi olacaktı. Doğal olarak tezi çalışırken konu ile ilgili her türlü geliştirmeyi kurum bünyesindeki makineler ve veri ile gerçekleştirmek zorundaydım. Dolayısıyla iş değişikliği ile beraber bu tezi devam ettirme şansım ortadan kalktı ve tekrardan bir tez konusu belirleme sürecine girmiş oldum. Bu gerçekten çok zor ve yıpratıcı bir süreç oluyor. Tez konusu belirlerken bir sürü makale okumanız gerekiyor. Literatüre fazlası ile hakim olmanız gerekiyor ki çalışacağınız alanda pozitif bir katkı sunabilin. İş değişikliğimi takiben bir kaç ay içerisinde tez konumu yeniden bularak tekrardan çalışmalara hızla başladım. Ancak bu bana 2 döneme mal olmuştu.

-Tez ile ilgili teorik çözümün ortaya koyulması

Tez konusu belirledikten sonra yapılması gereken maddelerden biri de yapacağınız tez çalışmasının teorik olarak detaylandırılması. Yani tez olarak ortaya koyacağınız çalışmayı yaptığınız araştırmalar ile beraber neye dönüşeceğini, hangi yöntem ve metodları uygulayacağınızı bunun sonunda ne gibi beklentilerinizin olduğunu raporlamak durumundasınız. Bu yazılacak rapor tezinizi geliştirirken elbette değişebilir, güncellenebilir, eklemeler, çıkarmalar yapılabilir ancak ana hatları ile tezinizin teorik ve pratik çerçevesini çizer nitelikte olmalıdır. Ben bu fazı 1 aylık bir çalışma ile geçmiştim. Çünkü konu belirlerken yaptığınız araştırmalar bu adım için çok büyük bir girdi oluyor. Dolayısıyla konu belirlerken yaptığınız çalışma ne kadar detaylı ise bu fazı geçme süreniz de o kadar kısalabilir.

-Tez çalışmasının üretilmesi ve tez raporunun yazılması

Bu aşamada artık çerçevesini çizdiğiniz çalışmayı danışmanınızın liderliğinde uygulamaya başlıyorsunuz. Uzunca bir süre ortaya koyduğunuz düşünceyi, fikri veya yöntemi farklı parametreler ile gerçekliyor sonuçları not ediyor ve yorumluyorsunuz. Bu noktada danışmanınızın yönlendirmeleri ve yorumları çok kıymetli oluyor. Öyle ki aylarca çalışıp bir sonuca ulaşmayacak yollardan sizleri deneyimleri ve bilgileri ile çıkartıyorlar. Dolayısıyla tez danışmanı ile kurulacak ilişki ve haftalık, aylık progress toplantıları çok ama çok önemli. Gün sonunda tezinizin amacına ulaşıp ulaşmadığına ve akademik olarak yeterli olup olmadığına karar verecek ve sizi jüri karşısına çıkarak kişi danışmanınız. Dolayısıyla geliştirme süreçlerinde olsun tez ile ilgili ikilemde kaldığınız noktalarda olsun danışmanınız ile sürekle irtibatta kalmanız çok önemli. Tez çalışmasının yapılması kadar raporlanması da oldukça önemli bir durum. Çünkü yaptığınız çalışmayı YÖK’ün belirlediği standart bir formatta raporlamanız gerekiyor. Unutulmamalıdır ki yaptığınız tezin en somut çıktısı yazdığınız raporun ta kendisidir. Dolayısıyla olabildiğince standardize, açık, anlaşılır ve iyi bir yazım dili ile yazılmış olması gerekiyor. Yaptığınız çalışmanın uzunluğuna ve kapsamına göre bu raporu yazmakta oldukça meşakkatli bir süreç. Burada benim tavsiyem tezi geliştirme ve sonuçları üretmeye başlandığı anda paralel olarakta bu dökümanı yazmaya başlamak olduğu yönünde. Genel öğrenci davranışı bu işi en sona bırakma yönünde olsa da bu yapılmaması gereken bir davranış. Gün sonunda raporlanmayı bekleyen dev gibi bir içerikle karşı karşıya kalıp aylarca bununla uğraşabilirsiniz. (Bu aşama benim toplam 6-7 aylık bir süremi aldı.)

Diğer Yükümlülükler

Yüksek lisansı yaptığınız üniversiteye göre mezuniyet ile ilgili yükümlülükleriniz değişkenlik gösterebilir. Tezli programlarda genellikle 7 Ders + 1 Seminer + Tez Çalışması mezuniyet için yeterli iken, bazı okullarda tezinizden bir yayın veya konferans kabulü elde etmekte yükümlülüklerden biri olabiliyor. Özyeğin Üniversitesi Fen bilimleri Enstitüsüne bağlı programlarda yayın veya konferans kabulü şartı bulunuyor. Dolayısıyla tezinizi yazıp bitirmeniz mezuniyet için yetmiyor. SCI veya SCIE indeksinde bulunan dergilerde tezinizi makale olarak yayınlamak veya bölümünüzün seçtiği uluslararası konferanslardan tezinizi anlatmak için kabul almak durumundasınız mezuniyet için. Bu şartı sağlamadan tez savunmasına giremediğinizi açık yüreklilikle söylemek isterim. Bu yükümlülük bir çırpıda yazılsa da oldukça uzun ve meşakkatli bir süreç. Bu aşamada ben SCIE indeksli bir dergide yayın yapma yolunu seçerek, yayın yapılacak derginin belirlenmesinden makalenin submit edilmesine kadar geçen sürede yaklaşık olarak üç ay harcadığımı rahatlıkla söyleyebilirim. Bu tarz yükümlülükler tezli yüksek lisans programları için çok zorlayıcı gözüksede birkaç yılınızı verip yaptığınız çalışmaların kalitesini uluslararası standartlara çıkartarak akademik olarak bilinilirliğinizin artmasına katkı sunuyor. Dolayısıyla yazdığınız tezden uluslararası yayın çıkması her şeyden önce bireysel tatmininiz için oldukça önemli. Doktoraya devam edecekseniz ise de harika bir başlangıç olmuş oluyor.

Tez Savunması

Tez savunması mezuniyet öncesinde yapmanız gereken en önemli şey çünkü tezinizi belirlenen jüri önünde başarılı bir şekilde sunamazsanız maalesef bir dönem uzatma daha almanız olası olacaktır. Dolayısıyla tezi geliştirirken ve o süreç içerisinde yapılacak her hamlede tezinizi savunacağınız o 30 dakika hayal edilmelidir. Üniversitenizin dışından da üyelerin bulunduğu bu savunma jürisinde, anlatacağınız her şeye hakim olmanız ve teorik olarak yaptığınız çalışmayı çok iyi anlatabilmeniz sizden beklenen birinci şeydir. İkinci önemli konu da anlatımınız bittikten sonra soru-cevap kısmında jüri üyelerinin sorduğu sorulara doyurucu cevaplar vermeniz olacaktır.

Buraya kadar tezli yüksek lisans hakkındaki genel deneyimlerimi, yorumlarımı ve mezun olduğum bölüm hakkında detaylı bilgileri vermeye çalıştım. Ancak unutulmamalıdır ki seçtiğiniz okul, seçtiğiniz bölüm, çalıştığınız akademisyenler toplamda yaşayacağınız deneyimi değiştireceklerdir ama önemli olan konu başladığınız motivasyonla sürece devam edebiliyor olmanızdır. Yüksek lisans uzun bir maraton koşusu, dolayısıyla kendinden emin ve sürekliliği olan bir performansla yola devam edip bitiş çizgisini görmek mümkün. Bundan dolayı bu maratona başlamadan, somut çıktılarının hayatımıza etkilerini ve motivasyonumuzu tekrar tekrar sorgulayıp öyle karar vermeye çalışmak gerekiyor.

Özetle üç yıl önce başlama motivasyonumu düşündüğümde, süreç içerisinde yaşadıklarımı hatırladığımda ve kazandığım eşsiz akademik alt yapıyı düşündüğümde iyi ki başlamış ve bitirmişim diyorum. Kazandığım akademik vizyon sayesinde iş hayatında yapmaya çalıştığım projeleri veya çözmeye çalıştığım problemleri daha farklı ele alıp değerlendirebiliyorum.

Sonuç olarak, eğer hayatta ki motivasyonlarınız benim bu yazı aracılığı ile anlatmaya çalıştığım şeylere yakınsa yüksek lisans yapmak sizin için de güzel bir seçenek olabilir.

Posted in Uncategorized | Tagged , , , , , , , , , | Leave a comment

Docker Container üzerinden Autonomous Database ile Etkileşim

Herkese Merhaba,

Docker Logos | Docker

Bu yazıda Oracle Cloud alt yapısı üzerinde sunulan veritabanı servislerinden biri olan Autonomous Veritabanı servisine bir docker imajı üzerinden erişmeyi göstereceğim. Umarım farkındalık anlamında faydalı bir yazı olur.

Hepimizin takip ettiği gibi artık uygulama geliştirme dünyasının vazgeçilmez komponentlerinden bir tanesi container teknolojileri. Container teknolojileri sunmuş olduğu imkanlar ve avantajlar ile uzun zamandır uygulama geliştirme dünyasındaki dönüşümü tetikleyen ana unsur haline geldi. Bu nedenle artık yazılımcılar, geliştirdikleri çözümleri containerler üzerinde inşaa etmeye hızla devam etmektedir.

Geliştireceğimiz örnek uygulama, yaratacağımız bir container imajı ile Oracle Cloud Altyapısına bağlanacak ve buradaki Autnomous Database servisine container içerisinden bir kayıt yazacak.

Öncelikli olarak bu uygulamayı geliştirmek için bilgisayarımıza docker kurmamız gerekli.[DOCKER_KURULUMU_NASIL_YAPILIR]

Bu uygulama için ihtiyaç duyduğumuz bir diğer ihtiyaç ise Oracle Cloud’da bir Autonomous Database servisi ayağa kaldırmak. Oracle Cloud hesabı edinmek ve bu servisi açmak tamamen ücretsiz. Oracle bulut hesabının ücretsiz olarak nasıl açılacağı ile ilgili bilgiye linke tıklayarak ulaşabilirsiniz. [ORACLE_CLOUD_FREE_TIER]

Benim mevcutta bir Oracle Bulut hesabım olduğu için Autonomous Database servisini ayağa kaldırdım.

Yarattığım veritabanı bir cloud servisi olduğu için bu servise bağlanmak için bir wallet’a ihtiyacım var. Şimdi bu wallet’ı nasıl indireceğimize bakalım. Öncelikle veritabanının üzerine tıklayıp servis ile ilgili detayların bulunduğu sayfaya gidiyoruz.

Açılan ekrandan DB CONNECTION sekmesine tıklıyoruz ve download wallet diyoruz.

Wallet’ı indirdiğimize göre database’e güvenli bağlantı kurabiliriz artık.

Şimdi örnek use-case’i geliştirmek için veritabanı içerisinde bir tablo yaratalım.

Tools Menüsü – Database Actions
Development – SQL
DROP TABLE DOCKER_TEST;

CREATE TABLE DOCKER_TEST (
    COL_A  VARCHAR2(100),
    COL_B  VARCHAR2(100)
);

Evet veritabanı içerisinde test tablomuzu yarattık.

Artık docker imajımızı oluşturma kısmına geçebiliriz. Yaratacağımız imaj çalıştığında yukarıda ayağa kaldırdığımız Autonomous Veritabanı’na bağlanıp docker_test tablosuna bir kayıt atacak. Ancak bu operasyonu yapabilmek için imajımızın içerisinde bazı kurulumların yapılmasına ihtiyaç var.

Öncelikli olarak bu kayıt atma işini python programlama dili ile yapacağım için imaj içerisinde python’ın kurulu gelmesi gerekmekte. Bunun için docker hub’daki python:3.8 imajını kullanabiliriz. Bu imaj içerisinde otomatik olarak bir python kurulumu ile geliyor. Bunun üzerine python’dan Oracle veritabanına bağlanabilmek için cx_oracle ve sqlalchemy kütüphanelerinin de kurulması gerekecek. İmaj içerisine kurulmasını istediğim tüm kütüphaneleri requirements.txt isimli bir dosya içerisine yazıyorum. Daha sonra Dockerfile’da requirements.txt içinde yazılmış olan tüm kütüphanelerin imaj içerisine kurulmasını sağlayacak komutu yazacağım.

requirements.txt

Yaratacağım imajın bir Oracle veritabanına bağlanabilmesi için bir Oracle Client indirip bu Oracle Client’ı konfügre edip yaratacağım imajın içerisine yerleştirmem gerekiyor. Bu operasyon için öncelikle Oracle Client indirmemiz gerekli. Client’ı link’i takip ederek indirebilirsiniz. [Instant_Oracle_Client] Oluşturduğumuz imaj bir linux imajı olacağı için ben 64 bit linux seçimi ile ilerledim.

Şimdi indirdiğimiz client’ı konfügre edelim. İlk olarak yapmamız gereken Oracle Cloud üzerinden indirdiğimiz wallet dosyasını açıp tüm dosyaları instant client içerisindeki instantclient_19_5/network/admin dizini altına taşımak olacak. Bu işlemi yaptıktan sonra ise instantclient_19_5/network/admin dizini içerisindeki sqlnet.ora dosyasındaki DIRECTORY pathini aşağıdaki gibi değiştirmek olacak. Buraya yazdığımız path, instantclient dosyamızın yaratacağımız imaj içerisinde hangi dizinde olacağının bilgisi. Bu şekilde de bırakabiliriz veya imaj içerisinde farklı bir yere taşıyacaksak orayı da burada belirtebiliriz.

WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="/usr/src/app/instantclient_19_5/network/admin")))
SSL_SERVER_DN_MATCH=yes

Bu işlemde bittiğine göre artık database’e bağlanıp test kayıdı atacak python kodunu (app.py) yazabiliriz.

import sqlalchemy as db
from sqlalchemy import (MetaData, Table, Column, Integer,Date, select, literal, and_, exists,String)
import os

os.environ['TNS_ADMIN']='/usr/src/app/instantclient_19_5/network/admin/'
engine = db.create_engine('oracle://ADMIN:dbMl19c_123!@dbml19c_high')

metadata = MetaData()

db_table = Table('docker_test', metadata,
    Column('col_a', String, primary_key=False),
    Column('col_b', String, primary_key=False)
)

upsert = db_table.insert().from_select([db_table.c.col_a,db_table.c.col_b],select([literal("TEST"),literal("TEST")]))
engine.execute(upsert)

Kodumuzu da geliştirdiğimize göre şimdi tüm parçaları aynı folder da toplayalım.

Şimdi tüm hazırlıklar tamamlandığına göre imajımızı oluşturacak Dockerfile’ı yazalım ve imajımızı docker üzerinden build edelim.

FROM python:3.8
RUN apt-get update
RUN apt-get install libaio1
COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt
COPY app.py /usr/src/app/
COPY instantclient_19_5 /usr/src/app/instantclient_19_5
ENV LD_LIBRARY_PATH=/usr/src/app/instantclient_19_5:$LD_LIBRARY_PATH
CMD ["python", "/usr/src/app/app.py"]

Dockerfile oluştu. Şimdi imajımızı build edelim.

docker image build -t docker_oci .

Yarattığımız imajın docker registry’e gelip gelmediğini kontrol edelim.

docker image ls

Artık imajımız hazır. Şimdi imajı bir container üzerinde çalıştırıp veritabanına kayıdın gidip gitmediğini kontrol edelim.

docker container run docker_oci

Görüldüğü üzere container ayağa kalktı yazdığımız python kodunu çalıştırdı ve durdu. Şimdi veritabanına bağlanıp kayıdın durumuna bakalım.

SELECT * FROM DOCKER_TEST;

Container üzerinde çalışan uygulamamız bulut üzerindeki veritabanı servisimize bağlanıp yarattığımız tabloya test kaydını yazmayı başardı.

Geliştirmiş olduğumuz bu imajı container registry’mizde tutup OCI üzerinde bir Autonomous Database bağlantısı ihtiyacı duyacağımız her noktada bu imajı otomatik olarak kullanabiliriz.

Posted in Uncategorized | Tagged , | Leave a comment

ML Modellerinin Yorumlanması ve Model Karmaşıklığının Başarıma Etkisi

Herkese Merhaba,

Bu yazıda bir ML modelini değerlendirirken elde edilen çıktıların nasıl yorumlanması gerektiği ile ilgili düşüncelerimi paylaşacağım umarım farkındalık anlamında faydalı bir yazı olur.

Machine Learning modellerinin farklı araçlar ile kolayca uygulanabildiği günümüzde bu modellerin nasıl değerlendirileceği de oldukça önemli bir konu. Çoğunlukla modeli üreten geliştiriciler hangi modeli seçeceğine karar verirken bazı önemli durumları pas geçebiliyor. Machine Learning’in temel prensipleri arasında yer alan bu metriklerin yorumu hayata geçireceğimiz modellerin sağlıklı bir şekilde çalışması için çok önemli.

Machine Learning ile ilgilenen herkesin de bildiği üzere modellerimizi bazı metrikler ile değerlendiriyoruz. Ancak bu metrikleri yorumlarken bazı önemli ayrıntıların farkında olmak daha yerinde seçimler yapma konusunda bize oldukça yardımcı olabiliyor.

Konuyu daha net tartışabilmek için bir örnek üzerinden gitmekte fayda olacaktır. Elimizde bir bir populasyondaki her bireye ait boy, kilo ve şeker hastası olup olmadığını belirten bir veri olduğunu düşünelim. Bu veriyi kullanarak bir model geliştiriyor olalım ve bu model boyu ve kilosu verilen bir bireyin şeker hastası olup olmadığını tahmin etsin. Yani bir binary classifier modelleyelim.

Örnek senaryomuzu geliştirmek için bir ML algoritması ile hedef değişkenimiz olan şeker hastası olup olmama durumunu elimizdeki veriden öğrenecek bir model kurguluyoruz. Bu çalışma modele verdiğimiz boy, kilo bilgisi ile şeker hastası olup olmama durumu arasındaki ilişkiyi kuracak bir fonksiyon bulacak ve bu fonksiyonu sisteme gelecek yeni verilere uygulayarak bir kişinin şeker hastası olup olmadığını tahmin edecek.

Yukarıda tarif ettiğimiz şekilde modelimizi oluşturduğumuzu varsayalım ve modelin değerlendirme kısmına geçelim. Bir binary sınıflandırıcıyı değerlendirirken kullanılan en temel araç confusion matrix’dir. Bu confusion matrix üzerinden üretilen accuracy, precision, recall ve f1-score değerleri de ürettiğimiz modelin yorumlanması konusunda bize oldukça iyi fikir verecek parametrelerdir. (Bu yazı çerçevesinde bahsetmiş olduğum metriklerin detaylarına girmeyeceğim ancak bu kavramların iyi öğrenilmesi ve ne ifade ettikleri bu konunun temel prensiplerinden bir tanesidir.) Ancak genellikle modellerin başarımı accuracy dediğimiz parametre üzerinden tartışılır ve değerlendirilir.

Bir model eğitimi yapıldıktan sonra modelin başarımı yorumlanırken modelin overfitting ve underfitting kavramları ile ilişkisine de mutlaka bakılmalıdır.

Overfitting dediğimiz kavram modelin eğitim veri setini yüksek hassasiyet ile öğrenmesi veya ezberlemesi durumudur. Bu durum ML modelleri için istenmeyen bir durumdur ve önüne geçmek için bazı konularda önlemler almak gerekir. Modelin eğitim verisine hassas olması genel bir model elde etmemizin önünde duran en büyük engeldir. Dolayısıyla overfit bir model muhtemelen test veri seti ile yapacağımız validasyonda daha kötü bir performans sergileyecektir ve genelleyici bir model elde etmemizin önünde bir engel olarak duracaktır.

Underfitting ise modelin eğitim verisini öğrenememe durumudur ki underfit bir model kabul edilemeyecek bir çıktıdır.

ML modellerinde arzu edilen durum hem overfitting in hem de underfitting’in oluşmasını engellemektir. Yani modelin öğrendiği curve (veya hyperplane) eğitim verisini ezberlemeden genelleyebilecek nitelikte olmalıdır.

Overfitting’i engellemenin birden çok yolu olabilir. Bu yollardan biri kullandığımız modelin karmaşıklığı ile ilgilidir. Kompleks modellerin parametre sayıları görece olarak daha fazla olduğundan dolayı eğitim verisini çok iyi şekilde öğrenebilecek kapasiteye sahiptirler. Bu durum eğitim verisine hassas bir model elde etmemize sebep olacağından dolayı genel bir model elde etmemizin önünde bir engel teşkil edebilir. Model karmaşıklığı bakış açısı ile bu durumu incelediğimizde genellikle önerilen davranışın daha sade modeller ile çalışmak olduğunu görmekteyiz. Literatürde bu yaklaşıma Occam’s Razor adı verilmektedir. Daha sade modeller ile yüksek başarım elde etmek genelleyici modeller elde etmenin yollarından biri olabilir. Ancak genel bir model elde etme adına çok basit modeller kullanmakta underfitting’i yani öğrenememe durumunu yaratabilir. Dolayısıyla veri miktarının sabit olduğu koşullarda model karmaşıklığını kontrol altında tutarak her iki durumu da dizginleyebilmek mümkündür.

underfitting overfitting

Bu kavramlardan bahsederken Bias ve Variance ikileminden bahsetmemek olmaz. Bias dediğimiz kavram; modelimizin eğitim verisini nasıl açıkladığını ve öğrendiğini gösterir. Yüksek bias istenmeyen durumken, düşük bias arzu edilen durumdur. Bias’ın yükselmesi modelimizi underfitting’e doğru götürecektir. Dolayısıyla üreteceğimiz modeller de düşük bir bias arzu ettiğimiz şeydir. Variance dediğimiz kavram ise modelin eğitim verisi ile verdiği başarım ile test verisi ile verdiği başarım arasındaki farkı yorumlamamızı sağlar. İstediğimiz durum modelin eğitim verisi ile vermiş olduğu başarıma yakın bir başarımı test verisi ile de vermesedir. Böyle bir modelde variance düşük olacaktır.

İdeal durumda bir modelin düşük variance ve düşük bias a sahip olması beklenir. Ancak böyle bir sonuç alınamıyorsa ikisinin de dengede olması, üzerinde çalışılan modelin seçilmesi için uygun bir opsiyon olacaktır.

Sonuç olarak ML modellerinin sonuçlarını yorumlayabilmek için yukarıda bahsettiğimiz kavramların tamamına bakmak ve buna uygun hareket etmek daha sonra, stabil ve genelleyici modellere doğru bizi götürecektir. Kavramlar arasındaki ikilemleri ortak bir potada eritip işimize yarayacak en optimum sonuçlara ulaşabilmek için mutlaka model ile ilgili her değişkeni kontrol altında tutup sonuçları gözlemlemek gerekecektir.

Posted in Uncategorized | Tagged , , | Leave a comment

Veritabanı İçerisinde XGBoost Algoritması ile Sınıflandırma

Herkse Selam,

Bu yazıda veritabanı içerisinde günümüzün en popüler ensemble learner yöntemlerinden biri XGBoost algoritmasını nasıl uygulayacağımıza bakacağız umarım farkındalık anlamında faydalı bir çalışma olur.

Hepimizin bildiği üzere Oracle veritabanı yazılımı içerisinde 9i sürümünden bu yana makine öğrenimi algoritmaları kullanılarak ileri analitik uygulamalar geliştirilebilmekte.  Veritabanı sürümleri yenilendikçe de bu algoritma seçeneklerine yenileri eklenmekte. Oracle 19c sürümü ile gelen güncel algoritma listesi aşağıdaki gibidir.

Geçtiğimiz hafta Oracle güncel veritabanı sürümü olan 21c’yi duyurdu. Oracle 21c veritabanı sürümü ile bu algoritma listesine de yeni algoritmalar eklemiş oldu. Şüphesiz ki bu algoritmalardan en çok ilgi çekeni endüstrinin en sık kullanılan ensemble yöntemlerinden biri olan XGBoost algoritması oldu. Kaggle üzerinden açılan ML yarışmalarında ki başarısı ile öğrenme kapasitesini ispatlamış olan XGBoost artık Oracle veritabanı içerisinde de kullanıma hazır bir hale geldi.

Şimdi Oracle 21c ile bir XGBoost modeli oluşturup nasıl kullanıldığını test edelim. Ben bu testi yapmak için Oracle Cloud Infrastructure üzerinde Oracle 21c sürümü ile gelen bir Autonomous Data Warehouse servisi ayağa kaldırıp yapacağım.

Bu örnekte bir sınıflandırma problemi çözeceğim ancak bu alt yapı ve algoritma ile regresyonda yapılacağı unutulmamalıdır. Kullanacağım veri seti Iris olacak. Veri setini indirdikten sonra veritabanına yükleme işlemini gerçekleştiriyorum SQL Developer Web arayüzü üzerinden.

CREATE TABLE ADMIN.IRIS 
    ( 
     sepal_length FLOAT , 
     sepal_width  FLOAT , 
     petal_length FLOAT , 
     petal_width  FLOAT , 
     class        VARCHAR2(4000) 
    ) ;

Evet verimizi yükledik veritabanı içerisine şimdi modelimizi kurgulama kısımına geçebiliriz.

İlk etapta algoritma parametrelerini belirlemek için bir tablo yaratıyoruz. Bu tabloya algoritmanı çalışacağı parametreleri yazacağız daha sonra kullanılmak üzere.

CREATE TABLE ADMIN.ALGO_VARIABLES (
    SETTING_NAME   VARCHAR2(4000),
    SETTING_VALUE  VARCHAR2(4000)
);

BEGIN
    
  INSERT INTO ADMIN.ALGO_VARIABLES (setting_name, setting_value) VALUES
    (dbms_data_mining.xgboost_objective, 'multi:softprob');

  INSERT INTO ADMIN.ALGO_VARIABLES (setting_name, setting_value) VALUES
    (dbms_data_mining.algo_name, dbms_data_mining.algo_xgboost);

  INSERT INTO ADMIN.ALGO_VARIABLES (setting_name, setting_value) VALUES
    (dbms_data_mining.xgboost_max_depth, '3');

  INSERT INTO ADMIN.ALGO_VARIABLES (setting_name, setting_value) VALUES
    (dbms_data_mining.xgboost_eta, '1');

  INSERT INTO ADMIN.ALGO_VARIABLES (setting_name, setting_value) VALUES
    (dbms_data_mining.xgboost_num_round, '5');

COMMIT;
    
END;

Evet algoritma parametrelerimi ayarladım. Bu parametreler ile ilgili detaylı bilgilere ve opsiyonlara linki takip ederek ulaşabilirsiniz.

Veriyi yükledik, algoritma parametrelerimizin değerlerini setledik. Şimdi training aşamasına geçebiliriz.

BEGIN
    DBMS_DATA_MINING.CREATE_MODEL(
                                 MODEL_NAME           => 'XGBoost_Model',
                                 MINING_FUNCTION      => DBMS_DATA_MINING.CLASSIFICATION,
                                 DATA_TABLE_NAME      => 'iris',
                                 CASE_ID_COLUMN_NAME  =>  NULL,
                                 TARGET_COLUMN_NAME   => 'class',
                                 SETTINGS_TABLE_NAME  => 'algo_variables'
    );
END;
    

SELECT *
  FROM user_mining_model_attributes
 WHERE model_name = 'XGBOOST_MODEL'
ORDER BY attribute_name;

Şimdi geliştirdiğimiz modeli test etme aşamasına geçelim. Modeli kullanmayı iki şekilde yapabiliriz. Bunlardan biri bir tablo içindeki tüm değerleri tahmin ettirmek olabilir.

select 
   PETAL_LENGTH,PETAL_WIDTH,SEPAL_LENGTH,SEPAL_WIDTH,
   prediction (XGBOOST_MODEL using *) prediction
from iris_test t ;

Diğeri ise tek bir değeri tahmin ettirmek olabilir.

Evet görüldüğüz üzere veritabanı içerisindeki verimizi, veritabanı dışına çıkartmadan XGBoost algoritmasını kullanarak modelleyebildik.

Posted in Uncategorized | Tagged , , , , , , | Leave a comment

Machine Learning Uygulamalarının Docker Üzerinden Servis Edilmesi

Herkese Selam,

Makine Öğrenimi ile ilgili projeler yaygınlaşmaya başladıkça bu projelerin canlı ortamlara nasıl aktarılacağı ile ilgili pratikler hakkında her geçen gün yenilikler olmakta. Bu bağlamda bu yazı ile bir makine öğrenimi modelini container alt yapılarını kullanarak en hızlı ve etkili bir şekilde canlı ortama nasıl aktarılabileceği ile ilgili bir örnek yapacağım. Umarım farkındalık anlamında faydalı bir çalışma olur.

Örneğimize başlamadan önce sözel olarak bu aktarım alt yapısını hakkında bir miktar bilgi vermek istiyorum.

Günümüzde modern yazılım geliştirme mimarilerini incelediğimizde yazılım geliştirme yaşam döngüsünün her adımında yeni pratiklerin ve frameworklerin geliştiğini görmekteyiz.  Uygulamanın geliştirilmesinden, uygulamanın test edilmesine ve devreye alınmasına kadar her adımda farklı yaklaşımların denendiğini görüyoruz. Modern yazılım geliştirme mimarilerini incelerken karşılaştığımız en temel bileşenlerinden birinin şüphesiz container teknolojileri olduğunu görmekteyiz. Kısaca, container teknolojilerinin bize sunmuş olduğu avantajlardan bahsetmek gerekirse;

  • Geliştirdiğimiz uygulamaları çok kolay ve hızlı bir şekilde çalıştırılmasını sağlar.
  • Uygulamanın ihtiyaç duyduğu tüm ek kütüphane bağımlıklarını uygulamamız ile bütünleşik bir şekilde tutarak kolay, hızlı ve etkili bir şekilde uygulamamızı devreye almamıza olanak sağlar ve uygulamamızın dağıtımını kolaylaştırır.
  • Container olarak devreye alınan uygulamaların yönetimi ve bakımıda oldukça kolay yapılabilmektedir.

Container teknolojileri derinlemesine incelenmesi gereken bir konu olduğu için ben bu yazıda bu konu hakkında daha fazla detaya girmeyeceğim. Daha detaylı bilgi edinmek için Docker dokümantasyonunu inceleyebilir bu konu hakkında yazılmış yüzlerce blog yazılarından faydalanabilir.

Container teknolojilerini konuştuğumuz bir dünyada Docker şüphesiz ki lokomotif olan bir teknoloji. Endüstride defacto bir standart haline gelen docker, container tabanlı yazılım geliştirme yapan hemen hemen herkesin kullandığı bir araç. Bugün bende bu örneği Docker platformu üzerinde yaratacağım bir container aracılığı ile çalıştırmayı deneyeceğim.

Bu örneğimizin yapılabilmesi için öncelikle çalıştığımız ortamda Docker ‘ın kurulu olması gerekmekte. Aşağıdaki lini izleyerek Docker’ı çalışma ortamınızda hazır edebilirsiniz.

Şimdi yapacağımız örneğe gelelim. Bu örnekte yeni bir uygulama geliştirmeyeceğim. Bir önceki “Web Sayfası olarak Machine Learning Modellerinin Kullanıma Açılması” başlıklı yazımda yapmış olduğum çalışmanın bire bir aynısını yapacağım. Ancak sonuç kısmını lokalimden ayağa kaldırmayacağım, geliştirdiğim web uygulamasını bir Docker Container’ına çevirip o şekilde Docker üzerinde çalıştıracağım. Bu nedenle örneği tam olarak anlayabilme adına linkini paylaştığım yazımda nasıl bir uygulama geliştirildiğine bir göz atmanızı öneririm. Bu yazıya konu olan çalışma, o yazıda geliştirilen çalışmanın devamı niteliğinde olacaktır.

Görseller ile uygulamanın ne olduğunu hatırlayacak olursak;

Evet şimdi bu uygulamayı Docker container’ına dönüştürecek imajımı oluşturmak için dockerfile’ı yazalım. Oluşturacağım imajın iskeletini dockerhub’daki official python imajlarından kullanacağım. Seçtiğim iskelet imaj alpine olacak boyutunun küçük olması sebebi ile. Ancak şunu unutmamak gerekiyor benim bu imajı kullanarak oluşturduğum kendi imajlarımın build süreleri azımsanmayacak kadar uzun bunuda dip not olarak söylemek istiyorum.

Dockerfile.yaml

FROM python:3.9.0b3-alpine3.12
WORKDIR /app
ENV FLASK_APP webform.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk --update add gcc build-base freetype-dev libpng-dev openblas-dev
RUN apk --no-cache add --virtual .builddeps g++ musl-dev
RUN apk del .builddeps
RUN pip install scikit-learn==0.19.1
RUN pip install --no-cache-dir flask sklearn matplotlib pandas numpy 
COPY . .
CMD ["flask", "run"]

 

Uygulamamızın çalışacağı docker imajını oluşturacak Dockerfile’ı yazdık. Kabaca burada alpine python imajı üzerinden uygulama ayarlarımızı yaptık. Bu imaj içindeki işletim sisteminin eksik kütüphanelerini kurduk (RUN komutları). Bu aşamadan sonra python içerisinde uygulamamızın kullanacağı kütüphanelerin kurulmasını sağlayacak girdileri verdik. Daha sonra ise uygulama kodlarımızın tamamını oluşacak imaj içine kopyalanmasını sağladık (COPY) ve tüm işlemler bittikten sonra kodumuzu çalıştıracak komutu yazdık (CMD) ve işlemleri sonlandırdık.

Şimdi yazdığımız Dockerfile’dan imajımızı üretecek kodumuzu terminal ekranından çalıştıralım.

docker build -f Dockerfile.yaml -t sentiment-model .

İmajın build edilmesi uzun sürebilir. Build işlemi bittikten sonra aşağıdaki komut ile imajın Docker registry’ye gelip gelmediğini kontrol edebilirsiniz.

docker image ls

Evet gördüğümüz üzere docker imajımız oluşmuş verdiğimiz tag name ile.

Şimdi bu imajı bir container içine koyup çalıştıralım ve test edelim.

docker run -d -it --rm -p 3000:5000 --name sentiment-model sentiment-model:latest

Container’da ayağa kalkacak uygulamaya makinemden ulaşmak için, container’ın 5000 portunda çalışan uygulamayı ana makinemdeki 3000 numaralı porta yönlendirdim. Dolayısıyla 3000 numaralı port üzerinden uygulamaya erişeceğim ana makinemden.

Evet container ayağa kalktı. Şimdi ana makinemizdeki browserdan container da çalışan uygulamamıza erişmeye çalışalım.

Evet container üzerinden çalıştırdığımız uygulamayı lokalimizdeki browserdan ulaşıp testimizi yapabildik.

Uygulamayı bir docker imajına çevirmemizin en büyük faydası oluşturduğumuz bu imajı her ortama çok kolay bir şekilde taşıyıp o ortamda çalıştırabilmemiz olacak. Ürettiğimiz bu imajı dockerhub’a yüklediğimiz takdirde böyle bir uygulamaya ihtiyaç duyacak herkes çok rahat bir şekilde dockerhub üzerinden bu uygulamayı çekip kullanabilecek. Bunun yanı sıra bu imajı neredeyse tüm cloud vendorların docker registry’lerine gönderip dakikalar mertebisinde bulutta da çalıştırabilme imkanımız olacak. Dolayısıyla yazdığımız uygulamaları docker imajlarına çevirmemizin faydası çok ama çok fazla oluyor. Geliştirdiğimiz uygulamaları bu perspektiften bakarak geliştirmemiz kolayca sökülüp takılabilen modüler yazılımlar üretmemize olanak sağlayacaktır.

Posted in Root | Leave a comment

Web Sayfası olarak Machine Learning Modellerinin Kullanıma Açılması

Herkese Selam,

Machine Learning modellerinin kullanıma açılması ile ilgili opsiyonları bir süredir paylaşıyorum. Bu opsiyonlardan birini bir önceki yazımda paylaşmıştım. Link‘e tıklayarak bu yazıya gidebilirsiniz. Bu yazıda ise farklı bir kullanıma açma senaryosu ile ilgili bir örnek yapmayı planlıyorum. Umarım farkındalık anlamında faydalı bir yazı olur.

Girişi, yukarıda linkini paylaşmış olduğum bir önceki yazımdan alıntı yaparak başlamak istiyorum.

“Hepimizin bildiği üzere Makine Öğrenimi ve uygulamaları günümüzün en trend konularının başında geliyor. Bireysel kullanıcılardan kurumsal büyük organizasyonlara kadar bir çok oyuncu makine öğrenimi uygulamaları geliştirmeye çalışıyor. Bu konu ile ilgili mesai harcayan herkesin bildiği üzere bu projelerin gelişimi standart yazılım geliştirme akışından bir miktar farklı. Çözmek istediğimiz probleme ait modeli önce prototipliyoruz daha sonra belirli bir süre test edip parametrelerini en iyileyerek modelimizi nihai halini almasını sağlıyoruz. Modelimiz oldu dediği noktada da bu modeli kullanıma açma kısımına geçiyor. Tam bu noktada mevcut skill setimizin yanında bir miktar yazılım geliştirme ve veri mühendisliği bilmemiz gerekiyor çünkü standart yazılım geliştirme yöntemleri ile bundan sonraki kısımları halletmemiz gerekiyor. Yazımıza konu olan kısımda tamda bu noktada başlıyor.” 

Bu yazıya konu olacak modelimiz bir önceki yazımda kullanmış olduğum modelin bire bir aynısı dolayısıyla bu yazıdaki örneği daha iyi kavrayabilme adına bir önceki yazıdakinin aynısı. Yani daha önce bu blogta paylaşmış olduğum “Doğal Dil İşleme (NLP) ile Sentiment (Duygu) Analizi Tespiti” yazısında paylaşmış olduğum model üzerinden çalışmayı yapacağım ve yine önemle vurgulamak isterimki bu yazının yazılma amacı state of the art bir sentiment analyzer yapmak değil.

“Öncelikle senaryomdan bir miktar bahsedeyim. Bir sentiment analizi modeli geliştirmek istiyorum. Bu modeli imdb, yelp ve amazon’dan toplanmış bir veri seti ile eğitip basit bir sentiment tahmin modeli geliştireceğim. Daha sonra bu modeli bitirdikten sonra bir web sayfası tasarlayıp bu web sayfası üzerinden modeli son kullanıcıların kullanımına açacağım.

Bu yazıya konu olan modeli daha önce paylaşmış olduğum yazımdan daha detaylı anlayabilirsiniz. Ben sadece modeli elde ettiğim kod kısmını bütünlük bozulmasın diye copy paste edeceğim.

import pandas as pd
import numpy as np
import pickle
import sys
import os
import io
import re
from sys import path
import numpy as np
import pickle
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
import matplotlib.pyplot as plt
from string import punctuation, digits
from IPython.core.display import display, HTML
from nltk.corpus import stopwords
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.tokenize import RegexpTokenizer
#Amazon Data
input_file = "../data/amazon_cells_labelled.txt"
amazon = pd.read_csv(input_file,delimiter='\t',header=None)
amazon.columns = ['Sentence','Class']

#Yelp Data
input_file = "../data/yelp_labelled.txt"
yelp = pd.read_csv(input_file,delimiter='\t',header=None)
yelp.columns = ['Sentence','Class']

#Imdb Data
input_file = "../data/imdb_labelled.txt"
imdb = pd.read_csv(input_file,delimiter='\t',header=None)
imdb.columns = ['Sentence','Class']


#combine all data sets
data = pd.DataFrame()
data = pd.concat([amazon, yelp, imdb])
data['index'] = data.index
#Total Count of Each Category
pd.set_option('display.width', 4000)
pd.set_option('display.max_rows', 1000)
distOfDetails = data.groupby(by='Class', as_index=False).agg({'index': pd.Series.nunique}).sort_values(by='index', ascending=False)
distOfDetails.columns =['Class', 'COUNT']
print(distOfDetails)

#Distribution of All Categories
plt.pie(distOfDetails['COUNT'],autopct='%1.0f%%',shadow=True, startangle=360)
plt.show()
#Text Preprocessing
columns = ['index','Class', 'Sentence']
df_ = pd.DataFrame(columns=columns)

#lower string
data['Sentence'] = data['Sentence'].str.lower()

#remove email adress
data['Sentence'] = data['Sentence'].replace('[a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+', '', regex=True)

#remove IP address
data['Sentence'] = data['Sentence'].replace('((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}', '', regex=True)

#remove punctaitions and special chracters
data['Sentence'] = data['Sentence'].str.replace('[^\w\s]','')

#remove numbers
data['Sentence'] = data['Sentence'].replace('\d', '', regex=True)

#remove stop words
for index, row in data.iterrows():
    word_tokens = word_tokenize(row['Sentence'])
    filtered_sentence = [w for w in word_tokens if not w in stopwords.words('english')]
    df_ = df_.append({"index": row['index'], "Class":  row['Class'],"Sentence": " ".join(filtered_sentence[0:])}, ignore_index=True)

data = df_
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score
from sklearn.neural_network import MLPClassifier
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import SGDClassifier


#grid search result
vectorizer = TfidfVectorizer(analyzer='word',ngram_range=(1,2), max_features=50000,max_df=0.5,use_idf=True, norm='l2') 
counts = vectorizer.fit_transform(X_train)
vocab = vectorizer.vocabulary_
classifier = SGDClassifier(alpha=1e-05,max_iter=50,penalty='elasticnet')
targets = y_train
classifier = classifier.fit(counts, targets)
example_counts = vectorizer.transform(X_test)
predictions = classifier.predict(example_counts)
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import classification_report

#Model Evaluation
acc = accuracy_score(y_test, predictions, normalize=True)
hit = precision_score(y_test, predictions, average=None,labels=classes)
capture = recall_score(y_test, predictions, average=None,labels=classes)

print('Model Accuracy:%.2f'%acc)
print(classification_report(y_test, predictions))

Evet modelimizi oluşturduk. Bundan sonra ihtiyacımız olan şey oluşturduğumuz modeli ve modelin vocabulary çıktısını pickle ile kayıt etmek. Daha sonra geliştireceğimiz web sayfasında bu outputları kullanacağız.

### model_save ###
pickle.dump(classifier,open("model_sentiment.pkl","wb"))
pickle.dump(vocab,open("vocab_sentiment.pkl","wb"))

Modelimiz ile ilgili çıktılarımız diske kayıt edildi. Şimdi bu modele input olarak gönderilecek text’in sentimentini bulup geriye dönecek web sayfasının geliştirmesine başlayabiliriz.

Geliştirmeyi python ile yapacağımdan dolayı python’ın flask kütüphanesini kullanacağım. Flask python ile web tabanlı uygulamalar geliştirmenizi sağlayan bir kütüphane. Bende bu kütüphaneyi kullanarak bir web servis geliştireceğim. Öncelikle geliştirme ortamımıza flask kurulumu yapalım.

pip install -U Flask

veya anaconda kullanıcıları için 

conda install -c anaconda flask

Flask kurulumumuzda tamamlandığına göre şimdi web sayfamızın geliştirmesini yapabiliriz.

Geliştirmeye başlamadan önce kendi localimde kurmuş olduğum dizin yapısını göstermek istiyorum. Böyle bir çalışma için sizinde benzer bir dizin yapısı kurmanızın işe yarayacağını düşünmekteyim. Zaten bu bir web uygulaması olacağı için ana kodu yazdığımız webform.py çalıştığı esnada render edeceği .html dosyasını /templates dizini altında arayacak. Dolayısıyla html sayfanızı geliştirdikten sonra templates dizini altına atmanız gerekecek. Aşağıda başarılı şekilde çalışacak dizin yapısını görebilirsiniz.

Dizin yapımda da göreceğiniz üzere geliştirdiğim ve outputlarını aldığım model çıktılarımı models folder’ının altına taşıdım. Templates dizini altına webform.html dosyamı yaratıp koydum. Aynı şekilde ana dizin altına da webform.py isimli kod dosyamı oluşturup kayıt ettim.

Bu uygulama web sayfası üzerinden kullanıcıya ulaştırılacağı için çok basit bir tasarım la kullanıcının text girişi yapıp sonucu göreceği basit bir html form tasarlıyorum. Bu web sayfası, web teknolojilerinin sunmuş olduğu tüm güncel alt yapılar ile donatılabilir ben sadece olabildiğince basit bir tasarım ile nasıl yapıldığını göstermek istiyorum.

“Not: Form inputunu bir tweet olarak kurguladım. Bunun hiç bir önemi yok :)”

webform.html

<form method="POST">
	<br><b>Enter Tweet here...</b></br>
	<textarea rows="4" cols="50" name="tweet">
	</textarea>
	<br></br>
    <input type="submit">
    <br></br>
    <h1><b> Result: </b> {{ value }} </h1>
</form>

Şimdi yarattığımız formun nasıl bir şey olduğuna bakalım.

Evet görüldüğü üzere tasarımımız çok basit. Şimdi bu formu kullacak ve modelimizi çalıştırıp yukarıdaki sayfadan gönderilen text’in sentimeni bulup geri form’a cevabı döndüren python kodunuz yazalım.

webform.py

Burada dikkat edilmesi gereken üç şey var. Birincisi yazdığımı html kodunun nasıl çağırıldığı. İkincisi model outputlarımızı load edip kullanıma hazır hale getirmek.
Üçüncüsü ise dışarıdan parametre olarak gelecek text’i bir değişken içerisine almak ve dördüncüsü bulunan sonucun web sayfasına geri döndürülmesi. Bu satırları vurgulamak açısından bold yapıyorum.

from flask import Flask, request, render_template, url_for
import pickle
import time
import os
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
import io
import re
from sys import path
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
import matplotlib.pyplot as plt
from string import punctuation, digits
from flask import Flask, request, render_template, url_for

start_time = time.time()

app = Flask(__name__)
app.config["DEBUG"] = True

@app.route('/')
def my_form():
    return render_template('webform.html')

@app.route('/', methods=['POST','GET'])
def home():
	vec = open("models/model_sentiment.pkl", 'rb')
	loaded_model = pickle.load(vec)

	vcb = open("models/vocab_sentiment.pkl", 'rb')
	loaded_vocab = pickle.load(vcb)

	txt = request.form['tweet']
    
	examples = txt

	examples = examples.lower()
	examples = examples.replace('\n',' ')
	examples = re.sub(r'[a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+', ' ', examples)
	examples = re.sub(r'@[A-Za-z0-9]+', ' ', examples)
	examples = re.sub(r'((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}', ' ', examples)
	examples = re.sub(r'[^\w\s]', ' ', examples)
	examples = re.sub(r'\d', ' ', examples)
	examples = re.sub(' +',' ',examples) 
	examples = [examples]
	
        from sklearn.feature_extraction.text import TfidfTransformer
	from sklearn.feature_extraction.text import TfidfVectorizer
	count_vect = TfidfVectorizer(analyzer='word',ngram_range=(1,2), max_features=50000,max_df=0.6,use_idf=True, norm='l2',vocabulary=loaded_vocab)
	x_count = count_vect.fit_transform(examples)
	predicted = loaded_model.predict(x_count)
	result=''
	if predicted[0] == 0:
	    result= 'Negative'
	elif predicted[0] == 1:
	    result= 'Positive'
	return render_template('webform.html',value=result)

Evet geliştirmeleri tamamladık. Şimdi yazdığımız webform.py kodunu çalıştıralım.

env FLASK_APP=webform.py flask run


Evet servisimiz ayağa kalktı ve endpoint adresi ekranda bize gösterildi. Şimdi servisi test edelim. Test için ekranda görünen endpointi browsera yazmamız yeterli olacak ve istediğimiz bir input ile testimizi yapacağız.

Evet görüldüğü üzere web sayfamızı yazdığımız python kodu üzerinden ayağa kaldırdık ve machine learning modelini son kullanıcının rahatlıkla kullanabileceği bir hale getirmiş olduk.

Posted in Root, Uncategorized | Tagged , , , , , , , , , , | 2 Comments

Machine Learning Modellerinin Flask ile Web Service olarak Kullanıma Açılması

Herkese Selam,

Bu yazıda, daha önceden geliştirmiş olduğum bir machine learning modelini flask kullanarak bir web servise dönüştürüp kullanıma açacağım. Umarım farkındalık anlamında faydalı bir çalışma olur.

Hepimizin bildiği üzere Makine Öğrenimi ve uygulamaları günümüzün en trend konularının başında geliyor. Bireysel kullanıcılardan kurumsal büyük organizasyonlara kadar bir çok oyuncu makine öğrenimi uygulamaları geliştirmeye çalışıyor. Bu konu ile ilgili mesai harcayan herkesin bildiği üzere bu projelerin gelişimi standart yazılım geliştirme akışından bir miktar farklı. Çözmek istediğimiz probleme ait modeli önce prototipliyoruz daha sonra belirli bir süre test edip parametrelerini en iyileyerek modelimizi nihai halini almasını sağlıyoruz. Modelimiz oldu dediği noktada da bu modeli kullanıma açma kısımına geçiyor. Tam bu noktada mevcut skill setimizin yanında bir miktar yazılım geliştirme ve veri mühendisliği bilmemiz gerekiyor çünkü standart yazılım geliştirme yöntemleri ile bundan sonraki kısımları halletmemiz gerekiyor. Yazımıza konu olan kısımda tamda bu noktada başlıyor.

Öncelikle senaryomdan bir miktar bahsedeyim. Bir sentiment analizi modeli geliştirmek istiyorum. Bu modeli imdb, yelp ve amazon’dan toplanmış bir veri seti ile eğitip basit bir sentiment tahmin modeli geliştireceğim. Amacım kesinlikle state of the art sentiment analyzer yapmak değil sadece bu kurgunun bir parçası olacak bir model elde etmek. Daha sonra bu modeli bitirdikten sonra  web servise dönüştürme kısmının geliştirmesini yaparak kullanıma açma kısmını halledeceğiz.

Bu yazıya konu olan modeli daha önce paylaşmış olduğum yazımdan daha detaylı anlayabilirsiniz. Ben sadece kod kısmını copy paste edeceğim.

Doğal Dil İşleme (NLP) ile Sentiment (Duygu) Analizi Tespiti

 

Modelimizi oluşturduğumuz kod bloğumuz. (Modeli Jupyter Notebook üzerinde geliştirdim.)

import pandas as pd
import numpy as np
import pickle
import sys
import os
import io
import re
from sys import path
import numpy as np
import pickle
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
import matplotlib.pyplot as plt
from string import punctuation, digits
from IPython.core.display import display, HTML
from nltk.corpus import stopwords
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.tokenize import RegexpTokenizer
#Amazon Data
input_file = "../data/amazon_cells_labelled.txt"
amazon = pd.read_csv(input_file,delimiter='\t',header=None)
amazon.columns = ['Sentence','Class']

#Yelp Data
input_file = "../data/yelp_labelled.txt"
yelp = pd.read_csv(input_file,delimiter='\t',header=None)
yelp.columns = ['Sentence','Class']

#Imdb Data
input_file = "../data/imdb_labelled.txt"
imdb = pd.read_csv(input_file,delimiter='\t',header=None)
imdb.columns = ['Sentence','Class']


#combine all data sets
data = pd.DataFrame()
data = pd.concat([amazon, yelp, imdb])
data['index'] = data.index
#Total Count of Each Category
pd.set_option('display.width', 4000)
pd.set_option('display.max_rows', 1000)
distOfDetails = data.groupby(by='Class', as_index=False).agg({'index': pd.Series.nunique}).sort_values(by='index', ascending=False)
distOfDetails.columns =['Class', 'COUNT']
print(distOfDetails)

#Distribution of All Categories
plt.pie(distOfDetails['COUNT'],autopct='%1.0f%%',shadow=True, startangle=360)
plt.show()
#Text Preprocessing
columns = ['index','Class', 'Sentence']
df_ = pd.DataFrame(columns=columns)

#lower string
data['Sentence'] = data['Sentence'].str.lower()

#remove email adress
data['Sentence'] = data['Sentence'].replace('[a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+', '', regex=True)

#remove IP address
data['Sentence'] = data['Sentence'].replace('((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}', '', regex=True)

#remove punctaitions and special chracters
data['Sentence'] = data['Sentence'].str.replace('[^\w\s]','')

#remove numbers
data['Sentence'] = data['Sentence'].replace('\d', '', regex=True)

#remove stop words
for index, row in data.iterrows():
    word_tokens = word_tokenize(row['Sentence'])
    filtered_sentence = [w for w in word_tokens if not w in stopwords.words('english')]
    df_ = df_.append({"index": row['index'], "Class":  row['Class'],"Sentence": " ".join(filtered_sentence[0:])}, ignore_index=True)

data = df_
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score
from sklearn.neural_network import MLPClassifier
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import SGDClassifier


#grid search result
vectorizer = TfidfVectorizer(analyzer='word',ngram_range=(1,2), max_features=50000,max_df=0.5,use_idf=True, norm='l2') 
counts = vectorizer.fit_transform(X_train)
vocab = vectorizer.vocabulary_
classifier = SGDClassifier(alpha=1e-05,max_iter=50,penalty='elasticnet')
targets = y_train
classifier = classifier.fit(counts, targets)
example_counts = vectorizer.transform(X_test)
predictions = classifier.predict(example_counts)
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import classification_report

#Model Evaluation
acc = accuracy_score(y_test, predictions, normalize=True)
hit = precision_score(y_test, predictions, average=None,labels=classes)
capture = recall_score(y_test, predictions, average=None,labels=classes)

print('Model Accuracy:%.2f'%acc)
print(classification_report(y_test, predictions))

Evet modelimizi oluşturduk. Bundan sonra ihtiyacımız olan şey oluşturduğumuz modeli ve modelin vocabulary çıktısını pickle ile kayıt etmek. Daha sonra geliştireceğimiz webservis’te bu outputları kullanacağız.

### model_save ###
pickle.dump(classifier,open("model_sentiment.pkl","wb"))
pickle.dump(vocab,open("vocab_sentiment.pkl","wb"))

Modelimiz ile ilgili çıktılarımız diske kayıt edildi. Şimdi bu modele input olarak gönderilecek text’in sentimentini bulup geriye dönecek web servisi geliştirmesine başlayabiliriz.

Geliştirmeyi python ile yapacağımdan dolayı python’ın flask kütüphanesini kullanacağım. Flask python ile web tabanlı uygulamalar geliştirmenizi sağlayan bir kütüphane. Bende bu kütüphaneyi kullanarak bir web servis geliştireceğim. Öncelikle geliştirme ortamımıza flask kurulumu yapalım.

pip install -U Flask

veya anaconda kullanıcıları için 

conda install -c anaconda flask

Flask kurulumumuzda tamamlandığına göre şimdi web servis kodumuzu yazabiliriz.

webservice.py

from flask import Flask, request, render_template, url_for
import pickle
import time
import os
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
import io
import re
from sys import path
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
import matplotlib.pyplot as plt
from string import punctuation, digits

Gerekli kütüphaneleri import ettikten sonra şimdi servisin ana gövdesini yazalım.
Burada dikkat edilmesi gereken iki şey var. Birincisi model outputlarımızı load edip kullanıma hazır hale getirmek.
İkincisi ise dışarıdan parametre olarak gelecek text’i bir değişken içerisine almak. Bu satırları anlaşılması açısından bold yapıyorum.

start_time = time.time()

app = Flask(__name__)
app.config["DEBUG"] = True

@app.route('/sentiment', methods=['POST'])
def home():
	vec = open("models/model_sentiment.pkl", 'rb')
	loaded_model = pickle.load(vec)

	vcb = open("models/vocab_sentiment.pkl", 'rb')
	loaded_vocab = pickle.load(vcb)

	txt = request.args['text']
    
	examples = txt
        # Parametre olarak gelen text'e preprocessing yapıyoruz.
	examples = examples.lower()
	examples = examples.replace('\n',' ')
	examples = re.sub(r'[a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+', ' ', examples)
	examples = re.sub(r'@[A-Za-z0-9]+', ' ', examples)
	examples = re.sub(r'((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}', ' ', examples)
	examples = re.sub(r'[^\w\s]', ' ', examples)
	examples = re.sub(r'\d', ' ', examples)
	examples = re.sub(' +',' ',examples) 
	examples = [examples]
	
        # Preprocessing bitti şimdi elimizdeki inputu daha önceden load ettiğimiz modelimize verelim 
        # ve prediction sonucu return edelim

        from sklearn.feature_extraction.text import TfidfTransformer
	from sklearn.feature_extraction.text import TfidfVectorizer
	count_vect = TfidfVectorizer(analyzer='word',ngram_range=(1,2), max_features=50000,max_df=0.6,use_idf=True, norm='l2',vocabulary=loaded_vocab)
	x_count = count_vect.fit_transform(examples)
	predicted = loaded_model.predict(x_count)
	if predicted[0] == 0:
	    return 'Negative'
	elif predicted[0] == 1:
	    return 'Positive'

Evet servisimizin geliştirmesini tamamladık. Şimdi yazdığımız servis kodunu çalıştıralım ve web servisi ayağa kaldıralım.

env FLASK_APP=webform.py flask run

Evet servisimiz ayağa kalktı ve endpoint adresi ekranda bize gösterildi. Şimdi servisi test edelim. Ben webservis testini postman ile yapacağım ama bu zorunlu değil soapui gibi araçlarlada test edilebilir. Şimdi postman’i açıp ekranda gördüğüm endpoint’i bir input text girerek request edeceğim ve servisin response’una bakacağız.

Evet yukarıdaki görselde de göreceğiniz üzere postman üzerinden servisin ayakta olduğu endpointe (http://127.0.0.1:5000/sentiment) “this is great” input text’ini gönderdim ve sonuç olarak servis bize bu text sentimentinin “Positive” olduğunu söyledi.

Görüldüğü üzere Flask ile çok rahat bir şekilde geliştirmiş olduğum machine learning modelini deploy edip kullanıma açtım. Artık bu servisi kullanacak her kullanıcı ile bu endpoint’i paylaşarak servisi kullanmalarını sağlayabiliriz.

Posted in Uncategorized | Tagged , , , , , , , , , | 2 Comments

Doğal Dil İşleme Problemlerinin Çözüm Yaklaşımları ve Gelişimi

Herkese Merhaba,

Doğal Dil İşlemle problemlerini çözme yöntemlerinin evrimi üzerine bir kaç not bırakmak adına bu içeriği oluşturuyorum. Bu yazı, bu metodlardaki gelişimi çok üstün körü anlatmaktadır dolayısıyla sadece sonraki okumalarınız için fikir vermesi açısından bir kaç dakikada tüketilebilecek bir içerik olmasını hayal ederek yazıyorum. Dolayısıyla detaylı yöntem incelemesi ve karşılaştırması yapmayacağım eğer bu konuda bir talep gelirse yöntem bazlı daha detaylı anlatımlarıda yine yapmaya çalışabilirim.

Geçmişten günümüze NLP tasklarında (Name Entity Recognition, Part of Speech Tagging, Sentiment Analysis, Document Classification, Question Answering, Reasoning, Machine Translation …) farklı yaklaşım temellerinin üzerine oturan bir çok metod denendi. Bu metodların bazıları daha basit bir mantıkla çalışırken, bazıları ise oldukça karmaşık ve açıklanması çok daha zor sofistike modeller ile çalışıyor. NLP tasklarını çözmeye çalışan metodlara tarihsel olarak bakacak olursak;

1- Bag of Words (BoW) and Word Vectors (Traditional): Kelimelerin metinlerde geçme frekanslarını temel alan ve kelimeleri vektör olarak temsil etme mantığına dayanan bu metod her seviyeden NLP derslerinde anlatılan en fundemental yaklaşım. Anlaşılması oldukça kolay ve kendi içinde farklı detayda yaklaşımları barındıran bir yöntemler kümesi diyebiliriz. Ancak bu yaklaşım kelime anlamlarını ve cümle içindeki pozisyonlarını/sıralarını bypass ettiği için zor taskların çözümünde çok başarılı olduğunu söyleyemeyiz. Zaten yeni metodların keşfide bu eksiklikleri çözümü ile gelişti hep. Mühendislikte her konuda olduğu gibi.

2- Word Embeddings:  Word Embedding’lere başlamadan bir miktar Derin Öğrenmeden (Deep Learning / Derin Yapay Sinir Ağları) bahsetmek gerekir çünkü Yapay Zeka dünyasında başka bir faza geçilmesine olanak sağlayan bir gelişme. Derin Öğrenme algoritmalarının öğrenme kapasitesi ile beraber Yapay Zekanın bir çok alanında inanılmaz ilerlemeler kayıt edildi. Edilmeyede devam ediliyor. Nihayetinde NLP’de bu gelişmeden nasibini aldı tabiki. Word Embedding’lerin gelişiminde Derin Öğrenmenin katkısı çok ama çok fazla oldu. Word Embedding, NLP problemlerinin çözümünde yeni bir dönemin başlamasına sebep olan çok güçlü bir yöntem. Temel olarak kelimelerin anlamlarına odaklanan ve sözlükteki her kelimenin, N-boyutlu uzayda birbirleri ile matematiksel operatörler kullanarak (toplanabilen, çıkartılabilen) işlemler yapılabilir hale dönüşmesini sağlayan bir teknik. Kelimelerin (vektörlerin) uzaydaki yakınlıkları, anlamsal olarakta yakın olduklarınıda söylemekte. Yani bize semantic yakınlık hakkında da bilgi veriyor word embeddingler. Word Embeddinglerin oluşturma süreçleri var  bu süreç kabaca şöyle çalışıyor. Siz elinizde ne kadar külliyat varsa (bu wikipedia daki tüm içerik olabilir mesela) modele veriyorsunuz, modelde kendi algoritmaları ile (Skip Gram veya CBOW) bu verdiğiniz külliyatdan her bir kelime için bir vektör temsili buluyor (örneğin ingilizce’de her kelime için 300 özellikli bir temsil söz konusu. Her kelime için 300 boyutlu bir vektör var word2Vev’de). Word Embeddinglerin kullanımı oldukça basit çünkü önceden eğitilmiş/ öğrenilmiş birden çok word embedding hali hazırda literatürde mevcut. Bu nedenle bir külliyat ile yeniden bu vektörleri öğrenme maliyetine girmiyoruz çoğunlukla (çok maliyetli bir işlem). Milyarlarca döküman ile eğitilmiş embeddingleri kullanıyoruz genellikle. Literatürde en çok bilinen başlıca Word Embedding’ler Google’ın Word2Vec’i, GLoVe, ve FastText (Facebook). Bu hazır önceden eğitilmiş kelime temsillerini alıp tasklarımızda hazır kullanabilmekteyiz. Bu konu çok derin olduğu için daha fazla uzatmıyorum ve son olarak şunu eklemek istiyorum. Bu kavramı konuşurken Tomas Mikolov’dan bahsetmemek olmaz çünkü Word Embedding kavramının gelişimine inanılmaz bir katkı sundu. Kendisi Google çalışanı ve Word2Vec’in mucidi. O meşhur makalesinin linkinide buraya bırakıyorum.  https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf

3- Deep Learning, Attention Mekanizmaları, Word Embedding ve bu yöntemlerin kombinasyonları: Bu yöntemlerin combine edilip kullanılması 2010’lı yılların başlarından günümüze kadar uzanmakta. Hala trend konular içerisinde yerini koruyor. Derin Öğrenmenin yüksek öğrenme kapasitesi ile kelimelerin semantic temsilleri bir araya gelince bir çok zor task’da SOTA (State of the Art)’lara ulaşıldı. Machine Translation, Question Answering ve Reasoning gibi çok ama çok zor tasklarda büyük başarılar elde edildi. Hatta Google Translate’in başarısının arkasında yine bu kombinasyonlar yatıyor. Google kendi ürünlerini geliştirirken yeni yeni yöntemler keşif ediyor çoğunlukla. Dolayısıyla lokomotif ürünleri yeni alt yapılarla çalışmaya başlıyor bir süre sonra ve bir taraftan da bu yenilikleri community ile paylaşıp herkesin faydalanmasına olanak sağlıyorlar. Google Translate ve Google Search Engine servisleri kendilerinin geliştirdiği ve tüm dünyaya armağan ettikleri yeni yaklaşım olan BERT’i (Bi-directional Encoded Representations from Transformers) de kullanıyor artık. Özellikle search engine’in context bağımlı arama yapabiliyor olması doğru sonuçları kullanıcılara ulaştırma anlamında çok ama çok önemli.

4- Transformers: Word Embedding’ler kusursuz alt yapılar değiller tabiki. Hala güncel olarak kullanılsada belli başlı problemleri var (Context Indepedent, Long Term Dependencies, Computation Complexity vs..). Bunlardan en bariz olanı kelime temsillerinin tek olması ve context’den bağımsız olması. Bunu şöyle anlatabilirim. Örneğin race kelimesinin ingilizcede 2 anlamı var. Bunlardan biri Irk diğeri ise yarış. Bunlar anlamsal olarak çok farklı kavramlar. Ancak elimizdeki embedding’de race ile ilgili tek vektör var. Bu vektör anlam olarak ırk mı demek?  yoksa yarış mı demek?. Bu sorunun cevabı aslında embedding i eğittiğimiz külliyat ile doğrudan alakalı olsada temsil ettiği anlam tek. Bu nedenle eş anlamlı sözcüklerin sadece 1 anlamının word embedding ile temsil edildiğini kabaca söyleyebiliriz. Eğer bizim embedding’imizdeki race = yarış olarak öğrenildi ise ırkçılığın anlatıldığı bir paragrafın sınıflandırması probleminde büyük ihtimalle modelimiz hata yapacaktır. Bu noktada yine araştırmacılar devreye girip nasıl çözebileceklerini düşünüp Transformers fikrini ortaya atmışlar. Transformers’lar temel olarak kelime anlamlarını tamamen gelen contexten öğrenmeye çalışarak eş anlamlı kelimelerde yaşanacak problemleri bertaraf etmeye çalışmakta. Şu an NLP dünyasında SOTA yaklaşım Transformers’lar ve bu furyanın öncülerinden biri yine Google ve önerdikleri framework’ün adı BERT  (Bi-directional Encoded Representations from Transformers). (Transformers’larında Derin Öğrenme temelli çalıştıklarını unutmamak lazım.). BERT’in anlatıldığı meşhur makalenin linkini bırakıyorum. https://arxiv.org/pdf/1810.04805.pdf (2018).

Transformers’ların yaşanan bir çok problemi çözdüğü görülünce farklı Transformers alt yapıları geliştirilmeye devam edildi zaman içerisinde. Bunlardan BERT kadar meşhur olanı ve başarılı olanı Open AI’ın GPT ve GPT-2’si. Paper linkleri : https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf – https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf . BERT ve GPT dışında XLM (Facebook), RoBERTa(Facebook), Transformer-XL (Carnigie Mellon University) ve ALBERT (Google + Toyota) bilinen diğer Transformers’lar. Bunların dışında da yine farklı transformers modelleri mevcut.

Transformers’ların da kullanımı oldukça kolay. Bir üst paragrafta örneklerini sıraladığım Transformers lar önceden eğitilmiş ve kullanıcıların kullanımına açılmış durumda. Ancak bunların çoğu ingilizce’de eğitilmiş alt yapılar yavaş yavaşta farklı dillerdeki versiyonlarıda eğitilmekte. HuggingFace oluşumu aslında birazda bu işi üstlenmiş durumda. HuggingFace, yukarıda örneklerini sıralamış olduğum Transformerların implementasyonlarını yaptıkları python kütüphaneleri geliştirerek son kullanıcıların bu modelleri rahatlıkla kullanabilmelerini sağlamalarının yanında farklı diller için bu modelleri eğiten insanların modellerini paylaştıkları bir mekanizmada sunuyor. Yaptıkları inanılmaz güzel bir iş ve twitter’dan takip etmenizi öneriyorum. (@HuggingFace —> https://twitter.com/huggingface )

Bu noktada BERT’in Türkçe versiyonundan bahsetmemek olmaz çünkü üzerinde durulması gereken katma değeri oldukça yüksek bir iş.  “Türkçe eğitimi yapılmış BERT modeli” nin adı ise BERTurk (https://github.com/stefan-it/turkish-bert). Bu konunun gelişimini çok yakından takip etmiştim çünkü Yüksek Lisans’ta  Deep Natural Language Processing dersini aldığım hocam Reyyan Yeniterzi işin içindeydi. Yayınlanan sayfada ekibin Prof. Dr. Kemal Oflazer (Carnige Mellon University), Reyyan Yeniterzi (Sabancı Üniversitesi) ve Stefan Schweter olduğunu görmekteyiz. Bu çalışma eğer yapılmasaydı Türkçe için BERT alt yapısını kullanmak ilk etapta mümkün olmayabilirdi. Bu bağlamda BERTurk’un Türkçe NLP çalışmalarına katkısının oldukça yüksek olduğunu söylemek çokta yanlış olmaz. BERTurk’un oluşturulması için Stefan Schweter, içinde 4 tane RTX-2080 GPU olan bir makinanın 5 gün boyunca çalışarak bitirebildiğini yazmıştı.

Turkish BERT’in duyurulma tweeti güzel bir anıydı 🙂 https://twitter.com/_stefan_munich/status/1229183985630240769

Posted in Root, Uncategorized | Tagged , , , , | Leave a comment

Oracle Big Data Service, Oracle Cloud Infrastructure Üzerinde Kullanıma Açıldı

Herkese Selam,
Oracle bugün Big Data Servisi kullanıma açtı. Bu servis hızlı bir şekilde istediğiniz büyüklükte, güvenli ve ölçeklenebilen büyük veri platformu yaratabilmemize olanak sağlayan esnek bir bulut hizmeti.

Oracle Big Data Service, Cloudera tabanlı çalışan otomatikleştirilmiş bir servis. Bu alt yapı ile ileri analitik yeteneklerine sahip Hadoop data lake ortamları oldukça uygun maliyetler ile provizyonlanabilmekte. Big Data ve Data Lake platformlarının kurumsal ölçekte büyük alt yapı maliyetlerine sebebiyet veren ihtiyaçlar (CAPEX) olduğunu düşündüğümüzde ilk yatırım maliyetleri anlamında oldukça büyük bir fırsat vermekte ihtiyaç sahiplerine.

Bu servis çok basit bir şekilde porvizyonlanabilmekte. Kabaca nasıl provizyonlandığına ve hangi opsiyonları içerisinde barındırdığına bir bakalım.

Big Data Servis’e OCI arayüzünden erişilebilmekte.

Açılan ekrandan Create Cluster diyerek yaratacağımız Big Data Cluster’ının spesifikasyonlarını belirleyeceğimiz alt yapıya ulaşabiliyoruz.

Öncelikli olarak yaratacağımız cluster’a bir isim veriyoruz ve bir admin şifresi belirliyoruz. Bu aşamadan sonra cluster üzerinde çalışacak yazılımın(Cloudera Hadoop) cluster versiyonunu belirliyoruz. Big Data Service, Cloudera Hadoop Distrobution kullanmakta bu adımda hangi distro’yu kullanacağımıza karar veriyoruz. Ben CDH 6.2.0 olan daha güncel sürümü seçiyorum.

CDH 6.2.0 sürümü ile aşağıdaki komponentler otomatik olarak gelmekte.

Cluster yazılım sürümünü de belirledikten sonra bu aşamada cluster ile ilgili  bazı seçimler yapmaya devam ediyoruz. Bunlar;

MASTER/UTILITY NODE AYARLARI

CHOOSE INSTANCE TYPE: Burada master node’un instance tipini seçiyoruz.  Hem Virtual Machine hem de Bare Metal olarak cluster’ımızı ayağa kaldırabiliyoruz. Ben Virtual Machine olarak kaldırmayı tercih ediyorum.

CHOOSE MASTER/UTILITY NODE SHAPE: Burada Master node’un hangi donanım spesifikasyona sahip olacağını belirlediğimiz parametre. Burada oldukça fazla seçeneğimiz mevcut. 4 CPU 60 GB RAM’e sahip opsiyondan 24 CPU 320 GB RAM spesifikasyona sahip bir donanım seçeneğine kadar farklı opsiyonlarımız mevcut. Hatta daha güçlü IO performansına sahip olan (Dense IO) seçeneklerde mevcut.

BLOCK STORAGE SIZE PER MASTER/UTILITY NODE (IN GB): Master Node’ların her biri için ne kadarlık bir storage kapasitesi istediğimizi yazıyoruz. Bu kapasite 150 GB ile 32 TB’a kadar değişmekte. Kapasite arttırımını 50GB büyüklüğünde yapabiliyoruz.

Aynı konfügrasyonu Worker Node’lar için yapacağız. Ayrıca Worker Node’ların donanım spesifaksyonları için daha fazla opsiyon bulunuyor.

WORKER NODE AYARLARI

Bu ayarları yaptıktan sonra pencerenin altındaki Create Cluster düğmesine basarak servisin yaratılma işlemini başlatabiliriz.

Görüldüğü üzere Big Data Service’ini ayağa kaldırmak oldukça basit. Edinme kolaylığının yanı sıra Big Data Servisi ile bir çok ileri analitik çözümde kullanımımıza açılmış durumda. Bunlardan şüphesizki en önemlilerden biri Cloud SQL özelliği. Cloud SQL özelliği, tüm big data kaynaklarımızı Oracle SQL ile sorgulayabilmemize olanak sağlıyor. Bu kaynaklar HDFS, Hive, Object Stores, Kafka ve NoSQL veritabanları olabiliyor.

Cloud SQL’in yanı sıra Machine Learning workload’larını da Spark ve Hadoop içerisinde ölçeklendirilebilir bir formatta çalıştırabiliyoruz.

Oracle Big Data Service, ML alt yapıları ile makine öğrenmesi uygulamaları geliştirebilme, büyük hacimli veri saklama ve onları analiz edebilme, güvenilir bir alt yapı ile ölçeklenebilir uygulama geliştirebilme gibi bir çok ihtiyacımızı düşük maliyetler ile karşılayabilecek nitelikte. Büyük veri ortamlarının yönetilme maliyetlerini de düşündüğümüzde Big Data Platformunu bulut üzerinden bir servis olarak edinmek oldukça mantıklı bir opsiyon olarak gözükmekte.

 

Daha detaylı bilgi edinmek için linki takip edebilirsiniz.

Oracle Big Data Service

Posted in Oracle, Root, Uncategorized | Tagged , , , , | Leave a comment

Twitter Verisinin Oracle Cloud Streaming Servisi Üzerinden Autonomous Data Warehouse’a Yazılması ve Sorgulanması

Herkese Selam,

Bu yazıda Oracle Cloud Streaming Servisi üzerindeki bir kuyrukta (stream/topic) duran veriyi geliştireceğimiz bir python consumer’ı ile okuyup Oracle Cloud üzerinde provizyonladığımız bir Autonomous Datawarehouse veritabanına yazacağız. Daha sonra veritabanına yazdığımız verinin  veritabanı üzerinden sorgulamasını yapacağız. Umarım farkındalık anlamında faydalı bir yazı olur.

Öncelikle senaryomuz şu şekilde. Stream edeceğimiz veri kaynağı twitter. Dolayısıyla ilk etapta twitter’dan okuyacağımız veriyi Oracle Streaming Servisi üzerindeki bir kuyruğa yazacağız. Buraya kadar olan kısımı bu yazı içerisinde tekrardan geliştirmeyeceğim. Bu kısımın nasıl yapıldığını detaylı bir şekilde anlattığım Oracle Cloud Streaming Servisi (OSS) ve Oracle Data Science Cloud Servisi ile Entegrasyonu isimli yazıma bakarak yapabilirsiniz. Şu anda yapacağımız örnek, referansını verdiğim örneğin devamı niteliğinde olacağından dolayı ilk olarak onun yapılması gerekecektir.

Referansını verdiğim makaleye konu olan örnek esasında büyük resimin Producer parçası idi. Şu geliştireceğimiz parça ile de büyük resimin Consumer parçasını yapmaktayız. Geliştireceğimiz consumer çok basit bir şekilde OSS’de duran bir streami okuyup Oracle Autonomous Datawarehouse’a yazacak.

Geliştirmeye Oracle Data Science Cloud servis üzerinden devam edeceğim için bu servisin Autonomous Datawarehouse’a bağlanabilmesi gerekmekte. Bu bağlantının nasıl yapılacağını Oracle Cloud Data Science Servis Üzerinden Oracle Autonomous Datawarehouse’a Bağlanmak başlıklı yazımı okuyarak basitçe yapabilirsiniz. Bu bağlantı sağlandıktan sonra şimdi Consumer kodumuzu geliştirmeye başlayabiliriz.

Öncelikle consumer’ımız OSS’den okuyacağı veriyi Autonomous Datawarehouse(ADW)’da bir tabloya yazacak. Dolayısıyla bizim bu veriyi ADW’de saklayacak bir tablo yaratmaya ihtiyacımız var. Bu tablo kabaca tek kolon bir tablo olacak ve OSS’e gönderdiğim tweetleri saklayacak. Bu noktada belirtmemiz gereken bir ayrıntıda şu. Twitter bize tweetleri json formatında döndürmekte. Producer kısmını geliştirirken twitter’dan gelen cevabı hiç bir değişikliğe uğratmadan OSS içindeki kuyruğumuza json olarak yazmıştık.  Şimdi ise bu kuyruktaki json veriyi ADW içinde yaratacağımız tabloda json olarak tutacağız. O halde ADW tarafında json formatında tweetleri yazacağımız tabloyu yaratalım.

CREATE TABLE demostreamtweet
  (tweet clob);

Evet ADW’de verileri tutacağımız tabloyu yarattık. Şimdi Oracle Data Science Cloud servis tarafına geçip bu tabloya veriyi yazacak consumer kısmını gerçekleyelim.

İlk önce ADW bağlantımızı kuruyoruz ve gerekli kütüphaneleri import ediyoruz.

import sqlalchemy as db
import pandas as pd
import numpy as np
import os
import warnings as w
from __future__ import absolute_import, print_function
from tweepy import OAuthHandler, Stream, StreamListener
from kafka import KafkaConsumer, KafkaProducer
import json

w.filterwarnings("ignore",category=Warning)

os.environ['TNS_ADMIN']='instantclient_19_5/network/admin/'
engine = db.create_engine('oracle://ADMIN:Welcome1@dbml19c_high')

Evet şimdi Oracle Streaming Servisine yazdığımız datayı gerçek zamanlı okuyacak consumer objemizi yaratalım. Bu objede kullandığımız parametrelerin tamamının nasıl elde edildiğini Oracle Cloud Streaming Servisi (OSS) ve Oracle Data Science Cloud Servisi ile Entegrasyonu isimli makalede detaylıca anlatmıştım. O yazıyı inceleyerek bu bilgileri nasıl elde edeceğinizi öğrenebilirsiniz. Ayrıca consumer objesinin beklemiş olduğu parametrelerden biri hangi stream’i/topic dinleyeceğimiz bilgisi. Bu stream’de referansını verdiğim makalede veriyi yazmış olduğumuz yer olan demostream isimli topic olacak. (Burada geliştirdiğimiz örnek referansını verdiğim makalenin devamı niteliğindedir)

consumer = KafkaConsumer('demostream', bootstrap_servers = 'streaming.<your_region>.oci.oraclecloud.com:9092', 
                         security_protocol = 'SASL_SSL', sasl_mechanism = 'PLAIN',
                         consumer_timeout_ms = 10000, auto_offset_reset = 'earliest',
                         group_id='consumer-0000',
                         sasl_plain_username = '<your_tenancyname>/<username>/<streampool_ocid>', 
                         sasl_plain_password = '<your_auth_token>')

Evet consumer objemizde yaratıldı. Şimdi demostream topic’ine yazdığımız mesajları tek tek okuyup Autonomous Datawarehouse’da yarattığımız tabloya gönderelim.

metadata = MetaData()

twitter_stream = Table('demostreamtweet', metadata,
    Column('tweet', String, primary_key=False),
)

for message in consumer:
    upsert = twitter_stream.insert().from_select([twitter_stream.c.tweet],select([literal(message.value)]))
    engine.execute(upsert) 

Evet kodumuzu çalıştırdığımızda OSS içinde demostream içinde yazılan verilerimizin gerçek zamanlı bir şekilde okunup ADW’de yaratmış olduğumuz demostreamtweet isimli tabloya yazıldığını gözlemleyebiliriz. Şimdi ADW tarafına gidip tablomuzu select edelim.

select * from demostreamtweet;

Evet Streaming Servisten okuduğumuz veriler gerçek zamanlı olarak ADW’ye yazılıyor. Şimdi ADW içinde bu json veriyi parse etmeye çalışalım.

Bilindiği üzere Oracle veritabanı converged ve polyglot bir yapıda. Bu yapıda olması bir çok veri tipini destekleyebilmesi anlamına geliyor. Bu veri tipleri arasında json’da var tabiki. Çok basit SQL cümleleri ile sakladığımız json verileri parse edip anlamı hale getirebilmekteyiz. Bunun ile ilgili küçük bir sorgu paylaşarak yazıyı sonlandırıyorum. Umarım farkındalık anlamında faydalı bir çalışma olmuştur.

SELECT 
   JSON_VALUE(m.tweet, '$.id') id, 
   TO_CHAR(to_timestamp(upper(REGEXP_SUBSTR (JSON_VALUE(m.tweet, '$.created_at'), '[^ ]+' , 1 , 3 )
  || REGEXP_SUBSTR ( JSON_VALUE(m.tweet, '$.created_at') , '[^ ]+' , 1 , 2 )
  || REGEXP_SUBSTR ( JSON_VALUE(m.tweet, '$.created_at') , '[^ ]+' , 1 , 6 )
  || ' '
  || REGEXP_SUBSTR (JSON_VALUE(m.tweet, '$.created_at'), '[^ ]+' , 1 , 4 )),'DDMONYY HH24:MI:SS') + INTERVAL '03:00' HOUR TO MINUTE,'DD-MON-YY HH24:MI:SS') created_at ,
JSON_VALUE(m.tweet, '$.user.followers_count') followers_count,
  JSON_VALUE(m.tweet, '$.user.friends_count') friends_count,
  JSON_VALUE(m.tweet, '$.user.favourites_count') favourites_count
FROM demostreamtweet m;

Posted in Oracle, Root, Uncategorized | Tagged , , , , , , , , , , | Leave a comment