Prognoza cen domów w USA

Prognoza Cen Domow W Usa



Budowa domu to jedno z wyzwań w naszym życiu. Przed budową istnieje możliwość oszacowania ceny Twojego domu na podstawie ceny poprzedniego domu. Czynnikami, które w największym stopniu wpływają na cenę domu, jest całkowita liczba pokoi (łóżka, łazienka itp.) oraz powierzchnia działki. Dzięki temu możemy oszacować budżet potrzebny na budowę domu.

W tym przewodniku zobaczymy, jak przewidzieć cenę domów w USA za pomocą uczenia maszynowego w języku Python. Najpierw omawiamy zbiór danych, z którego korzystamy, a następnie wstępnie przetwarzamy dane. Następnie wizualizujemy atrybuty obecne w zbiorze danych i stosujemy różne algorytmy uczenia maszynowego w zbiorze danych szkoleniowych (Seattle, Waszyngton, sierpień 2022 – grudzień 2022). Na koniec kończymy ten przewodnik przewidywaniem cen niektórych domów znajdujących się w zbiorze danych Test. Przed przystąpieniem do realizacji tego projektu musimy zrozumieć terminologię Machine Learning używaną w tym projekcie.







Regresja

Jeśli pracujesz z danymi numerycznymi, w uczeniu maszynowym musisz zrozumieć regresję. Regresja to technika nadzorowanego uczenia się w uczeniu maszynowym, która służy do zrozumienia relacji między niezależnymi atrybutami a atrybutami zależnymi (etykieta klasy/cel). Maszyna przewiduje cenę domu, ucząc się każdego rekordu znajdującego się w zbiorze danych. Jest to zatem uczenie się nadzorowane.



Na przykład w naszym scenariuszu niezależnymi atrybutami są liczba łóżek, liczba łazienek, wielkość działki, kod pocztowy itp. Na ich podstawie jesteśmy w stanie przewidzieć cenę naszego domu. Są to więc niezależne atrybuty, które od niczego nie zależą. Cena to docelowy atrybut lub etykieta klasy, która zależy od tych atrybutów.



1. Regresja liniowa

Algorytm regresji liniowej pokazuje liniową zależność pomiędzy zmiennymi atrybutu zależnego (Y) i atrybutu niezależnego (X). Matematycznie możemy to ocenić w następujący sposób:





I = aX+b

Tutaj „a” i „b” są współczynnikami liniowymi.

W Pythonie funkcja LinearRegression() jest dostępna w module „sklearn.linear_model”. Zobaczymy jak to określić w trakcie realizacji projektu. Poniżej znajduje się model z parametrami:



2. Drzewo decyzyjne

Zasadniczo drzewo decyzyjne to graficzne przedstawienie wszystkich możliwych rozwiązań problemu w oparciu o warunki określone za pomocą węzłów. Węzeł decyzji służy do podejmowania decyzji, a węzeł liścia odnosi się do wyniku konkretnej decyzji. Cenę naszego domu możemy przewidzieć za pomocą regresora drzewa decyzyjnego.

W Pythonie DecisionTreeRegressor jest dostępny w module „sklearn.tree”. Zobaczymy jak to określić w trakcie realizacji projektu. Poniżej znajduje się model z parametrami:

3. Losowy las

Losowy las wykonuje tę samą funkcjonalność, która jest podobna do drzewa decyzyjnego. Ale potrzeba lasu (zbiór drzew decyzyjnych) i połączenia (wartość średnia) wszystkich wyników drzew decyzyjnych. Na przykład rozmiar losowego lasu wynosi 3. Zatem wewnętrznie tworzone są trzy drzewa decyzyjne, a cena domu w pierwszym drzewie decyzyjnym wynosi 20000. Wynik w postaci ceny domu w drugim drzewie decyzyjnym wynosi 20000. Natomiast cena domu w drugim drzewie decyzyjnym wynosi 20000. ostatnie drzewo decyzyjne to 10000. Ostateczny wynik to 16 666,666 ((20000+20000+10000)/3).

W Pythonie RandomForestRegressor jest dostępny w module „sklearn.ensemble”. Poniżej znajduje się model z parametrami. Liczbę drzew możemy określić w parametrze „n_estimators”. Domyślnie jest to 100.

