Merhabalar bu yazımda Makine Öğrenme algoritmalarından olan Lineer Regresyon nedir ve Swift dili ile örneğini göreceğiz.
Regresyon nedir ? Regresyon, iki (ya da daha çok) değişken arasındaki doğrusal ilişkinin fonksiyonel şeklini, biri bağımlı diğeri bağımsız değişken olarak bir doğru denklemi olarak , göstermekle kalmaz, değişkenlerden birinin değeri bilindiğinde diğeri hakkında kestirim yapılmasını sağlar.
Kısaca verilerimizi x-y kordinatında değerlerine göre dağıttığımızı düşünelim. Bu veriler bir biri arasında bir uzaklıkları vardır. Amacımız tüm verilerden geçebilecek yada en doğru şekilde geçen bir doğru çizmektir. Buradaki doğru çizmek olayı lineer bir yapıda regresyon gerçekleştirdiğimiz içindir. Amacımız train verilerimizin düzlem üzerindeki dağılımını matematiksel bir modele benzetmek böylelikle doğru regresyon türünü bulabiliriz. Örneğin sürekli inişli çıkışlı bir veri setimiz var ise lineer regresyon kullanmak mantıklı olmayacaktır. Bunun için lojistik regresyon kullanmanız daha başarılı sonuçlara ulaşmanızı sağlayacaktır. Çünkü lojistik regresyon verileri düzlem üzerinde logaritmik olarak dalga biçiminde yakalamaya çalışır.
Şekilde görüldüğü gibi en doğru lineer çizgi çizilmeye çalışılır ve buda tahminleme işleminin başarısını yükseltir.
Yukardaki resimde doğru formulleri verilmiştir. Aşağıdaki örneğimde Araba yılı ve fiyatları olan data setimizden araba yılına göre tahmin işlemi gerçekleştirmekteyiz. Kodu inceleyebilirsiniz.
import Foundation extension Int { func toDouble() -> Double { return Double(self) } } let carAge: [Double] = [10, 8,7, 3, 3, 2, 1] let carPrice: [Double] = [500, 400,900, 7000, 8500, 11000, 10500] var intercept = 0.0 var slope = 0.0 func predictedCarPrice(_ carAge: Double) -> Double { // y = B*X + € return intercept + slope * carAge } let carPriceCount = carPrice.count let loop = 100 let alpha = 0.0001 for n in 1...loop { for i in 0..<carPriceCount { let difference = carPrice[i] - predictedCarPrice(carAge[i]) intercept += alpha * difference slope += alpha * difference * carAge[i] } } func rootMeanSquared(index:Int) -> Double { return sqrt(pow(predictedCarPrice(carAge[index]) - carPrice[index],2) / carPriceCount.toDouble()) } func error() -> Double { var e:[Double] = [] for i in 0..<carPriceCount { e.append(100 / (linearRegression(carAge, carPrice)(carAge[i]) / carPrice[i])) } return average(e) } func average(_ input: [Double]) -> Double { return input.reduce(0, +) / Double(input.count) } func multiply(_ a: [Double], _ b: [Double]) -> [Double] { return zip(a,b).map(*) } func linearRegression(_ xs: [Double], _ ys: [Double]) -> (Double) -> Double { let sum1 = average(multiply(xs, ys)) - average(xs) * average(ys) let sum2 = average(multiply(xs, xs)) - pow(average(xs), 2) let slope = sum1 / sum2 let intercept = average(ys) - slope * average(xs) return { x in intercept + slope * x } } let result = linearRegression(carAge, carPrice)(8) print("$\(Int(result))") // $1331 print(rootMeanSquared(index: 1)) // 971 br print(error()) // 62.152
Hata fonksiyonu olarak rootMeanSquare kullanılmıştır. Bir çok farklı hata bulma fonksiyonları mevcuttur. Bu konuyada ayrıca ilerleyen yazılarımda değineceğim. Örnekte RMS gerçek değer ile tahmini değer arasındaki hata birimini vermektedir.
Not: Lineer regresyon sayısal değerlerin tahmini için uygulanır. Nominal yani tamamıyla String verilerin tahminini gerçekleştiremez. Gerçekleştirmesi için bu değerlerin sayısal değere dönüştürülüp daha sonra formül üzerinde uygulanması gerekir.
Bu yazı yorumlara kapalı.