Dự đoán giá nhà python

Dự đoán giá nhà bằng mô hình hồi quy tuyến tính [Linear Regression]

Chào các bạn!

Hôm nay mình làm bài tập thực hành về dự đoán giá nhà qua các dữ liệu thu thập là một bảng dữ liệu csv lưu các thông tin cần thiết như: diện tích nhà, diện tích phòng, thu nhập khu vực, tuổi ngôi nhà…

Sử dụng mô hình máy học Linear Regression [Mô hình hồi quy tuyến tính]

Phân tích dữ liệu Dataset

Nào chúng ta bắt đầu phân tích bảng dữ liệu của chúng ta nhé.

Trước tiên chúng ta import thư viện cần dùng:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

Trên đây là các thư viện thường xuyên sử dụng để xử lý, phân tích và trực quan dữ liệu

sau đó mình load file dataset đã lưu ở google drive, mình kết nối google drive vào colab để truy cập dataset này nhé!

USAhousing = pd.read_csv['/content/drive/MyDrive/Udemy_Py_DS_ML_Bootcamp-master/11-Linear-Regression/USA_Housing.csv']

USAhousing.head[]

Tìm hiểu Dataset trên

Trước khi bắt đầu phân tích một dataset, ta phải tìm hiểu thông tin về dataset đó, ý nghĩa nội dung các cột, dòng. Thường là các thông tin này được đính kèm bổ sung khi ta được cung cấp dữ liệu từ 1 công ty, doanh nghiệp hoặc các nguồn cung cấp khác như kaggle.

  • Avg. Area Income: Thu nhập trung bình tại khu vực ngôi nhà đã bán
  • Avg. Area House Age: Trung bình tuổi của một ngôi nhà đã bán
  • Avg. Area Number of Rooms: Trung bình diện tích các phòng
  • Avg. Area Number of Bedrooms: Trung bình diện tích phòng ngủ
  • Area Population: Dân số tại khu vực bán nhà
  • Price: Giá ngôi nhà đã bán
  • Address: Địa chỉ ngôi nhà bán

Xem thông tin tổng quát về dataset

USAhousing.info[]

Dữ liệu trên ta có 5000 dòng tương ứng với dữ liệu 5000 ngôi nhà được bán, Với dữ liệu này ta đủ để xây dựng một mô hình máy học dự đoán giá nhà nằm trong các khu vực trên

Giờ ta xem trực quan vể dữ liệu phân bố bằng Seaborn

sns.pairplot[USAhousing]

Về tương quan giữa các cột, ta thấy Cột Price có kiểu phân tán theo mô hình tuyến tính, dựa trên thông tin này, ta xây dựng mô hình máy học hồi quy tuyến tính để dự đoán nó dựa trên giá trị các cột khác, trừ cột địa chỉ [Address] ngôi nhà.

Giờ ta xem qua biểu đồ phân phối giá ngôi nhà

sns.set_style["whitegrid"]
sns.distplot[USAhousing['Price'], kde = False, rug = "True"]

Ta thấy giá các ngôi nhà đã bán thường tập trung ở mức giá 500.000 đến 2.000.000 USD, và nhiều nhất là 800.000 đến 1.700.000 USD

Kiểm tra độ tương quan giữa các cột bằng bản đồ nhiệt

plt.figure[figsize=[18,5]]
sns.heatmap[df.corr[], annot=True, lw = 1, linecolor="r",cmap="coolwarm"]

Qua đó, ta phân tích được các cột có giá trị tương quan như như thế nào với nhau. Về cơ bản, cột giá [price] có chút tương quan với các cột còn lại nhiều nhất, chứng tỏ các yếu tố đó có tác động ít nhiều lên giá nhà.

Ok! ta đã phân tích sơ qua về bảng dữ liệu của chúng ta, đây là một dataset tương đối đơn giản, các hàng và cột không cá giá trị null nên ta không cần xử lý.

Xây dựng mô hình dự đoán bằng thư viện Scikit – Learn

Phân tách dữ liệu thành train và test

Bây giờ chúng ta hãy bắt đầu đào tạo mô hình hồi quy. Trước tiên, chúng ta sẽ cần tách dữ liệu của mình thành một mảng X chứa các tính năng cần đào tạo [các biến độc lập] và một mảng y với biến mục tiêu [biến phụ thuộc], trong trường hợp này là cột Giá. Chúng ta sẽ loại bỏ cột Địa chỉ vì nó chỉ có thông tin văn bản mà mô hình hồi quy tuyến tính không thể sử dụng

X = USAhousing[['Avg. Area Income', 'Avg. Area House Age', 'Avg. Area Number of Rooms',
               'Avg. Area Number of Bedrooms', 'Area Population']]
y = USAhousing['Price']

Giờ ta đã có hai biến X, y theo yêu cầu của mô hình, hai biến này dựa trên dữ liệu là dataset ta có được để đào tạo mô hình

Giờ là ta tách các biến trên thành giá trị train và test, hai giá trị này chúng ta sẽ luôn gặp và sử dụng trong qua trình xây dựng mô hình máy học