Realizacja

Szybko zapoznaj się z etapami przewidywania ceny domów amerykańskich. Rozważamy zbiór danych house_train (plik CSV) z rekordami z 2016 r. (używanymi do uczenia modelu uczenia maszynowego). Następnie przewidujemy rekordy ceny domu (505), które znajdują się w pliku house_test.

1. Ładowanie zbiorów danych pociągowych i testowych

Pandas to dostępny moduł w Pythonie, który służy do analizy danych. Używamy tego modułu do ładowania zestawów danych do środowiska Python. Tutaj używamy Google Co jako środowisko kodu. Jest to dostępne bezpłatnie. Wystarczy konto Google.

Najpierw musimy załadować pliki z naszego lokalnego komputera do Colab Env. Pobierz zbiory danych z Tutaj .

# Prześlij pliki house_train.csv i house_test.csv do Google Colab

# jeden po drugim.

z Google. i wsp import akta

akta. wgrywać ( )

Read_csv() to funkcja używana do ładowania danych CSV do zmiennej. Jako parametr przyjmuje nazwę pliku.

import pandy

# Załaduj plik house_train.csv do zmiennej train_data

dane_pociągu = pandy. czytaj_csv ( „houses_train.csv” )

# Załaduj plik house_test.csv do zmiennej test_data

dane testowe = pandy. czytaj_csv ( „test_domu.csv” )

# Zapisz test_data w zmiennej test_data1

dane_testowe1 = dane testowe

Przyjrzyjmy się liczbie kolumn i rekordów innych niż null w każdej kolumnie. Aby uzyskać te informacje, używana jest metoda Pandas.DataFrame.info().

wydrukować ( dane_pociągu. informacje ( ) )

wydrukować ( dane_testowe1. informacje ( ) )

Wyjście:

2. Wstępne przetwarzanie danych

W obu zbiorach danych kolumna „lot_size” zawiera wartości sqft i acre (rozbieżność można znaleźć, przeglądając wiersze w kolumnie „lot_size_unit”). Ale format powinien być w stopach kwadratowych. Musimy więc przekonwertować wartości w kolumnie „lot_size” z akra na stopę kwadratową. Podobnie należy to zrobić dla „test_data1”.

DataFrame.loc[] służy tutaj do znalezienia „lot_size_units” z „acre” i pomnożenia wartości występującej w „lot_size” przez 43560.

# Konwertuj wartości lot_size acre na stopy kwadratowe w train_data

dane_pociągu. miejsce [ ( dane_pociągu [ „lot_size_units” ] == 'akr' ) , 'wielkość partii' ] = dane_pociągu [ 'wielkość partii' ] * 43560

# Konwertuj wartości lot_size acre na stopy kwadratowe w test_data1

dane_testowe1. miejsce [ ( dane_testowe1 [ „lot_size_units” ] == 'akr' ) , 'wielkość partii' ] = dane_testowe1 [ 'wielkość partii' ] * 43560

wydrukować ( dane_pociągu. głowa ( ) )

wydrukować ( dane_testowe1. głowa ( ) )

Wyjście:

Teraz zobaczysz, że wszystkie wartości w kolumnie „lot_size” to wartości sqft.

W tej kolumnie widać brakujące wartości. Zastąpmy wartości NaN obecne w kolumnach średnią z tej samej kolumny w obu zbiorach danych.

DataFrame[„nazwa_kolumny”].fillna() służy do uzupełniania brakujących wartości średnią za pomocą funkcji mean(). DataFrame[„nazwa_kolumny”].mean() jest przekazywana jako parametr do funkcji finna(). Wyświetlmy średnią i zobaczmy teraz wynik:

# Wypełnij brakujące wartości w kolumnie lot_size średnią istniejących wartości

dane_pociągu [ 'wielkość partii' ] = dane_pociągu [ 'wielkość partii' ] . czuć ( dane_pociągu [ 'wielkość partii' ] . mieć na myśli ( ) )

# Wyświetlanie średniej

wydrukować ( „Dane pociągu Wartość średnia: „ , dane_pociągu [ 'wielkość partii' ] . mieć na myśli ( ) )

