[DajSięPoznać#15] Estymacja cen: Machine Learning i Accord.NET

Wstęp

Pomysł na tego posta pojawił się podczas tegorocznej edycji 4developers i prezentacji “Holistyczne ujęcie machine learning”. Skoro ML jest tak popularny jako narzędzie do rozwiązywania różnej klasy problemów, to dlaczego nie spróbować użyć go do estymacji cen mieszkań na podstawie pobranej próbki danych. Temat nie jest wcale nowy i można łatwo znaleźć publikacje na temat parametrów branych pod uwagę przy estymowaniu ceny, np tutaj.

Accord.NET

Dobrą biblioteką wspomagającą ML dla .NET jest Accord.NET. Zawiera on całkiem sporo gotowych algorytmów matematycznych do budowania regresji, klasyfikacji wzorców, czy wykrywania incydentów, a więc tematów kręcących się wokół buzzwordu “machine learning”. Pracę rozpoczynamy tradycyjnie od Nugeta:

accord

Dodane zostaną od razu zależne pakiety: Accord i Accord.Math

Regresja liniowa

Pomysł jest bardzo prosty i z tego, co można wyczytać w sieci, często stosowany w praktyce.Wystarczy zdefiniować wektor wejść oraz oczekiwane wyjście, a algorytm zadba o to, by dobrać współczynniki dla każdego elementu z wejścia tak, by błąd był jak najmniejszy. Używa się tu często metody najmniejszych kwadratów, ale można od razu wykorzystać Accord.NET:

let findCoefficients(dataCsv:seq<string>) = 
    let dataCsv = dataCsv |> Seq.map(fun row -> row.Replace(".",","))
    let numData = dataCsv |> Seq.map(fun row -> 
                            (row.Split(';') |> Seq.map(System.Double.Parse)))

    let vectorDim = (numData |> Seq.head |> Seq.length) - 1
    let inputs = numData |> Seq.map(fun seq -> seq |> Seq.take(vectorDim) |> Array.ofSeq)
                         |> Array.ofSeq
    let outputs = numData |> Seq.map(fun seq -> seq |> Seq.last) |> Array.ofSeq

    let target = new MultipleLinearRegression(vectorDim)
    let error = target.Regress(inputs, outputs)

    target.Coefficients |> Seq.ofArray

Zadaniem metody Regress jest znalezienie współczynników dla funkcji y=ax1+bx2+cx3+….

Parametrem wyjściowym jest oczywiście cena, parametrami wejściowymi początkowo były:

  • powierzchnia
  • liczba pokoi
  • piętro
  • czy posiada miejsce parkingowe (0,1)
  • rok budowy
  • id dzielnicy (rozumiane jako liczba z zakresu 0 – 17, gdzie dzielnica z najniższą średnią za metr ma wartość 0, a ta z najwyższą wartość 17)

Ponieważ nie wszystkie ogłoszenia zawierały cały zestaw danych, to dla uproszczenia przyjęte zostało, że w puste miejsca wstawione zostaną mediany wyliczone na podstawie innych ogłoszeń.

Wzór liniowy wygląda następująco

cena = -0,31*pow + 116 926,45*l_pokoi -3 372,88*piętro -1 861,52 *miejsce_postojowe -16,19*rok_budowy + 12 299,62*id_dzielnicy

Niektóre współczynniki nie przekładają się znacząco na cenę (na podstawie posiadanych danych), inne jak powierzchnia zostały ustalone na wartości ujemne by minimalizować błąd, ale tu funkcja nadrabia silnie skorelowaną z powierzchnią liczbą pokoi.

Support Vector Machine

Przykładem podejścia uczenia nadzorowanego do zagadanień regresyjnych jest metoda wektorów nośnych, którą całkiem dobrze zilustrowano tutaj.  Jest to metoda z pogranicza klasyfikacji i regresji. Do wyznaczania samej regresji użyta została klasa SequentialMinimalOptimizationRegression z pakietu Accord.MachineLearning. Dokładność obliczeń zależy od wyboru funkcji kernela, w poniższym przypadku zastosowany został wielomian trzeciego stopnia.

let createSvm(dataCsv:seq<string>) =
    let (vectorDim, inputs, outputs) = parseCsvData(dataCsv)

    //redukcja parametrow do minimum
    let inputs = inputs |> Array.map(fun arr -> [|arr.[1]; arr.[5]|]) //l.pok, id.dziel
    let vectorDim = 2

    let machine = new KernelSupportVectorMachine(new Polynomial(3), vectorDim);
    let learn = new SequentialMinimalOptimizationRegression(machine, inputs, outputs);

    let error = learn.Run();

    let testData = [|3.0; 12.0|]
    let fxy = machine.Compute(testData);
    machine
Advertisements

One thought on “[DajSięPoznać#15] Estymacja cen: Machine Learning i Accord.NET

  1. Pingback: [DajSięPoznać] Podsumowanie | When the smoke is going down

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s