Đầu tiên, ta từ thư viện Scikti – Learn model_selection ta import train_test_split, phương thức này giúp ta tạo ra dữ liệu dùng để train và test mô hình

from sklearn.model_selection import train_test_split

Sau đó ta tạo 4 biến, gồm X_train, y_train và X_test, y_test

X_train, X_test, y_train, y_test = train_test_split[X, y, test_size=0.4, random_state=101]

Với đối số truyền vào là giá trị X, y ta đã lấy từ dữ liệu bên trên, test_size trả về cho ta phần trăm dữ liệu được chia, ví dụ 0.4 tương ứng với dữ liệu được chia thành 40% giá trị là test, còn lại là dữ liệu train. random_state bằng một số tương ứng nào đó để đảm bảo mỗi lần ta chạy lại mô hình, giá trị phân tách ngẫu nhiên nhận được là giống nhau, bạn có thể cho số nào bất kỳ, không quan trọng nhé.

Nào, giờ ta xem qua dữ liệu trai và test ta vừa tạo

print[X_train]

print[y_train]

Dữ liệu trên có 5000 dòng, ta phân tách ngẫu nhiên ra với dữ liệu test là 40%, còn 60% là dữ liệu train tương ứng 3000 dòng, tương ứng dữ liệu test còn 2000 dòng

print[X_test]

Tạo model và training Linear Regression

Từ thư viện Scikit – Learn , linear_model import module LinearRegression

from sklearn.linear_model import LinearRegression
lm = LinearRegression[]

Tiến hành train dữ liệu bằng phương thức fit[]

lm.fit[X_train,y_train]

Kết quả trả về là một hàm LinearRegression[], chứng tỏ mô hình đã train xong

Dự đoán và đánh giá mô hình

Để dự đoán và kiểm tra mô hình, ta sử dụng dữ liệu test bên trên mà ta đã tách ra. Trong đó, X_test là các tính năng mà mô hình chưa biết, y_test là kết quả biết trước để ta so sánh với kết quả dự đoán từ X_test.

Lấy kết quả dự đoán từ X_test, ta dùng phương thức predict[] truyền đối số X_test vào

predictions = lm.predict[X_test]
print[predictions]

Kết quả dự đoán bên trên là một mảng trong numpy chứa kết quả dự đoán từ giá trị X_test, để kiểm tra kết quả dự đoán [predictions] và kết quả ban đầu [y_test] xem mô hình ta như thế nào? ta có thể trực quan quan sát bằng biểu đồ.

  1. Sử dụng biểu đồ phân tán [scatter] truyền vào 2 giá trị trên vào để quan sát
plt.scatter[y_test,predictions]

2.  Sử dụng biểu đồ cufflinks để trực quan hơn

import cufflinks as cf 
cf.go_offline[]
import plotly.io as pio
pio.renderers.default = "colab"
pd.DataFrame[{"Giá dự đoán":predictions, "Giá ban đầu": y_test}].iplot[mode="markers"]

Nhìn trực quan bên trên ta thấy giữa giá dự đoán [màu cam] và giá ban đầu [màu xanh dương] có 1 sự chênh lệnh. Tùy theo độ chính xác mô hình, nếu độ chính xác mô hình càng cao thì độ chênh lệch các điểm trên biểu đồ càng ít lại.

Để trực quan độ chênh lệch bằng biểu đồ, ta dùng vẽ đồ thị distplot[] trong Seaborn và tìm hiểu sự phân phối của độ chênh lệch này.

sns.distplot[y_test - predictions]

Nhìn vào biểu đồ trên, bạn thấy giá trị chênh lệch giữa giá dự đoán [predictions] và giá trị thực tế ban đầu [y_test], phân bố tập trung ở 0 và trên dưới 100.000 USD, chứng tỏ mô hình của chúng ta có độ chính xác tương đối cao và hợp lý khi kết quả dự đoán và kết quả ban đầu có sự chênh lêch thấp và phần lớn dao động trong khoảng + [-] 10%.

Nhưng nhìn vào biểu đồ trên, nó không cho ta biết được các giá trị cụ thể mà chỉ dựa trên phán đoán trực quan tổng thể. Bây giờ, ta hãy tìm số liệu cụ thể để có cái nhìn chính xác hơn dựa trên số liệu phân tích. Ta dựa vào chỉ số đánh giá hồi quy

Các chỉ số đánh giá mô hình hồi quy

Bài toán Regression – hồi quy tức là biến yy của chúng ta không phải là một giá trị rời rạc mà là một giá trị liên tục. Nó thường là số lượng, giá tiền, nhiệt độ, lượng mưa … Do nó là giá trị liên tục nên chúng ta hoàn toàn không thể sử dụng độ chính xác để đo performance của mô hình được mà cần phải dùng một số loại độ đo khác.

Chúng ta có ba chỉ số đánh giá hồi quy để có số liệu chính xác