wydrukować ( tylko ( dane_pociągu [ 'wielkość partii' ] ) )

# Wypełnij brakujące wartości w kolumnie lot_size średnią istniejących wartości

dane_testowe1 [ 'wielkość partii' ] = dane_testowe1 [ 'wielkość partii' ] . czuć ( dane_testowe1 [ 'wielkość partii' ] . mieć na myśli ( ) )

# Wyświetlanie średniej

wydrukować ( „Dane testowe Wartość średnia: „ , dane_testowe1 [ 'wielkość partii' ] . mieć na myśli ( ) )

wydrukować ( tylko ( dane_testowe1 [ 'wielkość partii' ] ) )

Wyjście:

Brakujące wartości występujące w kolumnie „lot_size” Zestaw danych pociągu są zastępowane średnią wartością 18789,95194, a brakujące wartości obecne w kolumnie „lot_size” Testowy zestaw danych są zastępowane średnią wartością 8961,0

3. Czyszczenie danych

Podczas uczenia modelu istnieją pewne niepotrzebne atrybuty, które nie są wymagane do przewidzenia wyniku. W naszym przypadku istnieją trzy atrybuty: „lot_size_units”, „zip_code” i „size_units”, które należy usunąć z obu zbiorów danych. Funkcja pandas.DataFrame.drop() służy do usuwania tych trzech kolumn z obu zbiorów danych.

dane_pociągu = dane_pociągu. upuszczać ( [ „lot_size_units” , 'kod pocztowy' , „jednostki_rozmiaru” ] , = 1 )

dane_testowe1 = dane_testowe1. upuszczać ( [ „lot_size_units” , 'kod pocztowy' , „jednostki_rozmiaru” ] , = 1 )

wydrukować ( dane_pociągu. informacje ( ) )

wydrukować ( dane_testowe1. informacje ( ) )

Wyjście:

Obecnie zbiory danych są w dobrym stanie. Niepotrzebne kolumny są usuwane, a brakujące wartości nie istnieją.

4. Wizualizacja danych

Utwórzmy histogram dla kolumn danych Train. Funkcja pandas.DataFrame.hist() służy do generowania histogramów dla wszystkich atrybutów.

dane_pociągu. historia ( rozmiar fig = ( 4 , 9 ) )

Wyjście:

Histogram jest generowany dla kolumn łóżek, wanien, rozmiaru, rozmiaru_lotu i ceny dla danych pociągu.

Utwórzmy korelację dla wszystkich pól względem siebie. Do wykreślenia skorelowanych wartości wykorzystywany jest moduł Plotly.express.

import intrygująco. wyrazić

kor = dane_pociągu. kor ( )

# Narysuj skorelowane dane

widok_rys = intrygująco. wyrazić . pokażę ( kor , tekst_auto = PRAWDA )

# Wyświetlacz

widok_rys. pokazywać ( )

Wyjście:

  1. Łóżka są skorelowane z ceną 0,2935, z wielkością partii -0,059, z wielkością 0,77 i z wanną 0,65.
  2. Wanny są skorelowane z ceną 0,3173, z wielkością partii -0,054, z kąpielami 0,667 i z łóżkami 0,771.
  3. Wielkość jest 0,444 skorelowana z ceną, -0,044 skorelowana z wielkością partii, 0,667 skorelowana z wielkością i 0,652 skorelowana z łóżkami.

5. Przygotowanie modelu

Musimy ustawić cenę jako docelową, usuwając ją z train_data. Upewnij się, że atrybuty obecne w danych uczenia i testowania powinny być takie same na tym etapie.

cel = dane_pociągu [ 'cena' ]

dane_pociągu = dane_pociągu. upuszczać ( [ 'cena' ] , = 1 )

wydrukować ( dane_pociągu. informacje ( ) )

wydrukować ( dane_testowe1. informacje ( ) )

Wyjście:

Istnieją teraz cztery niezależne atrybuty (łóżka, wanny, rozmiar i rozmiar_lotu), a cena jest atrybutem zależnym, który zależy od tych czterech atrybutów.

6. Trenowanie modelu

