Veri Bilimine Giriş ve Linear Regression
Veri bilimi her zaman oldukça popüler bir konu oldu. Tarih boyunca veri bilimi sayesinde elde edilenler göz önünde bulundurulduğunda bu ilginin son derece normal olduğunu söyleyebiliriz. Veri bilimi ile savaşlar kazanıldı. Seçimler kazanıldı. Satış stratejileri geliştirildi. Askeri teknolojiler geliştirildi. Sağlık alanındaki uygulamaları sayesinde hayatlar kurtarıldı ve çok kritik tanılar konuldu.
Bahçeşehir Üniversitesi, Tıp Fakültesi bünyesinde ilk defa Sağlıkta Yapay Zeka dersini açtığımızda, öğrencilerin bu derse ilgi göstereceğini düşünüyorduk ancak bir tıp fakültesinde ilk defa açılan bu dersin, çok kısa bir süre içerisinde diğer tıp fakültelerinde de açılacağını, tıp öğrencilerinin Sağlıkta Yapay Zeka kulüpleri kuracağını, kongreler düzenleyeceğini düşündüysek de, bunun bu kadar hızlı gerçekleşeceğini öngörememiştik.
Bu süreçte tıp fakültelerinde yaşanan değişimi daha yakından gözlemleme şansımız oldu. Yıllardır başarı kriteri olarak kabul gören TUS performansını bir kenara bırakan öğrencilerimiz, kendilerini biyomedikal ve yapay zeka alanında geliştirmeye başladı ve kariyer planlarını bu doğrultuda yaptı. Yine bu süreçte, yapay zeka konusundaki çalışmaları, tıp alanındaki çalışmalarının önüne geçerek kariyerlerinde bir değişim yaşayan çok sayıda hekimle tanıştım.
Konumuza dönecek olursak, bu kısa yazıyla, matematiksel altyapısı ile birlikte Linear Regression konusunu açıklamayı hedefliyoruz. Linear regression ne amaçla kullanılır, hangi soruları yanıtlayabilir, veri bilimi projesinin aşamaları nelerdir ve bu aşamalarda neler yaparız, bu kısa yazının yanıtlamaya çalıştığı başlıca sorular.
Kısa bir not olarak, elbette bu yazıyı kısaltmak için bazı konularda kestirmeden gittim. İlk olarak, bu yazıdaki örnek kodları anlayabilmek için az da olsa Python (veya farklı bir programlama dili) konusunda bilgi sahibi olmanız gerekir. Bir diğer konu ise, İngilizce terimlerin Türkçe karşılıklarının kullanımı konusunda aşırı tutucu olmamanız gerektiği. Bazı ifadeleri özellikle Türkçe kullanmadım zira bu alanda araştırma yaparken, doğal olarak karşılaşacağınız kaynakların büyük bölümü evrensel olarak kullanılan dil olan İngilizce olacak. Yine destek alacağınız online toplulukların büyük bölümü İngilizce.
Faydalı olacağını umarım.
1. Linear Regression
Machine Learning alanında çalışmaya başlayan çoğu kişinin karşılaşacağı algoritmaların başında Linear Regression gelir. Regression, çoğu disiplin için bilimsel araştırmaların istatistiksel çalışmalarında muhtemelen en sık başvurulan yöntemdir. Regression bir olgunun modellenmesi, bir tahminde bulunmak veya varlıklar arasındaki gizli bağlantıların tespit edilmesi gibi pek çok amaçla kullanılabilir.
Bu yazının amacı, Regression yöntemini kullanarak bir problemi nasıl çözebileceğinizi örnekleyerek machine learning konusuna ilk adımınızı atmanızı sağlamak. Bu amaç doğrultusunda Linear Regression konusunu tanımlardan çok, örnekler ve uygulamalar ile açıklamaya çalışacağım. Bunu yapmak için de bir senaryoya ve senaryoda çözmek istediğimiz bir probleme ihtiyacımız var.
Büyük Bir Film Yapımcısı
Senaryomuzda siz bir veri bilimcisiniz ve pek çok farklı sektörden kişi ve işletmeye danışmanlık veriyorsunuz. Ünlü bir film yapımcısı, üzerinde çalıştığı yeni projesi ile ilgili sizinle görüşmek istiyor. Görüşmenizde yaptığı son birkaç projesinde istediği izlenme oranlarını elde edemediğini, bu nedenle şirketinin zararda olduğunu, çıkış yapmak, zararını telafi etmek ve şirketini kara geçirmek için, ünlü oyuncuların yer alacağı, iddialı bir yapım üzerinde çalıştığını, ancak toplumun mevcut eğilimleri ve izlenme istatistiklerini göz önünde bulundurduğu zaman, projesinin istediği başarıyı elde edip edemeyeceğinden emin olmadığını söyledi. Bilimsel bir yaklaşım ile mevcut verilerin analiz edilmesi ve projesinin başarılı olup olmayacağına ilişkin bir tahmin almak için sizinle görüşmek istediği belirtti.
Veri Bilimi Çalışmalarının Yaşam Döngüsü
Bu noktada, senaryomuzdaki veri bilimcisinin bir projesinin yaşam döngüsünü inceleyelim. Bu yaşam döngüsü, çoğu proje için benzer adımları içerir ancak her adımda yapılan işler, projeden projeye farklılık gösterebilir.
1. Problemin Tanımlanması
Bir veri bilimcisi, her yeni problemde ilk olarak problemin tanımını yaparak çalışmaya başlar. Problemin net ve doğru bir şekilde tanımlanması, yapılacak araştırmanın, hazırlanacak veri setlerinin ve çalışmanın diğer aşamalarını doğrudan etkileyecektir. Zira veri biliminde çalışmanın bir adımındaki hata, sonraki tüm aşamaları olumsuz etkileyecektir. Örneğin problemin tanımının hatalı veya eksik yapılması, hatalı veya eksik veri ile çalışılmasına, yanlış bir algoritma seçimi yapılmasına ve sonuç olarak elde edilen sonucun hatalı olmasına yol açacaktır. Bu nedenle veri bilimi çalışmalarında, tüm aşamalarda büyük bir dikkat ve projenin genelinde bütüncül bir bakış açısı hayatidir.
2. Veri Setinin Oluşturulması
Veri bilimi çalışmalarında problem tanımlandıktan sonra, bu problemle ilgili olabilecek mümkün olan tüm verinin toplanması, veri bilimi projelerinde yaşam döngüsünün ikinci adımını oluşturur. Bu aşamada, ilk bakışta önemli veya problem ile doğrudan bağlantılı görünmeyen verilerin, sonuca etki edebilme ihtimali olduğundan, problemin doğru şekilde tanımlanmasından sonra en önemli ikinci aşamasıdır.
3. Veri Temizliği
Gerçek dünyadan topladığımız veriler, çoğu zaman topladığımız haliyle çalışmalarımızda kullanmaya uygun olmayacaktır. İçinde eksikler ve hatalar olacağı gibi, gerçek hayatta makul kabul edilebilecek bazı verilerin, veri bilimi dünyasında belirli standartlarda düzenlenmesi gerekebilecektir. Bu alanda çalıştıkça göreceğiniz üzere, üzerinde çalışacağınız veriler arasında en çok düzeltme gerekenler, insanların serbest metin şeklinde giriş yaptığı verilerde oluşmaktadır. Örneğin doğru yapılandırılmış, insanların serbest metin olarak giriş yapmak yerine listelerden tanımlı öğeler arasından seçim yaptığı bir uygulamadan gelen veriler, tanımlar ve tanımlar arasındaki bağlantılar doğru yapılandırılmış ise hata oranı sıfıra yakın olacaktır, ancak Microsoft Excel ve benzeri, kişilerin tanımlardan çok, serbest veri girişi yaptıkları, herhangi bir doğrulama olmayan uygulamalardan gelen verilerde ise tutarlılık oranı çok düşük olacaktır ve bu veriler, veri temizliği aşamasında en çok zamanınızı alan veriler olacaktır.
Kendi alanımızdan bir örnek verelim. Aşağıdaki tanımlar, yapılan ameliyatlarda müdahale edilen tümör tiplerinin listesinden alındı:
- GLIAL TMR
- GLIAL TUMOR
- GL TUMOR
- GL TMR
- GL TMGLIAL TMR
- GLIAL TUMOR
- GL TUMOR
- GL TMR
- GL TM
Bu 9 tanımın tamamı “Glial Tümör” anlamında kullanılmış, ancak asistanların veri girişi sırasında listeden seçim yapmak yerine serbest metin olarak giriş yapmasından kaynaklı olarak farklı tanımlamalar ortaya çıkmış. Bu örnektekine benzer verilerin standardizasyonunu sağlamak, veri temizliği aşamasında yapmanız gereken işlerden sadece bir tanesidir.
4. Görselleştirme
Veri setini sağlıklı bir şekilde çalışmaya hazır hale getirebilmek için veri bilimcisinin üzerinde çalıştığı iş alanı ile ilgili oldukça fazla bilgi edinmesi ve veri setini anlaması şarttır. Veri setini anlamak için, veri setini analiz etmeli ve çoğu durumda veri setini, varlıklar arasındaki ilişkileri daha iyi anlamak için veri setini görselleştirmelidir.
5. Algoritmanın Eğitilmesi
Gördüğünüz gibi veri biliminde, bir algoritma ile çalışmadan önce yapılması gereken pek çok iş var ve doğru algoritmanın seçimi ve algoritmanın doğru parametreler ile çalıştırılabilmesi için bu adımların her biri son derece önemli. Doğru algoritmanın kullanımı, veri seti içindeki kalıpların daha sağlıklı tanımlanabilmesini sağlayacak, bu da daha sağlıklı ve yüksek başarımlı sonuçlar elde edilmesini sağlayacaktır.
6. Değerlendirme
Veri bilimi projelerinde sonuçların tutarlılığı, sonuçların sürekli değerlendirilmesi ve modelin, süreç içerisinde elde edilen bildirimlerle beslenmesi sayesinde optimize edilmesi sayesinde arttırılır. Ancak veri bilimcinin, projeyi sunmadan önce elde ettiği sonuçları doğrulaması, mevcut bilgiler doğrultusunda modelini optimize etmesi gereklidir. Ayrıca iş özelinde kurgulanan modelin ve algoritmanın performans gerekliliklerini karşılayıp karşılamadığını da değerlendirmek gerekmektedir. Örneğin, bir çağrı merkezinde, gerçek zamanlı olarak müşteri görüşmelerini değerlendiren bir ses analiz algoritmasının, doğal olarak müşterinin konuşmalarını gerçek zamanlı olarak değerlendirip, istenen sonuçları temin etmesi beklenirken, örneğimizdeki senaryo gibi projelerde, bu denli yüksek performansa gereksinim duyulmamaktadır.
Büyük Bir Film Yapımcısı — Problemin Tanımı
Şimdi senaryomuza geri dönelim ve çalışmamızın yaşam döngüsünün ilk adımı olan, problemin tanımı üzerinde çalışalım.
Bu film şirketime ne kadar para kazandıracak?
Yapımcımız doğal olarak şu soruyu merak etmekte. “Bu film şirketime ne kadar para kazandıracak?”
Yapımcımız açısından bakıldığında bu cevaplanması gereken asıl soru ve sizden bu soruya yönelik bir tahmin çalışması talep ediyor. Ancak veri bilimi, daha doğrusu çalıştığımız bilgisayarlar açısından bu soru, başka bir soruyu doğuruyor. “Para” ne anlama geliyor? Özetlemek gerekirse, günlük yaşamda kullandığımız çoğu kelimenin, matematikte karşılığı yoktur. Veri biliminin ana dili de matematik olduğuna göre, üzerinde çalıştığımız problemi, matematikle formülize edilebilir hale getirmemiz gerekdir. Bunun için de “para” kelimesini sorumuzdan çıkartarak, iş dünyasında spesifik bir karşılığı olan, şirketlerin sürekli ölçümünü yaptığı, takip ettiği ve istatistiksel bilgi toplayabileceğimiz “kar / gelir” kelimesine odaklanmak daha doğru olacaktır.
Pekala, “gelir” kelimesinin bizim için doğru kelime olduğuna karar verdik. Ancak bu tek başına bizim için yeterli değil. Gelir’in oluşmasına (veya oluşmamasına) neden olan faktörleri de tanımlamalıyız.
Örneğin; oyuncular bir filmin gelir elde etmesi veya edememesi üzerinde etkili bir faktör mü? Yoksa filmin senaryosu mu daha önemli? Yoksa film için ayrılan bütçe mi? Bütçe aslında hepsini kapsayan bir başlık değil mi? Daha fazla bütçe, daha iyi ve tanınmış oyuncular, daha iyi görsel ve ses efektleri, daha iyi müzik, daha fazla reklam anlamına gelmeyecek mi? Bütçe, sizin için iyi bir başlangıç noktası olabilir. Kısa bir araştırma yaptığımızda, Matrix, Avatar, The Avengers gibi çok büyük bütçelerle çekilen ve çok büyük gişe geliri elde eden filmlerle karşılaştığımızda, teorimizin doğruluğuna olan inancımız biraz daha artıyor. Ancak bu örneklerle yetinmemeliyiz ve kendimize sorular sormayı sürdürmeliyiz. Bu filmlerin başarısı, yapımcımızın filminin başarılı olacağına dair bir teminat olarak kabul edilebilir mi? Soracağımız pek çok soru olabilir ancak yazımın anlaşılırlığını korumak adına şimdilik bu teorinin üzerinden devam edelim. Bu teorinin izinden gideceksek, elde etmemiz gereken ilk veriler, bu filmlerin yapım bütçeleri ve yapımcısına sağladığı gelir miktarları olacaktır. Bu durumda sorumuzu biraz daha spesifik hale getirebiliriz.
“Filmimizin sağlayacağı geliri tahmin etmek için, yüksek bütçeli ve yüksek gelir sağlamış filmlerin bütçe ve gelir bilgilerini kullanabilir miyiz?”
Bu film şirketime ne kadar para kazandıracak sorusuyla başladığımız çalışmamızda şimdiden çok daha spesifik ve veri bilimi çalışmaları açısından daha geçerli bir soruya sahibiz. Peki bu soruyu, yapımcımızın sorduğu ilk sorudan daha iyi yapan şey ne? Herşeyden önce ölçülebilir kriterler içermesi bu soruyu daha iyi bir soru yapıyor. Film bütçesi ve filmlerin sağladığı gelir arasındaki ilişkiyi gerçekten ölçebiliriz. İşte tam bu noktada, bu ölçümü yapmak için doğru algoritmayı seçmek sizin, yani veri bilimcisinin görevi oluyor.
Linear Regression (ve biraz veri bilimi terminolojisi)
Bu senaryodaki gibi iki parametre arasındaki bağlantıya dayanarak tahminde bulunmak istediğimiz durumlar için ideal algoritmaların başında linear regression gelmekte. Senaryomuzda filmin sağlayacağı geliri tahmin etmek istiyoruz. Veri bilimi çalışmalarında tahmin etmek istediğimiz parametreye bağımlı değişken (dependent variable) denmektedir. Aynı parametre, makine öğrenmesi projelerinde ise hedef (target) olarak adlandırılır. Veri biliminde tahminlemede kullandığımız bir diğer parametrelerden biri olan film bütçelerini ise bağımsız değişken (independent variable) olarak adlandırılırken, makine öğrenmesi çalışmalarında “feature” olarak adlandırılmaktadır. Özetlemek gerekirse bu projede, film bütçesi ile geliri arasındaki ilişkiyi açıklamaya çalışan bir model üzerinde çalışacağız.
Yaşam döngümüzün ilk adımı olarak problemi tanımlayarak sorumuzu formülize ettiğimize göre, sıradaki adım olan veri setinin oluşturulması için çalışmaya başlayabiliriz.
Veri Setimizi Oluşturalım
Problemimizin ölçülebilir kriterlere dayanması, oluşturacağımız veri seti için yapacağımız çalışmayı kolaylaştıracaktır. Senaryomuzdaki bağımsız değişkenimiz (feature) için ihtiyaç duyduğumuz veri, filmlerin prodüksiyon bütçeleri. Bu senaryoda görebileceğiniz gibi, çalışmalarımız için gereksinim duyduğumuz veriler, her zaman çalışma ortamımızdan temin edilemeyebiliyor. Bazı durumlarda ise, çalışma ortamından gelen veriler, sağlıklı bir çalışma için yeterli olmayabiliyor ve yine dış kaynaklardan veri temini gerekebiliyor. Bir veri bilimcisi olarak her zaman, çalışmanızı besleyecek, mümkün olan en fazla miktarda veriyi temin etmek isteriz. Veri temini ve sonrasında gelecek olan veri temizliği ve standardizasyonu aşamaları, bu nedenle en fazla zaman harcadığımız aşamalar olmakla birlikte, çalışmamızın başarı oranına doğrudan etki ettiği için büyük bir hassasiyetle ve gereken zamanı ayırarak çalışmak gereklidir.
Şanslıyız ki senaryomuzdaki yapımcı film piyasasını oldukça yakından takip etmekte ve bize binlerce filmle ilgili bütçe ve gelir bilgisini sağlayabilmekte. Peki modelimiz üzerinde çalışmaya başlamak için hazırız diyebilir miyiz? Elbette hayır. Belirttiğim gibi, model üzerinde çalışmaya başlamadan önce yapmamız gereken üçüncü adım, veri temizliği ve standardizasyonu.
Veri Temizliği ve Standardizasyonu
Yapımcımızdan gelen dosyaya baktığımızda, çok sayıda filme ait yayın tarihi, film adı, bütçe ve dünya genelindeki gelir bilgilerini içeren oldukça büyük bir veri seti olduğunu görüyoruz. Ancak veri setini biraz dikkatle incelediğimizde 3, 8, 10, 19 ve 29. Satırlardaki filmler için bütçe bilgisinin mevcut olduğunu ancak gelir bilgisinin mevcut olmadığını görüyoruz.
Bu filmlerin ortak noktasının çok eski tarihli yapımlar olmaları olduğunu fark ediyoruz. Dosyamızda buna benzer verilerin sayısını bilmemiz ve bir çözüm üretmemiz gerekiyor. 5.000’den fazla filme ait bilgilerin yer aldığı dosyamızdaki verileri Ciro bilgisine göre artan sıralamayla görüntülediğimizde, 357 filme ait ciro bilgisi olmadığını görüyoruz.
Sıralama yaptıktan sonra karşılaştığımız sonuç ilk bakışta hipotezimizi doğruluyor. Yani çok eski tarihli yapımlara ait gelir bilgisi elde edilemediği için sadece bütçe bilgisi yer alıyor ancak gelir bilgisi boş bırakılmış.
Ancak satırlar arasında ilerledikçe görüyoruz ki, çok daha yeni tarihli yapımlarda da gelir alanı boş bırakılmış yapımlar mevcut.
Bir veri bilimci olarak görevimiz hiçbir zaman varsayımda bulunmak değil, açıklama bulmaktır. Bu nedenle çalışmalarımızı hiç bir zaman çok mantıklı olsa bile hipotezlere dayanarak ilerletmemeliyiz ve verilerin neden bu şekilde olduğunu doğrulamalıyız.
Yapımcımız ile yaptığımız görüşme sonucunda, eski tarihli yapımlarla ilgili hipotezimiz doğrulanıyor. Gerçekten gelir bilgisi olmadığı için bu bilgi yazılmamış. Yeni tarihli yapımların ise, ciro bilgileri henüz oluşmadığı için boş olduğunu, hatta bütçe bilgilerinin dahi tahmini olarak girildiğini öğreniyoruz. Bazı filmlerinse, çeşitli nedenlerden ötürü yayına girmediği veya farklı nedenlerden ötürü gelir bilgilerinin yayınlanmadığını öğreniyoruz.
Bu örnekten de görüyoruz ki, veri setini geldiği haliyle doğru kabul etmek çoğu zaman bizi yanlış sonuçlara götürecektir. Yapımcımızdan gelen veri setini, geldiği haliyle kullanmaya kalkarsak, 2.076.099.580 dolarlık bütçeye karşılık, 0 dolarlık gelir yazacağız ve doğal olarak bu hatalı veriler sonuçlarımızda ciddi bir sapmaya neden olacak. Bu nedenle veri temizliğimizin ilk adımı olarak gelir alanında 0 dolar yazan bu satırları silmemiz gerekiyor.
İkinci adım olarak, veri setimizde yer alan, ancak analizimizde kullanmayacağımız alanları silmemiz gerekiyor. Bu örnek senaryoda yer alan 5bin civarında kayıt elbette önemli bir problemle karşılaşmamıza neden olmayacaktır ancak trilyonlarca satırdan oluşan kayıtların analiz edildiği veya çok büyük görüntü ve ses dosyalarının analiz edildiği çalışmalarda, analizimiz için ihtiyaç duymadığımız tüm bilgileri, veri setimizden çıkartmamız önem taşır. Bu senaryo için, Rank, Release Date, Movie Title ve Domestic Gross alanları analizimize katkı sağlamayacak alanlar olduğu için, bu alanları veri setimizden siliyoruz. Veri setimizin son hali şu şekilde oluyor:
Veri setimizdeki üçüncü işlemimiz, veri setimizdeki sayısal olmayan tüm verileri veri setimizden silmek olacak. Veri setimizdeki tüm rakamların Amerikan Doları cinsinden olduğunu biliyoruz. Bu nedenle dosyada yer alan tüm $ işaretlerini siliyoruz. Ayrıca verileri daha kolay okumak amacıyla basamak gruplandırma işareti olarak kullandığımız virgülleri de dosyamızdan siliyoruz. Son olarak, sütun başlıklarını boşluk ve özel karakter içermeyecek şekilde düzenliyoruz. Veri setimiz artık şu şekilde görünüyor:
Makine öğrenmesi algoritmamızın veri setimizi kullanırken sorun yaşamaması ve elde ettiğimiz sonuçların daha tutarlı olması için yaptığımız veri temizliği ve doğrulama işlemleri çoğu zaman bu örnektekinden çok daha karmaşık ve pek çok iş biriminin koordinasyonunu gerektirecektir. Bu nedenle veri bilimi çalışmalarında iş birimleri ve/veya veri kaynakları ile veri bilimciler arasındaki iletişimin desteklenmesi kritik önem taşımaktadır.
Veri setimiz hazır ve gerekli veri temizlik işlemlerini gerçekleştirdik. Artık verilerimizi görselleştirip, incelemenin zamanı geldi.
Görselleştirme
Belirttiğim gibi, verileri görselleştirmek, üzerinde çalıştığımız verileri tablolar halinde yorumlamaya çalışmaktan çok daha iyi anlamamızı sağlayacaktır. Verileri görselleştirmek için kullandığımız chart’lar, veri setimizdeki aykırı kümeleri, trendleri ve kalıpları çok daha kolay anlamamızı ve yorumlamamızı sağlar.
Her ne kadar görselleştirme işlemlerinin çoğunu Microsoft Excel veya Google Spreadsheets gibi uygulamalarla yapabilecek olsak da, bu noktada veri bilimciler olarak genellikle R veya Python gibi bir programlama dili kullanarak chart’lar oluşturmayı tercih ederiz. Gelişmiş çoğu programlama dili size verileri görselleştirmek için chartlar oluşturma imkanı verse de, günümüzde istatistiksel analiz için R, makine öğrenmesi ve yapay zeka uygulamalarında ise Python hızla standartlaşmakta. Bu iki dilden hangisi size daha kolay geliyorsa onunla çalışabilirsiniz. Ben örneklerimde daha aşina olduğum Python dilini kullanmayı tercih edeceğim ancak yazdığımız tüm kodları R kullanarak da yazabilirsiniz.
Veri bilimci olarak bir programlama dili kullanarak kod yazmamız gerektiğini öğrendiğimize göre şimdi kodlarımızı nerede yazacağımızı bulmamız gerekiyor. Python için hem Windows hem MAC işletim sisteminde çok sayıda editör mevcuttur. Bu editörlerden dilediğinizi kullanabilirsiniz. En sık kullanılan editörlerden başlıcaları Anaconda, PyCharm ve Visual Studio Code’dur. Hepsini denemenizi ve arayüzünü en çok beğendiğiniz editörle devam etmenizi öneririm. Jupyter Notebook da oldukça sık kullanılan editörlerden biridir ve diğer editörlerden biraz daha farklı olarak kod ve dokümantasyonu bir arada tutan yapısı ve web tabanlı çalışarak bilgisayarınıza birr kurulum yapmanızı gerektirmemesi nedeniyle oldukça tercih edilir. Son olarak, Jupyter Notebook’a çok benzeyen bir yapıya sahip olan ancak benim daha çok beğendiğim Google Colab uygulamasını da kullanabilirsiniz. Hangi editörü seçerseniz seçin, arayüzüne alışmak için biraz zamana ihtiyaç duyacaksınız ve seçtiğiniz arayüze alıştıktan sonra, büyük ihtimalle farklı bir editör kullanmak istemeyeceksiniz. Bu nedenle tüm seçeneklerinizi incelemenizi ve editör seçimine gereken zamanı ayırmanızı öneririm.
Bu noktada hesaplama kapasitesine de kısaca değinmekte fayda var. Bir kaç milyon satırdan oluşan küçük veri setleri çoğu zaman günlük olarak kullandığımız bilgisayarlarda veya küçük ölçekli sunucularda kolaylıkla yönetilebilir. Ancak elimizdeki veri seti ve modelimiz büyüdükçe, daha gelişmiş hesaplama donanımları kullanmamız gerekir. Zira bir makine öğrenmesi algoritmasının kullanacağı, yüzlerce milyardan satırdan oluşan veri ile yapılan milyarlarca hesaplama için klasik cpu’lar yetersiz kalır. Bu noktada devreye GPU’lar girer. Günümüzde bu tür hesaplamalar için Amazon, Microsoft ve Google gibi bulut merkezlerinin kaynaklarını kiralarız. Bu kiralamalarda, hesaplamamız için gereken süre için ödeme yaptığımız için, çoğu zaman donanımı satın almaktan daha uygun maliyetlerle çalışma imkanımız olur. Örnek vermek itibariyle, bu cümleyi yazdığım tarih (13 Şubat 2020) itibariyle sadece 1 adet NVIDIA Tesla V100 16GB GPU almak isterseniz, ülkemizde ödemeniz gereken ücret 70.000 TL’nin üzerinde. Maliyet konusunu örneklemek gerekirse, 96 işlemcili, 1.5TB belleğe sahip, 8 adet Tesla V100 GPU ve 8TB SSD’ye sahip bir sunucuyu Amazon’dan 1 saat kiralamanın bedeli 32.77 USD, 1 yıllık anlaşmada ise saatlik ücret 19.22 USD’ye düşüyor.Aynı sunucuyu ülkemizde satın almaya kalkarsak ödeyeceğimiz rakam 1 milyon TL’nin üzerinde olacaktır. İşte bu nedenle, kiralama çoğu senaryo için en doğru yaklaşım olacaktır. Ben, bu örnekte Google Colab kullanacağım.
Bu noktadan sonra, teoriden biraz uzaklaşarak, kod yazmaya başlayacağız. Eğer gördüğünüz kodlar sizin için bir anlam ifade etmiyorsa endişelenmeyin. Python öğrenmesi ve kullanımı son derece kolay bir programlama dilidir. Eğer gördüğünüz kodlar sizin için çok basitse ve bu kodların daha iyi yazılabileceğini düşünüyorsanız, haklısınız. Ancak burada amacımızın yeni başlayanlar için veri bilimine ilk adımı atmalarını sağlamak olduğunu unutmayın.
Google Colab ile Verilerimizi Keşfedelim
Google Colab’a eriştikten ve yeni bir Notebook oluşturduktan sonra, ilk olarak çalışacağımız verileri içeren csv dosyasını Google Colab’a yüklememiz gerekiyor. Bunu yapmak için ekranın solunda yer alan Files panelini açarak, Upload to session storage butonunu tıklıyor, ardından dosyamızı seçiyoruz. Oturumumuz sonlandırıldığında yüklediğimiz dosyaların silineceğini ve bir sonraki oturumda dosyaları yeniden yüklememiz gerekeceğini unutmayın. Sürekli dosya yüklemek istemiyorsanız, Google Drive’daki dosyalarınızı Google Colab’a bağlayarak çalışabilirsiniz. Dosyamızı yüklediğimize göre, verilerimizle çalışmaya başlayabiliriz.
Python dilinde, diğer pek çok gelişmiş programlama dilinde olduğu gibi çeşitli kütüphaneler aracılığıyla hazır fonksiyonları kullanırız. Deneysel pek çok kütüphane olduğu gibi, birazdan kullanacağımız, Python dilinde standartlaşmış kütüphaneler de mevcuttur.
Pandas
İlk kullanacağımız kütüphane (veya modül), Python’da veri analiz işlemlerinde standart halini almış, son derece kolay kullanımına karşın çok zengin bir fonksiyon seti sunan pandas. Python dilinde pandas modülüne erişmek için tek bir satır kod yazıyoruz.
Ardından yapacağımız işlem ise Google Colab’e yüklediğimiz csv verilerine erişerek bir değişkene yüklemek. Aşağıdaki görselde yer alan 2 numaralı satırda verilerimize erişerek bir değişkene aktarıyor, 3. Satırda ise bu değişkenin içeriğini ekranda yazdırıyoruz.
Şimdi, bir sonraki adıma hazırlanmak için production_budget ve worldwide_gross_usd değerlerini ayrı iki değişkene aktaracağız. production_budget verilerini saklayacağımız X ve worldwide_gross_usd verilerini saklayacağımız y adlı değişkenlerimizi oluşturmak için aşağıdaki kodu yazıyoruz. Bu kod örneğinde pandas modülü tarafından sunulan ve veri biliminde son derece büyük önem taşıyan bir yapı olan DataFrame yapısı ile tanışıyoruz.
DataFrame objesine erişebilmek için ilk olarak 1. Satıra dönüyor ve ikinci bir import işlemi gerçekleştiriyoruz. Ancak bu sefer pandas gibi doğrudan bir modül eklemek yerine, pandas modülü içerisinde yer alan DataFrame’i projemize eklemek istediğimiz için, kullandığımız ifade pandas modülünü projemize eklerken kullandığımızdan daha farklı oluyor.
Önemli Not: Bu blokta yaptığımız değişiklikten sonra, bu kod bloğunu yeniden çalıştırmamız gerekiyor. Aksi taktirde, bir sonraki adımda ekleyeceğimiz kod bloğunda DataFrame objesine erişmeye çalıştığımızda, DataFrame henüz oturumumuzda tanınmadığı için kodumuz çalıştırılırken bir hata mesajı ile karşılaşırız.
Ardından aşağıdaki iki satırı, workbook içindeki 4. Kod bloğu olarak ekliyoruz. Bu satırlarda yeni bir dataframe objesi oluşturuyoruz. Parantez içerisinde verdiğimiz parametrelerle ise, DataFrame objesinin, data değişkenindeki verilerin içerisinde, belirttiğimiz sütundaki verileri okumasını ve X ve y değişkenlerine atamasını sağlıyoruz.
DataFrame objesinin columns parametresine birden çok sütun belirtmek mümkün olsa da, bu örnekte her değişkende tek sütunun olmasını istediğimiz için, bu şekilde kullanmamız gerekiyor.
Sırada, X ve y değişkenlerimize aktardığımız verileri görselleştirmek var. Görselleştirme için, pandas gibi Python dili ve veri biliminde standartlaşmış bir başka modülden faydalanacağız: matplotlib. Matplotlib, Python dilinde, 2 boyutlu chartların oluşturulmasında sıklıkla kullanılan bir modüldür.
Projemize matplotlib modülünün sadece gereksinim duyduğumuz bileşeni olan pyplot’ı ekliyoruz. Bunu yapmak için 1. Kod bloğuna geri dönüyor ve yeni bir import ifadesi ekliyoruz. Aşağıdaki satırı yazdıktan sonra sadece bu kod bloğunu yeniden çalıştırmamız gerektiğini unutmayın.
Bu adımda, import ifadesini ilk import ifadesine benzer şekilde yazdık ancak matplotlib modülünün tamamını değil, sadece gereksinim duyduğumuz fonksiyonları içeren pyplot bileşenini ekledik. Son olarak satırın sonunda yer alan “as plt” ifadesini ekleyerek, bu bileşene kolay erişim için bir takma ad verdik. Bu takma ad sayesinde birazdan kullanacağımız scatter fonksiyonunu matplotlib.pyplot.scatter yerine sadece plt.scatter yazarak çağırabileceğiz.
Scatter fonksiyonu bir dağılım grafiği (scatter plot) oluşturmak için kullanılır. Scatter ile oluşturduğumuz dağılım grafiğini görmek için show() metodunu kullanıyoruz.
Bu kod bloğunu satır satır açıklamak gerekirse;
- Oluşturacağımız chart’ın boyutunu belirtiyoruz.
- Chart’ı oluştururken x ve y eksenlerinde kullanılacak verileri, çizilecek sembollerin şeffaflık oranı ve rengini belirtiyoruz.
- Chart başlığını belirtiyoruz.
- Chart’ın x ekseninin başlığını belirtiyoruz.
- Chart’ın y ekseninin başlığını belirtiyoruz.
- X ekseninin veri aralığını belirtiyoruz (elimizdeki verideki en küçük ve en büyük rakamları limit olarak vermek elbette daha doğru bir yaklaşım olacaktır. Ancak burada amacım en ideal kodlamayı yapmak değil, mümkün olduğunca basit bir kod bloğu ile chart oluşturmayı örneklemek)
- Y ekseninin veri aralığını belirtiyoruz.
- Chart’ımızı çiziyoruz.
Peki bu grafik bize ne anlatıyor?
Herşeyden önce sağ üst köşede, tek başına duran nokta dikkatimizi çekiyor. Bu, veri setimizdeki en yüksek bütçeli ve en yüksek geliri elde eden yapım. Avatar.
Ardından, grafiğimizdeki 0,0 noktasına yakın bölgede ortaya çıkan yoğunlaşma, veri setimizdeki filmlerin büyük çoğunluğunun, 1 milyon doların altında bütçe ile çekilmiş yapımlar olduğunu gösteriyor.
Yine bu grafiğe bakarak, film bütçesi ile geliri arasındaki potansiyel ilişki hakkında fikir edinmeye başlayabiliriz. Zira film bütçesi yükseldikçe, gelirde de gözlemlenebilir bir artış söz konusu. Peki bütçedeki artışla gelir arasındaki bağlantı ne kadar kuvvetli. Yada, bütçeyi ne kadar arttırırsak, gelirimizde nasıl bir artış bekleyebiliriz? Bu soruları sormaya başladığımız an, görselleştirmenin limitlerini aşan bir beklenti içine girmiş oluyoruz ve linear regression konusuna geri dönmenin zamanı diyoruz.
Linear Regression
Film bütçesi ile geliri arasındaki bağlantıyı ölçülebilir hale getirmek, çalışmamızın ana amacı. Bunu yapmak için doğrulanmış bir matematiksel yöntem kullanmamız gerekiyor ki o da başlıkta da yer alan regression (regresyon). Bu noktada grafiğimizi biraz sadeleştirilmiş hali üzerinde anlatmak işleri kolaylaştıracaktır.
Linear regresyon algoritmamız iki türde veri üzerinde işlem yapacaktır. Bunlardan ilki film bütçeleri, ikincisi ise elde ettikleri toplam gelir tutarları. Veri bilimindeki adlandırılmasıyla filmlerin bütçe bilgisi, modelimizin feature’ları olacaktır (independent variable (bağımsız değişken) olarak da adlandırılmaktadır). Tahmin etmeye çalıştığımız gelir bilgisi ise target, yani hedefimiz olacaktır. Linear regresyonunu kullanarak, bütçe ile gelir arasındaki ilişkiyi düz bir hat ile göstermeyi hedefleyeceğiz.
y’yi X’in bir fonksiyonu olarak çizebileceğimizi biliyoruz. y eksenini 10 eşit parçaya bölersek, doğrumuz 10’luk bir kesişme noktasına sahip olur ve X her 2 arttığında y’yi 1 arttırırsa, doğrumuzun 0.5’lik bir eğime sahip olacağını buluruz. Bu durumda denklemimiz şuna benzer: y = 1/2 x + 10
Yani jenerik denklemimiz y = mx + c şeklinde olacaktır (m = eğim, c = sabit). Peki bu denklemde, x ve y arasındaki ilişkinin ne kadar kuvvetli olduğunu nasıl ifade ediyoruz? Bu sorunun yanıtı eğimdir. Eğim, bize X’deki belirli bir değişiklik için y’nin ne kadar değişeceğini söyler, eğimin değeri ne kadar büyükse, doğru o kadar dik olur. X ve y arasında hiçbir ilişkinin olmadığı durumda ise doğrumuz hiç bir eğime sahip olmaz ve düz bir çizgi olarak çizilir. Söz konusu ilişki kuvvetlendikçe doğrumuzun eğimi artar ve daha dik bir çizgi olarak çizilir.
Aslında son derrece basit değil mi. Ancak bu noktada iş biraz farklılaşacak. Machine learning ile matematik arasında önemli bir fark söz konusudur. Machine learning’de gerçek ilişkiyi aslında bilmiyoruz ve bu nedenle eğim ve kesişme noktalarına parametreler olarak atıfta bulunuyoruz. Linear regresyonun sağlıklı çalışması için bu parametrelerin tahmin edilmesi gerekmekte. Aslında, matematiksel gösterim de yukarıda anlattığımdan biraz farklı. İfademizde sabit için kullandığımız c’yi 𝛳0 ile, eğim katsayısını ise 𝛳1 ile ifade edecek, denklemimizde sabitimizi öne alıp, arkasına eğimi koyacağız. Son olarak y yerine hipotezi temsil eden h𝛳(x) ifadesini kullanacağız. Sonuç olarak ortaya çıkan ifade şu şekilde olacaktır.
Peki, bu doğru, gerçekte nereden geliyor? Veri setimize baktığımız zaman, pek çok veri noktası görüyoruz ve gerçekte, pek çok farklı çıkış noktasını referans alan farklı doğrular çizmek mümkün. Peki doğru referans noktasını nasıl bulacağız? Doğrunun geçtiği nokta (fitted veya predicted value olarak adlandıracağız) ve gerçek veri noktalarının paralellik göstermesini istiyoruz. Yoksa tutarlı bir doğruya sahip olamayız. Aslında fitted value ile veri noktaları arasındaki boşluk (residual olarak adlandıracağız), doğrumuzu en ideal şekilde konumlandırmak ve ideal eğimi tespit etmek için kullanacağımız referans noktalarımız. Aşağıdaki örnekte görebileceğiniz doğru (fitting value) ile kırmızı kutular (data point) arasındaki çizgiler, sözünü ettiğim residual’lar.
Peki nasıl oluyor da, biraz önce sorun olarak bahsettiğim bu residual’lar, bize doğru eğimi tespit ederek doğrumuzu en ideal noktada konumlandırmak için yardımcı olabiliyor? Bu sorunun yanıtı çok basit. Çünkü residual’lar basit bir kıyaslama yapmamıza izin veriyor. Doğruyu farklı noktalara çizerek, hangi konumda ve eğimde, daha büyük residual’lar ile karşılaştığımızı gözlemleyebiliyoruz ve daha uzun residual’lar (yani data point ile doğrunun geçtiği noktadaki veri arasındaki farkı temsil eden çizgi) daha başarısız bir tahmin anlamına geliyor. Regression algoritmamızın hedefi de işte tam olarak bu noktayı tahmin etmek.
Peki, bu nasıl oluyor?
Linear regression’ın çalışma mantığını anlatmak için aşağıdaki gibi bir veri setimiz olduğunu varsayalım.
İlk residual gerçek değer (y1) ile predicted value (doğru’nun bulunduğu veri noktası) farkı temsil edecektir. Aynı durum ikinci, üçüncü ve ardından gelen diğer residuallar için de geçerlidir.
Buna göre formülümüz şu şekilde olacaktır:
y(1) — h𝛳(x(1)) y(2) — h𝛳(x(2)) y(3) — h𝛳(x(3))
İlk üç residual için hesaplama yaptığımızı ve ilk üç residual için elde ettiğimiz değerlerin sırasıyla 10, -6 ve 4 olduğunu varsayalım. Bu durumda yapamayacağımız şey onları toplamak ve en düşük toplamı bulmaktır çünkü ikinci veri noktası doğrumuzun altında yer almaktadır. Negatif değerle işlem yapmamız mümkün olmadığına göre, yapmamız gereken, tüm değerleri pozitif hale getirmektir. Bunu, basitçe değerlerin karesini alarak yapıyoruz ve formülümüz şu hali alıyor:
(y(1) — h𝛳(x(1)))2 (y(2) — h𝛳(x(2)))2 (y(3) — h𝛳(x(3)))2
Bu noktada elimizde tüm residual’ların karelerinin toplamını alarak elde ettiğimiz tek bir sayı mevcut. Linear regression, en iyi parametreleri seçmek için bu sayıyı en aza indirgemeye çalışacaktır. Bu sayıyı Sum of the squared residuals veya kısaca RSS olarak adlandırıyoruz.
minimise: (y(1) — h𝛳(x(1)))2 + (y(2) — h𝛳(x(2)))2 + (y(3) — h𝛳(x(3)))2 + …
Sonuç olarak linear regression algoritmamızı şu şekilde ifade edebiliriz.
i=1n(y1)-h(x(i)))2
Bu, herkes için keyifli olduğundan emin olduğum 😊 teorik bilgilerden sonra uygulamamıza dönebiliriz.
Python ve Linear Regression
Linear regression teorisinin üzerinde yeterince durduğumuza göre, projemizin kodlarını Python dili ile yazmaya ve sonuçları incelemeye hazırız.
Python dil kütüphanesi, linear regression (veya başka bir veri bilimi kütüphanesini) doğal olarak desteklemez. Dolayısıyla kullanmak istediğimiz modülü projemize aynı pandas ve matplotlib modüllerini eklediğimiz gibi eklememiz gerekir. Bu defa projemize ekleyeceğimiz modül, Python dilinde veri bilimi projelerinde endüstri standardı halini aldı diyebileceğimiz Scikit-learn. Ancak scikit-learn son derece geniş bir modül ve biz bu modülün içinden sadece linear regression ile ilgili fonksiyonları kullanacağız. Bu nedenle import yerine from ile modülün sadece kullanacağımız kısmını projemize dahil ediyoruz.
Bu kodu yazmak tek başına yeterli değil, 4. Satırı yazdıktan sonra, ilgili hücreyi yeniden çalıştırmamız gerekiyor.
Sıradaki adımımız, doğrunun eğimini belirlememizi sağlayacak linear regression kodlarını yazmak. Bunun için LinearRegression sınıfından faydalanarak regression adında yeni bir obje oluşturacağız.
Regression çalıştığına göre, eğim katsayımızı (slope coefficient) görmemiz mümkün. Bunu yapmak için yazacağımız kod (ve sonucu) şu şekilde:
Peki hesaplanan intercept değerimiz nedir? Bunu görmek için yazacağımız kod (ve örnek veri setimize göre oluşan sonuç) şu şekilde:
Ve Sonuç
Şimdi ise sırada, regression objesi ile yaptığımız hesaplamayı kullanarak doğrumuzu 4. Adımda oluşturduğumuz chart’a ekleyelim. Bunu yapmak için 4. Adımdaki kodların tamamını alıyor ve doğrumuzu ekleyecek kodları ekliyoruz. Doğuyu çizmek için kullanacağımız fonksiyonun adı plot. Plot fonksiyonu bize X ve y eksenleri için veriler bekler. X ekseni için bütçe verilerimizi tuttuğumuz X objemizi kullanabiliriz. Ancak y ekseni için elimizdeki y objesini değil, X objesindeki her bir veri noktası için ayrı ayrı hesaplayacağımız değerleri kullanacağız. Bu hesaplama için yine regression objesi tarafından sunulan predict fonksiyonuna X objesini vereceğiz. Kodların devamında, 4. Adımda yaptığımız işlemleri tekrarlayarak chart’ımızı biçimlendiriyoruz.
Bu hücredeki kodları çalıştırdığımızda Google Colab chartımızı görüntüleyecektir:
Bu görselde, linear regression modelimizin bütçe-gelir ilişkisine dair tahminini görmekteyiz.
İşimiz Henüz Bitmedi
Verilerimizi standardize ettik, modelimizi hazırladık, kodlarımızı yazdık ve sonucu gördük. Peki gördüğümüz bu sonuç ne kadar doğru? Bir veri bilimi projesini, modelin performansını değerlendirmeden kesinlikle sonuçlandıramayız ve bir veri bilimi projesinin başarısı, projeyi geliştiren kişilerin (ve çalışmayı doğrulayan diğer kişilerin) bu noktada ortaya konulmuş olan çalışmaya ne kadar acımasız yaklaştığı ile doğru orantılıdır. Gerçekten tutarlı ve mantıklı parametrelerle çalıştık mı? Doğru veri seti ile çalıştık mı? Veri standardizasyonu ve hatalı verilerin temizliğinde eksik veya hatamız var mı? Bunlar ve bunlara benzer tüm olası soruların üzerinden tek tek geçmemiz ve bir yerde hatamız varsa mutlaka geri dönüp hatamızı düzeltmemiz veya eksiklerimizi tamamlamamız gerekir.
Buradaki modelimizi ele alacak olursak, eğim katsayımızı hesapladığımızda 3.11 sonucunu elde etmiştik. Bu bütçe ve gelir arasında pozitif bir ilişki olduğunu göstermekle kalmaz, aynı zamanda filmin yapımında harcanan her 1 dolar karşılığında yaklaşık 3.11 dolarlık gelir elde ettiğimiz anlamına gelir. Daha büyük bütçeli filmlerin daha yüksek gelir elde edeceğini düşünebiliriz.
50 milyon bütçeli bir filmin gelirinin ne olacağını bilmek istiyorsak aslında yapacağımız hesaplamayı artık biliyoruz zira theta 0 ve theta 1 değerlerinin kaç olduğunu biliyoruz:
𝛳1: -7.236.192,7 𝛳2: 3.1115
Bu değerler doğrultusunda, mevcut formülümüzü kullanarak şu problemi çözmeyi deneyelim:
Yapımına 50 milyon harcanan bir filmin tahmini geliri ne kadar olacaktır?
Formülümüz:
h𝛳(x)=-7.236.192,7 + 3.1115x
Ve bu formüle göre yapacağımız hesaplama ve örnek grafiğimiz ise şu şekilde olacaktır:
Peki, modelimiz ve dolayısıyla yaptığımız bu hesaplama ne kadar tutarlı? Veya daha doğru bir soru olarak: modelimiz, gerçek dünya verilerinin tam olarak ne kadarını açıklamayı başarıyor? İşte bu soruyu açıklayan değerin adı r kare (r squared veya goodness veya fit). R kare değerini öğrenmek için yine regression objemiz tarafından sunulan bir fonksiyon olan score özelliğini kullanacağız.
Peki elde ettiğimiz 0.54.. değeri tam olarak ne anlama geliyor? Bu değer, yapım bütçesi ile film gelirindeki değişim miktarıdır. Bu basit model için elde ettiğimiz %55 değerinin çok da kötü olmadığını söyleyebiliriz.
Ve şunu söylemeliyim ki, yüzde 55 aslında oldukça iyi çünkü bu şekilde düşünmek çok basit.
Modelimizdeki tek feature olan yapım bütçesi ile, veri setimizdeki filmlerin yapım bütçesi — gelir verilerindeki varyasyonların yaklaşık %55'ini açıklayabildiğimizi görüyoruz. Gerçek hayat projelerindeki proje hedefleri arasında belkide en önemli hedeflerden birisi, bu değeri mümkün olan en yüksek düzeye çıkarmaktır.
Bu oranı yükseltmek için yapabileceğimiz şeylerden biri modelimize yeni bir (hatta birden fazla) feature eklemektir. Örneğin, çekim süresi, devam filmi olup olmadığı hatta biraz daha geliştirerek, her bir oyuncunun ayrı ayrı oynadıkları yapımların gelirine olan etkisini eklesek nasıl olur? Elbette modelimizi sadece mevcut verilerle değil, daha fazla veri ile eğitmemizin de olumlu yönde katkısı olacaktır.
Bu kısa yazıda, Python programlama dilini kullanarak veri bilimine ilk adımı atanlara yardımcı olmak amacıyla bir linear regression örneği hazırlamaya çalıştım.