Mean Absolute Error [MAE]: MAE là một phương pháp đo lường sự khác biệt [độ chênh lệch giá trị] giữa hai biến liên tục. Giả sử rằng X và Y là hai biến liên tục thể hiện kết quả dự đoán của mô hình và kết quả thực tế, đây là chỉ số dễ hiểu nhất, vì đó là giá trị chênh lệch trung bình và được xác định bằng công thức:

Mean Squared Error [MSE]: là giá trị trung bình của bình phương sai số [Hàm mất mát], là sự khác biệt giữa các giá trị được mô hình dự đoán và gía trị thực. MSE  cũng được gọi là một hàm rủi ro, tương ứng với giá trị kỳ vọng của sự mất mát sai số bình phương hoặc mất mát bậc hai chỉ số này phổ biến hơn chỉ số MAE bên trên,  được xác định bằng công thức:

Root Mean Squared Error [RMSE]: là căn bậc hai của giá trị trung bình của các sai số bình phương [MSE]. Thông thường, ta thường dùng chỉ số này để xác định giá trị chênh lệch trung bình giữa giá dự đoán và giá trị test ban đầu, được xác định bằng công thức:

Qua các công thức bên trên ta thấy rườm rà khó hiểu, nhưng mọi thứ đơn giản hơn khi ta sử dụng thư viện Scikit – Learn để tìm ra các chỉ số này

Đầu tiên, các bạn import metrics từ sklearn

from sklearn import metrics

ta lấy các chỉ số trên bằng cú pháp sau:

print['MAE:', metrics.mean_absolute_error[y_test, predictions]]
print['MSE:', metrics.mean_squared_error[y_test, predictions]]
print['RMSE:', np.sqrt[metrics.mean_squared_error[y_test, predictions]]]

Ta thấy, sử dụng chỉ số RMSE, cho thấy giá trị chênh lệch trung bình của giá dự đoán từ mô hình và giá trị thực tế là 102.278 USD.

Giờ ta kiểm tra độ chính xác mô hình trên dựa trên phương sai

metrics.explained_variance_score[y_test, predictions]

Giá trị trả về tốt nhất cho mô hình là 1, vậy với mô hình trên, giá trị trả về đạt 0.91, tương ứng với 91% hiệu quả của mô hình đào tạo. Thật tuyệt đúng ko các bạn.

Lưu ý: Vì đầu ra dự đoán là biến liên tục, không phải biến rời rạc, nên độ chính xác của mô hình được tính trên giá trị chênh lệch giữa giá trị đầu vào dự đoán và giá trị đầu ra dự đoán [phương sai].

Hệ số coeff 

Để đánh giá sực tác động của các tính năng [ các biến độc lập] lên kết quả đầu ra [biến phụ thuộc], ta sử dụng hệ số Coeff. Hệ số này cho ta biết khi giá trị biến độc lập thay đổi 1 đơn vị, thì giá trị đầu ra sẽ thay đổi như thế nào.

print[lm.coef_]

Để hiểu được các giá trị này ta sử dụng cách sau.

coeff_df = pd.DataFrame[lm.coef_,X.columns,columns=['Coefficient']]
coeff_df

Diễn giải các hệ số trên:

Giữ tất cả các tính năng khác không thay đổi, khi tăng 1 đơn vị trong Cột: Avg. Area Income thì sẽ tăng $ 21,52 trong giá nhà

Giữ tất cả các tính năng khác không thay đổi, khi tăng 1 đơn vị trong Cột: Avg. Area House Age thì sẽ tăng $164883.28 trong giá nhà

Giữ tất cả các tính năng khác không thay đổi, khi tăng 1 đơn vị trong Cột: Avg. Area Number of Rooms thì sẽ tăng $122368.67 trong giá nhà

Giữ tất cả các tính năng khác không thay đổi, khi tăng 1 đơn vị trong Cột: Avg. Area Number of Bedrooms  thì sẽ tăng $2233.80  trong giá nhà

Giữ tất cả các tính năng khác không thay đổi, khi tăng 1 đơn vị trong Cột: Area Population thì sẽ tăng $15.15 trong giá nhà

Đến đây ta đã cơ bản xong phần xây dựng và đánh giá mô hình máy học machine learning sử dụng thuật toán linear regression. Các bạn hãy qua phần thực hành để nắm rõ cú pháp, cách sử dụng thư viện và kỹ năng phân tích dữ liệu nhé.

Phần Thực hành

Để dự đoán giá nhà thực tế dựa trên mô hình trên, các bạn hãy tạo một Data Fram chứa các tính năng cần đưa vào tương tự như X_test, sau đó lấy giá trị dự đoán ra và phân tích nhé.

Lưu ý, Mô hình xây dựng dự đoán giá nhà này chỉ áp dụng cho từng mô hình xây dựng, chúng ta không thể dùng model này đi dự đoán giá nhà ở Việt Nam với các số liệu khác nhau. Muốn dự đoán giá nhà ở Việt Nam, ta cần phải có một Dataset chứa các số liệu nhà đất Việt Nam và tiến hành các bước xây dựng như trên.

Download file thực hành bài học này

Chủ Đề