Najpierw stosujemy algorytm RandomForestRegressor. Zaimportuj go z pakietu „sklearn.ensemble”. Jest to technika zespołowa.

  1. Utwórz model na podstawie metody RandomForestRegressor(). Do tego modelu nie przekazujemy żadnego parametru. Zatem liczba drzew decyzyjnych domyślnie wynosi 100.
  2. Aby dopasować model, użyj metody fit(). Przyjmuje dwa parametry. Pierwszy parametr to atrybuty zależne, a drugi parametr to etykieta/cel klasy.
  3. Aby sprawdzić dokładność modelu, użyj metody score(). Przyjmuje również te same parametry, co metoda fit().
z nauczyli ensemble import RandomForestRegressor

# Zdefiniuj model

model1 = RandomForestRegressor ( )

# Dopasuj model

model1. pasować ( dane_pociągu , cel )

# Dokładność modelu

wydrukować ( model1. wynik ( dane_pociągu , cel ) * 100 )

Wyjście:

86.08400889419033

7. Przetestuj model i zapisz wyniki

To ostatni krok, w którym musimy przewidzieć wynik i zapisać go.

  1. Metoda przewidywania() służy do przewidywania danych testowych. Jest używany z modelem i pobiera zagnieżdżoną listę wartości/ramkę danych.
  2. Użyj metody to_csv(), aby zapisać wyniki w pliku CSV.
  3. Pobierz plik ze środowiska Python (Google Colab).
# Przewiduj test_data1 za pomocą modelu1.

dane testowe [ 'Cena' ] = model1. przewidywać ( dane_testowe1 )

# Zapisz dane_testowe w pliku test_results.csv

dane testowe. to_csv ( „test_wyniki.csv” )

# Pobierz ten plik z Colab

akta. pobierać ( „test_wyniki.csv” )

Wyjście:

Pokażmy 20 rekordów z 505 rekordów. Jak widać, kolumna Cena zawiera przewidywane wartości dla każdego domu.

Inne modele

Przewidujmy domy za pomocą DecisionTreeRegressor. Możesz go zaimportować z modułu „sklearn.tree”.

z nauczyli drzewo import Regresor drzewa decyzyjnego

# Zdefiniuj model

model2 = Regresor drzewa decyzyjnego ( )

# Dopasuj model

model2. pasować ( dane_pociągu , cel )

# Dokładność modelu

wydrukować ( model2. wynik ( dane_pociągu , cel ) * 100 )

# Przewiduj test_data1 za pomocą modelu1.

dane testowe [ 'Cena' ] = model2. przewidywać ( dane_testowe1 )

# Zapisz dane_testowe w pliku test_results.csv

dane testowe. to_csv ( „test_wyniki.csv” )

# Pobierz ten plik z Colab

akta. pobierać ( „test_wyniki.csv” )

Wyjście:

99,94183165335028

Przewidywany wynik można zobaczyć tutaj:

Przewidujmy domy za pomocą LinearrEgression. Zaimportuj model z modułu „sklearn.linear_model”.

z nauczyli model_liniowy import Regresja liniowa

# Zdefiniuj model

model3 = Regresja liniowa ( )

# Dopasuj model

model3. pasować ( dane_pociągu , cel )

# Przewiduj test_data1 za pomocą modelu1.

dane testowe [ 'Cena' ] = model3. przewidywać ( dane_testowe1 )

# Zapisz dane_testowe w pliku test_results.csv

dane testowe. to_csv ( „test_wyniki.csv” )

# Pobierz ten plik z Colab

akta. pobierać ( „test_wyniki.csv” )

Przewidywany wynik można zobaczyć tutaj:

Wniosek

Teraz możesz przewidzieć cenę domu na podstawie takich atrybutów, jak liczba pokoi, powierzchnia działki itp. W tym przewodniku uwzględniliśmy rzeczywiste dane dotyczące domów z Seattle w stanie Waszyngton. Korzystając z technik regresji, takich jak regresja liniowa, drzewo decyzyjne i losowy las, przewidzieliśmy cenę 505 domów. Wszystkie kroki (wstępne przetwarzanie danych, czyszczenie danych i wizualizacja danych), które należy wykonać przed szkoleniem modelu, są wyjaśnione krok po kroku za pomocą fragmentów kodu i wyników.